React路由,Link和NavLink的state属性,如何解传递使用?
发布于 作者:苏南大叔 来源:程序如此灵动~本文说的是ReactRouter
里面的链接(Link
、NavLink
)组件,所传递的state
,是属于pushState
事件里面的state
。并不是react
组件里面的state
,也不是redux
里面的state
。三者毫无关系,都以state
为名,是纯属巧合。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:nodejs@20.18.0
,create-react-app@5.0.1
,react-router-dom@6.27.0
,react@18.3.1
。
接收state
因为传递state
这个事情,目前已经有了比较大的分歧。所以,先说如何接收state
,这个目前没有任何分歧。可以用作state
传递是否成功的标准。
这个接收方法就是useLocation()
,在前面的文章里面,已经多次提到过这个钩子了。参考文章:
- https://newsn.net/say/react-router-listen.html
- https://newsn.net/say/react-location.html
- https://newsn.net/say/react-uselocation.html
所以,useLocation()
除了能够实时获取pathname
外,还能获取这个不常见的state
。
import { useLocation } from "react-router-dom";
const Demo = () => {
const location = useLocation();
const from = location.state ? location.state.from : ""; // from是预定义state里面的一个key
//...
}
上面代码中的from
,就是state
里面的一个key
。例如:{from:"China"}
。当然这个三元表达式,也可以使用下面这种表述,也可以获得同样的效果。
const from = location.state?.from;
也可以写成
const { state: { from } } = location; // 这种写法容易出错,不建议使用
但是这种写法的前提是:from
必然存在,这显然和实际情况不符。很容易报错,不建议使用。
链接传递state
在ReactRouter
里面,大体上有三种方法传递state
。前两种就是<Link>
和<NavLink>
。参考文章:
前提依然是:在React Router
下面的某种router
下面使用本文代码。否则就会各种报错。传递参数的方式其实有很多,以前的文章里面,都是在关注Link
的to
属性,而忽略了state
属性。
这里不得不提一句,这些事件本来就叫做pushstate
或者popstate
或者replacestate
,其主角是state
。而to
这个目标地址,却可能出人意料的喧宾夺主了呢?
import { Link,NavLink } from "react-router-dom";
<Link to="/" state={{ from: "link" }}>Link</Link>
<NavLink to="/" state={{ id: 2, from: "link2" }}>
NavLink
</NavLink>
网络上广为流传的将pathname
和state
写在一起,赋值给to
的写法。目前无法得到state
数据。
在大家通常意义的理解下,这些state
应该都是些比较简短的配置信息。但是,据小道消息,说浏览器能接受的最大的state
消息体为16M
。所以,如果有需求,这个state
值也可以设置的多一些。
函数传递state
以前版本的react router
,是使用useHistory()
来做这件事情的。目前是使用useNavigate()
来传递state
的。参考代码:
<button onClick={handleClick}>函数跳转</button>
let navigate = useNavigate();
function handleClick(e) {
navigate("/", { state: { from: "js" } });
}
完整代码
import { Link, NavLink, useNavigate } from "react-router-dom";
import { useLocation } from "react-router-dom";
const Demo = () => {
// 接受 state
const location = useLocation();
const from = location.state?.from;
// 发送 state
let navigate = useNavigate();
function handleClick(e) {
navigate("/", { state: { from: "js" } });
}
return (
<>
<div className="bar">
<Link to="/" state={{ from: "Link" }}>
Link
</Link>
<NavLink to="/" state={{ id: 2, from: "NavLink" }}>
NavLink
</NavLink>
<button onClick={handleClick}>函数跳转</button>
<Link to={{ pathname: "/", state: { id: 3, from: "拿不到的数据" } }}>
错误示例
</Link>
<NavLink to={{ pathname: "/", state: { id: 4, from: "拿不到的数据" } }}>
错误示例
</NavLink>
</div>
<h3>{from}</h3>
</>
);
};
export default Demo;
结语
目前正确的写法和错误的写法,最大的区别就是:是不是把state
写到和pathname
写在同一个{}
里面。想知道苏南大叔的更多react
经验文章么?请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。