javascript 如何将数组包含为react-router-dom参数?

vdzxcuhz  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(131)

我想传递一个数组作为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)
            }
        }
    }
63lcw9qa

63lcw9qa1#

一个很好的解决方法是尝试使用windowatobbtoa方法。
比如说
将此数组作为URL中的参数传递,

arrayParam = ['a', 'b', 'c'];
console.log(window.btoa(['a', 'b', 'c'])); // YSxiLGM=

为了得到另一边的精确数组,

window.atob("YSxiLGM").split(",");  // ['a', 'b', 'c']

希望这能帮上忙。

相关问题