React Router 6 useParams() 没有返回最新的路径参数
React Router 6 useParams() is not returning the most recent path param
我在遵循此 guide 之后在 React 路由器 6 中练习递归路由,并且 useParams 函数给了我一些奇怪的行为。每次我 link 到一个新组件时它都会被多次调用 - 通常它是未定义的,通常它不是 return 最新的路径参数。例如,如果我的 path/is/this,它是 returning "is."
getItems() 函数只是 return 一些 json 表示我正在解析的文件树结构,我需要来自 useParams 的可靠 return。
这是我的 app.js:
export function Folder() {
const { dirName } = useParams();
const {name, items} = getItems(dirName);
return (
<div>
<h1>{name}</h1>
<ul>
{items.filter((dir) => dir.type ==="dir").map(({ name, type }) => (
<li key={name}>
<Link to={name}>{name}, {type}</Link>
</li>
))}
</ul>
<Routes>
<Route path={`:dirName/*`} element={<Folder />} />
</Routes>
</div>
);
};
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Navigate to="/first" />} />
<Route path="/:dirName/*" element={<Folder />} />
</Routes>
</Router>
);
}
export default App;
我认为与其使用此 getItems
实用程序根据 dirName
路由参数计算 directory
对象条目,不如更改递归呈现 Folder
的方式将当前条目作为道具传递的组件。
示例:
function Folder({ data }) {
const { dirName } = useParams();
console.log({ dirName });
return (
<>
<h1>{data.name}</h1> // <-- same as dirName
<ul>
{data.items.map((item) => (
<li key={item.name}>
{item.type === "file" && (
<>
{item.name}, {item.size}
</>
)}
{item.type === "dir" && (
<>
<Link to={item.name}>
{item.name}, {item.type}
</Link>
<Routes>
<Route path=":dirName/*" element={<Folder data={item} />} />
</Routes>
</>
)}
</li>
))}
</ul>
</>
);
}
为初始路线播种。
<Routes>
<Route path="/*" element={<Navigate to="/top" />} />
<Route path="/:dirName/*" element={<Folder data={directory[0]} />} />
</Routes>
我在遵循此 guide 之后在 React 路由器 6 中练习递归路由,并且 useParams 函数给了我一些奇怪的行为。每次我 link 到一个新组件时它都会被多次调用 - 通常它是未定义的,通常它不是 return 最新的路径参数。例如,如果我的 path/is/this,它是 returning "is."
getItems() 函数只是 return 一些 json 表示我正在解析的文件树结构,我需要来自 useParams 的可靠 return。
这是我的 app.js:
export function Folder() {
const { dirName } = useParams();
const {name, items} = getItems(dirName);
return (
<div>
<h1>{name}</h1>
<ul>
{items.filter((dir) => dir.type ==="dir").map(({ name, type }) => (
<li key={name}>
<Link to={name}>{name}, {type}</Link>
</li>
))}
</ul>
<Routes>
<Route path={`:dirName/*`} element={<Folder />} />
</Routes>
</div>
);
};
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Navigate to="/first" />} />
<Route path="/:dirName/*" element={<Folder />} />
</Routes>
</Router>
);
}
export default App;
我认为与其使用此 getItems
实用程序根据 dirName
路由参数计算 directory
对象条目,不如更改递归呈现 Folder
的方式将当前条目作为道具传递的组件。
示例:
function Folder({ data }) {
const { dirName } = useParams();
console.log({ dirName });
return (
<>
<h1>{data.name}</h1> // <-- same as dirName
<ul>
{data.items.map((item) => (
<li key={item.name}>
{item.type === "file" && (
<>
{item.name}, {item.size}
</>
)}
{item.type === "dir" && (
<>
<Link to={item.name}>
{item.name}, {item.type}
</Link>
<Routes>
<Route path=":dirName/*" element={<Folder data={item} />} />
</Routes>
</>
)}
</li>
))}
</ul>
</>
);
}
为初始路线播种。
<Routes>
<Route path="/*" element={<Navigate to="/top" />} />
<Route path="/:dirName/*" element={<Folder data={directory[0]} />} />
</Routes>