React路由传参 -- ( params, query, state, search)

本文详细介绍了React中四种路由参数传递方法:params、query、state和search,包括它们的使用方法、优缺点。例如,params适用于刷新地址栏参数仍保留的场景,但仅限于字符串;query则允许传递对象,但刷新后参数会丢失。理解这些方法对于优化React应用的导航体验至关重要。

1.params

<Route path='/path/:name' component={Path}/>
<link to="/path/2">xxx</Link>
this.props.history.push({pathname:"/path/" + name});
读取参数用:this.props.match.params.name

优势 : 刷新地址栏,参数依然存在
缺点:只能传字符串,并且,如果传的值太多的话,url会变得长而丑陋。


2.query

<Route path='/query' component={Query}/>
<Link to={{ path : ' /query' , query : { name : 'sunny' }}}>
this.props.history.push({pathname:"/query",query: { name : 'sunny' }});
读取参数用: this.props.location.query.name

优势:传参优雅,传递参数可传对象;
缺点:刷新地址栏,参数丢失


3.state

<Route path='/sort ' component={Sort}/>
<Link to={{ path : ' /sort ' , state : { name : 'sunny' }}}> 
this.props.history.push({pathname:"/sort ",state : { name : 'sunny' }});
读取参数用: this.props.location.query.state 

优缺点同query


4.search

<Route path='/web/departManange ' component={DepartManange}/>
<link to="web/departManange?tenantId=12121212">xxx</Link>
this.props.history.push({pathname:"/web/departManange?tenantId" + row.tenantId});
读取参数用: this.props.location.search

优缺点同params



作者:_花
链接:https://www.jianshu.com/p/ad8cc02b9e6c
来源:简书

React Router 中,paramssearchstate 是三种不同的传参方式,以下是它们的使用及相关知识: ### params 传参 params 传参是将参数作为 URL 的一部分,通常用于传递动态路由信息。在路由注册时,需要定义动态参数,使用 `:参数名` 的形式。 示例代码如下: ```jsx // 路由表展示 (App.js) import { Routes, Route } from 'react-router-dom'; import Home from './Home'; import Detail from './Detail'; function App() { return ( <Routes> <Route path='/home' element={<Home />} /> <Route path='/detail/:id/:title' element={<Detail />} /> </Routes> ); } export default App; ``` 在接收参数的组件中,可以通过 `useParams` 钩子获取参数值: ```jsx // Detail 组件 import React from 'react'; import { useParams } from 'react-router-dom'; const DetailData = [ { id: '01', content: '我爱你,中国' }, { id: '03', content: '我爱你,中国33' }, { id: '06', content: '我爱你,中国6666' } ]; const Detail = () => { const { id, title } = useParams(); const findResult = DetailData.find((detailObj) => { return detailObj.id === id; }); return ( <ul> <li>ID: {id}</li> <li>TITLE: {title}</li> <li>CONTENT: {findResult?.content}</li> </ul> ); }; export default Detail; ``` ### search 传参 search 传参是将参数添加到 URL 的查询字符串中,使用 `?参数名=参数值` 的形式。可以使用 `useSearchParams` 钩子来处理 search 参数。 示例代码如下: ```jsx import { Link, useSearchParams } from 'react-router-dom'; const Home = () => { return ( <div> <Link to="/detail?id=01&title=示例标题">跳转到详情页</Link> </div> ); }; const Detail = () => { const [searchParams] = useSearchParams(); const id = searchParams.get('id'); const title = searchParams.get('title'); const DetailData = [ { id: '01', content: '我爱你,中国' }, { id: '03', content: '我爱你,中国33' }, { id: '06', content: '我爱你,中国6666' } ]; const findResult = DetailData.find((detailObj) => { return detailObj.id === id; }); return ( <ul> <li>ID: {id}</li> <li>TITLE: {title}</li> <li>CONTENT: {findResult?.content}</li> </ul> ); }; ``` ### state 传参 state 传参可以将数据不暴露在 URL 中传递。在使用 `Link` 或 `navigate` 进行路由跳转时,可以通过 `state` 属性传递数据。 示例代码如下: ```jsx import { Link, useLocation } from 'react-router-dom'; const Home = () => { return ( <div> <Link to="/detail" state={{ id: '01', title: '示例标题' }} > 跳转到详情页 </Link> </div> ); }; const Detail = () => { const location = useLocation(); const { id, title } = location.state || {}; const DetailData = [ { id: '01', content: '我爱你,中国' }, { id: '03', content: '我爱你,中国33' }, { id: '06', content: '我爱你,中国6666' } ]; const findResult = DetailData.find((detailObj) => { return detailObj.id === id; }); return ( <ul> <li>ID: {id}</li> <li>TITLE: {title}</li> <li>CONTENT: {findResult?.content}</li> </ul> ); }; ``` ### 三者区别 - **可见性**:paramssearch 参数会显示在 URL 中,而 state 参数不会显示在 URL 中,具有更好的隐私性 [^1]。 - **使用场景**:params 适用于动态路由search 适用于传递可选参数,state 适用于传递敏感或复杂的数据,不希望暴露在 URL 中。 ### 注意事项 由于 stateparamssearch 的最大区别就在于可见性,开发中大概率不会混用 stateparamssearch,因此 React Router 没有设计同时传递 searchstate 的逻辑。而 query 是数据不暴露在 url 中的 search,因此同时使用 querystate 更符合统一的设计逻辑 [^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值