我想传递一个数组作为react-router-dom
参数,如下所示:
website.com/[a,b,c]/
当我直接在搜索栏中输入this并使用以下代码将其转换为数组时,它就可以工作:
JSON.parse(arrayParam)
然后我可以把它作为数组使用。
问题是,当我向某人发送上述链接时,链接变成了:
website.com/%5ba,b,c%5d/
它就停止工作了我尝试了以下方法:将数组作为website.com/a,b,c
传递,并使用
arrayParam.split(',')
不会变成数组
我尝试使用以下代码解码URI website.com/%5ba,b,c%5d
:
const decodedArrayParam = decodeURI(arrayParam);
const myArray = JSON.parse(decodedArrayParam);
console.log(myArray);
which console logs undefined
当我对','进行编码时也会发生同样的情况:https://example.com/my-page/%5B1%2C2%2C3%5D/
或使用decodeURIComponent'代替时 这也是同样的错误。我尝试先使用
toString`解析URI参数,但没有成功。
有什么解决方案或变通办法可以实现同样的目标吗?或者有什么方法可以防止原始链接发生变化?
在我的app.js中,我有:
<Router>
<Routes>
<Route
path={`/:arrayParam`}
element={<Main className=
{styles.main} />}
/>
</Routes>
</Router>
在main.js中,我用website.com/[1,2,3]/
的常规方法:
import {useParams, useSearchParams} from 'react-router-dom';
const RouterParams = useParams()
const myArray = JSON.parse(RouterParams.arrayParam);
这是工作的,可以使用数组
对于website.com/1,2,3/
的分裂方法
import {useParams, useSearchParams} from 'react-router-dom';
const RouterParams = useParams()
const myArray = (RouterParams.arrayParam).split(',');
console.log(myArray)
这不起作用,给出undefined。
或者,对于使用website.com/%5Ba%2Cb%2Cc%5D/
或website.com/%5Ba,b,c%5D/
的URL解码
import {useParams, useSearchParams} from 'react-router-dom';
const RouterParams = useParams()
const myArrayParam = (RouterParams.arrayParam)
const decodedArrayParam = decodeURIComponent(myArrayParam);
const myArray = JSON.parse(decodedArrayParam);
console.log(myArray)
这也给出了undefined
我在main.js中也有以下内容,以防止用户返回到上一页。不知何故,这阻止了我使用常规的URL参数,因为它们会立即被删除
useEffect(() => {
window.history.pushState(null, null, window.location.pathname);
window.addEventListener('popstate', onBackButtonEvent);
return () => {
window.removeEventListener('popstate', onBackButtonEvent);
};
}, []);
// Alert a warning if people try to go back to previous page
const onBackButtonEvent = (e) => {
e.preventDefault();
if (!finishStatus) {
if (window.confirm(
"You cannot go back to a previous page, \
Please close the window if you wish to exit")
) {
setfinishStatus(true)
// your logic
} else {
window.history.pushState(null, null,
window.location.pathname);
setfinishStatus(false)
}
}
}
2条答案
按热度按时间63lcw9qa1#
一个很好的解决方法是尝试使用
window
的atob
和btoa
方法。比如说
将此数组作为URL中的参数传递,
为了得到另一边的精确数组,
希望这能帮上忙。
vfh0ocws2#
你可以使用query-string来实现