Добрый день, Не могли бы вы помочь мне с моей проблемой с вложенным элементом react-router v6, в частности, с дочерним элементом?
Допустим, у меня есть эта маршрутизация
<Routes>
<Route path = "customer" element = {<CustomerIndex />} >
<Route path = ":customeId" element = {<CustomerDetail />} />
<Route path = "create" element = {<CustomerForm />} />
</Route>
</Routes>
И компонент "CustomerIndex"
function CustomerPage(){
const {customerId} = useParams();
return (
<>
//.....Bla bla bla index table etc etc etc end of thinking capacity
<ComponentToDisplayModal display = {Boolean(customerId)} >
<Outlet />
</ComponentToDisplayModal>
</>
);
}
Теперь, если я перейду к "/customer/3", CustomerIndex отобразит модальный компонент (display=true) и потому, что константа "customerId" определяется параметром useParams.
Но если бы я хотел показать компонент «CustomerForm», перейдя к «/customer/create», конечно, «ComponentToDisplayModal» не будет отображаться, потому что идентификатор клиента равен нулю.
Так что, конечно, я хотел бы иметь это вместо
const display = Boolean(customerId) || isAnyChildPath;
.....
<ComponentToDisplayModal {...{display}}>
Теперь, как я могу установить для константы «isAnyChildPath» значение «TRUE», если путь «/customer/*», и «FALSE», если путь «/customer», или, может быть, проверить, вернет ли компонент (например, «/ клиент/создать", "/клиент/4") или нет ("/клиент")?
Пока я просто использую ручной метод
const location = useLocation();
const display = Boolean(customerId) || location.pathname === "/customer/create"
Но я хотел бы узнать, существует ли более элегантный метод на случай, если в будущем мне понадобится добавить несколько других статических дочерних элементов.
Большое тебе спасибо.
Я думаю, вы могли бы немного упростить проверку дочернего маршрута, используя хук useMatch
и проверяя, соответствует ли текущий путь какому-либо дочернему маршруту, вместо того, чтобы проверять какие-либо параметры пути маршрута.
declare function useMatch<ParamKey extends string = string>( pattern: PathPattern | string ): PathMatch<ParamKey> | null;
Returns match data about a route at the given path relative to the current location.
Идея состоит в том, что когда маршрут совпадает, возвращается определенный объект совпадения, в противном случае возвращается null
для несоответствий.
"/customer/:path"
может соответствовать как "/customer/:id"
, так и "/customer/create"
.
Пример:
function CustomerPage(){
const isMatch = useMatch("/customer/:path");
return (
<>
//.....Bla bla bla index table etc etc etc end of thinking capacity
<ComponentToDisplayModal display = {Boolean(isMatch)} >
<Outlet />
</ComponentToDisplayModal>
</>
);
}