Пользовательские маршруты с defineRoutes
Есть ли у кого-нибудь дополнительная информация о функции defineRoutes в remix.config?
У меня есть этот маршрут:
{
"id": "routes/__main/city/$city", "path": "/city/:city",
"file":"routes/__main/city/$city.tsx"
}
и в defineRoutes я сделал что-то вроде этого:
routes: async (defineRoutes) => {
return defineRoutes((route) => {
route("/citta/:city", "routes/__main/city/$city.tsx");
});
},
Я хочу, чтобы и /citta/test, и /city/test находились в одном и том же файле, расположенном здесь.
routes/__main/city/$city.tsx
.
Но когда я запускаю код, активен только маршрут /citta/test, другой /city/test выдает ошибку.
Как я прочитал из документации здесь https://remix.run/docs/en/v1/api/conventions#routes , то, чего я хочу добиться, должно быть возможным.
Я неправильно понял использование defineRoutes?
2 ответа
Это можно решить без использования
defineRoutes
. Верните свой
remix.config
изменения и позвольте Remix выполнить маршрутизацию за вас, поместив ваши маршруты в
app/routes
.
Шаг
routes/__main/city/$city.tsx
в твоей
app
каталог и добавить дополнительную структуру папок. Итак, у вас есть две папки
/city
а также
/citta
рядом друг с другом. Они будут совместно использовать всю вложенную маршрутизацию, которую вы представили с помощью
__main
.
Экспортируйте следующее из вашего
app/routes/__main/citta/$city.tsx
файл:
import CityComponent from '~/routes/__main/city/$city';
// re-export loader, action, and all other functionality
export * from '~/routes/__main/city/$city'
// re-use the default export from your other route
export default CityComponent;
Это позволяет повторно использовать код из вашего
city/$city.tsx
файл в
citta/$city.tsx
.
Примечание. Обязательно укажите имена обоих файлов в
citta/
а также
city/
$city.tsx
во избежание разночтений в именах. В противном случае ваш повторно экспортированный загрузчик и действие не будут работать, так как имя параметра отличается.
Недавно я попытался разместить весь свой код в модулях и повторно экспортировать компоненты страницы изapp/routes
так:
import LoginPage, from "~/modules/auth/LoginPage";
export * from "~/modules/auth/LoginPage";
export default LoginPage;
но я столкнулся с проблемами гидратации React 18. Рабочее решение для меня было реэкспортировать следующим образом:
import LoginPage, { action, loader } from "~/modules/auth/LoginPage";
export { action, loader };
export default LoginPage;