React使用?/search和params传参 (react 函数非类)

前言

继昨日浅谈vite创建React以及简单的DOM

今天聊聊两种页面跳转传参方式search和params

后面学习使用类来画页面后再来说一下 state传参

页面跳转传参一

?传参

在vue项目里?传参 然后用query接参 而React项目则是用search来完成的

① 传递方组件

home.jsx

import { useNavigate } from 'react-router-dom'
import '../assets/css/home.css'

export default function Home(){

    const navigate = useNavigate() 
     // 非箭头函数
    function redirectToNotFound(){
        // 随意一个没有定义的路由 验证是否重定向
        navigate('/sdf')
    }
    const C = {
        width:'80%',
        border:'1px solid red',
        padding:'20px',
        margin:'0 auto'
    }

    // 1 定义数据
    const msg = '10086'
    // 2 使用?或search传参 箭头函数
    const toList = ()=>{
        navigate('/list?'+ msg)
    }
  
return(
<div style={C}>
<h1>this is home page</h1>
{/* 点击事件为 onClick */}
<p>search 传参</p>
<button style={{width:'180px',height:'30px',borderRadius:'30px',backgroundColor:'coral',color:'#fff'}} onClick={toList}>to list</button>
{/* 类名使用className */}
<button className='home' onClick={redirectToNotFound}>重定向跳转至404页面</button>
</div>
)

}

② 接收方组件

list.jsx

import { ListCss } from '../assets/css/list.js'
import '../assets/css/home.css'
// 1 引入useLocation方法
import { useLocation } from 'react-router-dom'
export default function list(){
// 2 拿到实例
const location = useLocation()
console.log(location);
// 3 赋值
const msg  = location.search.slice(1)
    
return(
<ListCss>
<h1>this is list page</h1>
<p className="list">使用插件styled-components写样式</p>
<hr />
<div className='C'>
<p>search 接参</p>
{/* 4 展示 */}
<p>msg:<span style={{color:'coral'}}>{msg}</span></p>
</div>
</ListCss>
)
}

看下效果:

 有个疑问?

我明明定义的msg是10086 为什么传过来的search字段就变成了 ?10086 ?

所以取值时记得截取一下

当然对比query传参 也可将search=取代?以对象式写法传参

search传参

只需改动传递方组件的第二步骤即可

home.jsx

    // 2 使用?或search传参 箭头函数
    const toList = ()=>{
        // ?传参
        // navigate('/list?'+msg)

        // search 对象式写法传参
        navigate({
            pathname:'/list',
            search:msg
        })
    }

看下动态效果:

 这样与vue的query传参对比一下是不是就豁然开朗多了

页面刷新 参数不会丢失

页面跳转传参二

params传参

① 在此之前先配置路由

src/router/index.jsx

② 传递方组件

home.jsx

import { useNavigate } from 'react-router-dom'
import '../assets/css/home.css'

export default function Home(){

    const navigate = useNavigate() 
     // 非箭头函数
    function redirectToNotFound(){
        // 随意一个没有定义的路由 验证是否重定向
        navigate('/sdf')
    }
    const C = {
        width:'80%',
        border:'1px solid red',
        padding:'20px',
        margin:'0 auto'
    }

    // 1 定义数据
    const msg = '10086'
    // 2 使用params传参 箭头函数
    const toList = ()=>{
        // params传参
        navigate(`/list/${msg}`)

        // ?传参
        // navigate('/list?'+msg)

        // search 对象式写法传参
        // navigate({
        //     pathname:'/list',
        //     search:msg
        // })
    }
  
return(
<div style={C}>
<h1>this is home page</h1>
{/* 点击事件为 onClick */}
<p>search 传参</p>
<button style={{width:'180px',height:'30px',borderRadius:'30px',backgroundColor:'coral',color:'#fff'}} onClick={toList}>to list</button>
{/* 类名使用className */}
<button className='home' onClick={redirectToNotFound}>重定向跳转至404页面</button>
</div>
)

}

③ 接收方组件

list.jsx

import { ListCss } from '../assets/css/list.js'
import '../assets/css/home.css'
// 1 引入useParams方法
import { useParams } from 'react-router-dom'
export default function list(){
// 2 拿到实例
const params = useParams()
console.log(params);
// 3 赋值
const msg  = params.msg
    
return(
<ListCss>
<h1>this is list page</h1>
<p className="list">使用插件styled-components写样式</p>
<hr />
<div className='C'>
<p>search 接参</p>
{/* 4 展示 */}
<p>msg:<span style={{color:'coral'}}>{msg}</span></p>
</div>
</ListCss>
)
}

效果:

 动态效果:

 

大家都知道传递参数只能是字符串形式 我们在传递数组或对象时都是用JSON.stringify()方法先转成字符串 接收时用JSON.parse()方法再转回来

可在React项目里不行 之前旧版本自带querystring方法 现在好像也没了

最后找了半天 使用 qs 这一插件可以实现

如果你有更好的方法 也欢迎告知

下面使用search传递数组试试

① 下载插件 qs

npm i qs

② 传递方组件

home.jsx

import { useNavigate } from 'react-router-dom'
import '../assets/css/home.css'
// 1 引入插件 qs
import qs from 'qs'
export default function Home(){

    const navigate = useNavigate() 
     // 非箭头函数
    function redirectToNotFound(){
        // 随意一个没有定义的路由 验证是否重定向
        navigate('/sdf')
    }
    const C = {
        width:'80%',
        border:'1px solid red',
        padding:'20px',
        margin:'0 auto'
    }

    // 2 定义数据
    const list = [
        {
          id:1,
          content:'云青青兮欲雨,'
        },{
          id:2,
          content:'水澹澹兮生烟。'
        }
      ]
    // 3 使用search传参 箭头函数
    const toList = ()=>{
        // params传参
        navigate({
            pathname:'/list',
            search:qs.stringify({list}) // 记得加 {}
        })

        // ?传参
        // navigate('/list?'+msg)

        // search 对象式写法传参
        // navigate({
        //     pathname:'/list',
        //     search:msg
        // })
    }
  
return(
<div style={C}>
<h1>this is home page</h1>
{/* 点击事件为 onClick */}
<p>search 传参</p>
<button style={{width:'180px',height:'30px',borderRadius:'30px',backgroundColor:'coral',color:'#fff'}} onClick={toList}>to list</button>
{/* 类名使用className */}
<button className='home' onClick={redirectToNotFound}>重定向跳转至404页面</button>
</div>
)

}

③ 接收方组件

list.jsx

import { ListCss } from '../assets/css/list.js'
import '../assets/css/home.css'
// 1 引入插件 qs
import qs from 'qs'
// 1 引入useParams方法
import { useLocation } from 'react-router-dom'
export default function list(){
// 2 拿到实例
const location = useLocation()
console.log(qs.parse(location.search.slice(1)));
// 3 解构赋值
const { list }  = qs.parse(location.search.slice(1))
console.log(list);
// 4 循环列表 插值在DOM里 其中一种写法
function ListItem(){
   const item = list.map(item=><li style={{color:'coral',listStyle:'none'}} key={item.id}>{item.content}</li>)
   return <ul>{item}</ul>
} 
    
return(
<ListCss>
<h1>this is list page</h1>
<p className="list">使用插件styled-components写样式</p>
<hr />
<div className='C'>
<p>search 接参</p>
{/* 5 展示 */}
<ListItem></ListItem>
{/* <p>msg:<span style={{color:'coral'}}>{msg}</span></p> */}
</div>
</ListCss>
)
}

效果:

 

 总结

① 在React项目里 没有Vue的v-for那样强大的指令来渲染列表

只能通过原始的数组方法遍历数组 然后将目标内容插入到DOM中

最后展示在页面上

所以都说React更贴近原始JS --本来就是JavaScript库

说白了就是不如Vue那么易上手

② 在传递数组时 别忘了加单花括号 不然会失败

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值