我根据react-router-dom网站上的教程创建了一个reactJS + RRD的简单实现,一旦我从他们的文档中获得了一个工作版本,我就修改了哈希路由的实现。在main.js中的代码如下所示:
import React from 'react';
import ReactDOM from 'react-dom/client';
import {
createHashRouter,
createBrowserRouter,
RouterProvider,
} from "react-router-dom";
const routes = [
{
path: '/',
element: <div>Hello world!</div>,
}
];
const router = createHashRouter(routes, {
basename: 'transfers'
}
);
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
);
看起来很简单
我从www.example.com的URL访问该应用程序https://www.localenv.dev/react#transfers
下面是我的package.json:
{
"dependencies": {
"@reduxjs/toolkit": "1.9.2",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "13.4.0",
"@testing-library/user-event": "13.5.0",
"axios": "1.3.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "8.0.5",
"react-router-dom": "6.11.2",
"react-scripts": "5.0.1",
"storybook-addon-pseudo-states": "2.0.1",
"web-vitals": "2.1.4"
},
"scripts": {
"predev": "node predev.js",
"dev": "webpack --mode=development",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest",
"plugin:storybook/recommended"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"devDependencies": {
"@babel/preset-react": "7.18.6",
"@storybook/addon-essentials": "7.0.12",
"@storybook/addon-interactions": "7.0.12",
"@storybook/addon-links": "7.0.12",
"@storybook/blocks": "7.0.12",
"@storybook/preset-create-react-app": "7.0.12",
"@storybook/react": "7.0.12",
"@storybook/react-webpack5": "7.0.12",
"@storybook/testing-library": "0.0.14-next.2",
"babel-plugin-named-exports-order": "0.0.2",
"copy-webpack-plugin": "11.0.0",
"css-loader": "6.7.3",
"eslint-plugin-storybook": "0.6.12",
"html-webpack-plugin": "5.5.0",
"prop-types": "15.8.1",
"storybook": "7.0.12",
"webpack": "5.75.0",
"webpack-cli": "5.0.1"
}
}
当访问实现了RRD的页面时,我会收到以下控制台消息:<Router basename="/transfers"> is not able to match the URL "transfers" because it does not start with the basename, so the <Router> won't render anything.
我可以做些什么来解决这个问题?
我尝试修改“basename”的值,将“path”修改为显式的URL值和catch-all(“/”和“”)值,通过使用createBrowserRouter()测试其他故障点并验证了在使用“path”的catch-all值时这是有效的,并深入研究了文档(https://reactrouter.com/en/main/routers/create-hash-router)以获取其他props传递给createHashRouter()。
1条答案
按热度按时间q5lcpyga1#
简短的回答是RRD不支持哈希模式的配置。它需要一个严格的哈希结构
#/
。如果添加一个basename属性,则强制执行的结构采用#/basename
的形式。RRD中没有使用#basename/
这样的结构的解决方法。更多详情请参见注解。