React-Router v6 传递和接收state参数

1.传递参数

import React, { Component } from 'react'
import { Link,Routes,Route} from 'react-router-dom'
import Detail from './Detail'


export default class Messages extends Component {
    state ={messageArr:[
        {id:'1',title:'消息1'},
        {id:'2',title:'消息2'},
        {id:'3',title:'消息3'},
    ]}
   
    render() {
        const {messageArr} = this.state
        return (
            <div>

                <ul>
                {
                    messageArr.map((messageObj)=>{
                        return <li key={messageObj.id}>
                            {/* 向路由链接传递search参数 */}
                            {/* <Link to={{pathname:'/home/messages/detail',state:{'id':messageObj.id,'title':messageObj}}}>{messageObj.title}</Link> */}
                            <Link to={`/home/messages/detail`} state={{id:messageObj.id,title:messageObj.title}}>{messageObj.title}</Link>
                        </li>
                    })
                }
                </ul>
                <hr />
                <div>
                    <Routes>
                        <Route path="/detail" element={<Detail/>}>
                        </Route>
                    </Routes>
                </div>
            </div>
            
        )
    }
}

2.接受参数


import { useLocation } from 'react-router-dom'

import React from 'react'

export default function Detail() {
    
    const DetailData =[
        {id:'1',content:'你好,上海'},
        {id:'2',content:'你好,北京'},
        {id:'3',content:'你好,广州'},
    ]
    // 接受state参数
    const Stateparams = useLocation()
    const {id,title} = Stateparams.state
    // const id = params.get("id")
    // const title = params.get("title")
    
    const deatilContent = DetailData.find((detailObj)=>{
        return detailObj.id === id
    })
    return (
        <ul>
            <li>ID:{id}</li>
            <li>title:{title}</li>
            <li>content:{deatilContent.content}</li>
        </ul>
    )
    
}

### React Router v6 中的路由跳转传参方法 在 React Router v6 中,可以通过多种方式实现在路由跳转时传递参数,并且可以在目标页面轻松获取这些参数。 #### 使用 `navigate` 函数进行路径匹配传参 当执行编程式的导航操作时,可以利用 `useNavigate` Hook 提供的 `navigate` 方法来构建带有动态部分的新 URL。例如: ```javascript import { useNavigate } from 'react-router-dom'; function MyComponent() { const navigate = useNavigate(); function handleClick() { // 动态设置路径中的参数值 navigate(`/systemSet/list/${someId}`); } return ( <button onClick={handleClick}>Go to List</button> ); } ``` 这种方式适用于简单的 ID 或名称等作为路径的一部分传递给下一个页面[^2]。 #### 查询字符串形式附加额外数据 对于更复杂的数据结构或者不想改变原有URL模式的情况下,则可以选择通过查询字符串的形式附带信息。这需要用到第三方库如 `qs` 来帮助序列化对象成查询串格式: ```javascript import qs from 'qs'; import { useNavigate } from 'react-router-dom'; function AnotherComponent() { const navigate = useNavigate(); function handleQuerySubmit(data) { let queryString = qs.stringify({ id: data.id, name: data.name }); navigate({ pathname: '/chargingStation/addCharginns', search: '?' + queryString }); } return /* ... */; } ``` 这样做的好处是在不影响整体 URL 设计的前提下增加了灵活性。 #### 利用状态(state)携带隐藏参数 如果希望某些敏感的信息不暴露于浏览器地址栏中,那么还可以考虑采用 `state` 属性来进行跨页间通信。此特性允许开发者向即将访问的目标位置发送任意 JavaScript 对象而不必担心其可见性问题: ```javascript // 发送端 navigate('/chargingStation/addCharginns', { replace: false, state: { id: 100, name: 'zhufeng' } }); // 接收端 (新页面加载完成后立即读取) import { useLocation } from 'react-router-dom'; function TargetPage() { const location = useLocation(); useEffect(() => { console.log(location.state); }, [location]); return /* ... */ ; } ``` 这种方法非常适合处理那些不需要长期保存但在短时间内需要共享的状态信息。 #### 获取并解析路径参数 为了能够接收到上述提到的各种类型的参数,在接收方组件内部应当相应地调用特定 Hooks 进行提取工作。比如要取得定义好的路径变量(`:id`),则需依赖 `useParams()`;而对于查询字符串而言则是依靠 `useSearchParams()` 实现自动解码功能[^3]: ```typescript jsx import { useParams, useSearchParams } from 'react-router-dom'; const MyDocument = () => { const params = useParams(); // 解析 :id 类型参数 const [searchParams] = useSearchParams(); // 处理 ?key=value 形式 return ( <> Document Id is: {params.id}<br/> Query Param Name: {searchParams.get('name')} </> ) }; ``` 综上所述,React Router v6 提供了丰富的 API 支持不同场景下的需求,无论是简单还是复杂的参数交换都能得到妥善解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值