react-router-dom v6.0向路由组件传递params参数无法接收问题

项目场景:

ArticleList组件:通过该列表的路由组件进入文章详情页面,并由该组件中的路由组件传递参数id到文章详情页面

class ArticleList extends Component {
    constructor(props) {
        super(props);
    }
    render() {

        const { articleList, getMoreList } = this.props;
        return (
            <Fragment>
                {
                    articleList.map((item, index) => {
                        return (
                            <Link to={'/detail/' + item.get('id')} key={index}>
                                <ListItem >
                                    <ListInfo>
                                        <h3 className="title">{item.get('title')}</h3>
                                        <p className="info">{item.get('info')}</p>
                                    </ListInfo>
                                    {/* <img src="https://upload-images.jianshu.io/upload_images/23868698-07ed2ab2a9c8a6c1.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/360/h/240"></img> */}
                                </ListItem>
                            </Link>

                        )
                    })
                }

                <LoadMore onClick={getMoreList.bind(this)}>加载更多</LoadMore>

            </Fragment>
        )
    }
}

Detail组件

class Detail extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        const { title, content, params } = this.props;
        console.log(params.id);
        return (
            <Bodybackground>
                <DetailWrapper>
                    <Header>{title}</Header>
                    <Context dangerouslySetInnerHTML={{ __html: content }} />
                </DetailWrapper>
            </Bodybackground>

        )
    }

    componentDidMount() {

        this.props.getDetail();
    }
}

问题描述

props中并没有match参数以及其params参数,也取不了路由传递过来的参数
在这里插入图片描述

在这里插入图片描述

原因分析:

从react-router-dom v6版本开始,路由参数必须使用函数组件进行接收,类组件中无法通过this.props中接收路由组件传递的参数。


解决方案:

将文章详情组件转换成函数组件,利用react-router-dom提供的useParams进行参数的获取。

function Detail(props) {
    const { title, content } = props;
    const params = useParams();
    const { id } = params;
    console.log(id);
    props.getDetail();
    return (
        <Bodybackground>
            <DetailWrapper>
                <Header>{title}</Header>
                <Context dangerouslySetInnerHTML={{ __html: content }} />
            </DetailWrapper>
        </Bodybackground>

    )
}

这样就Detail组件就可以接收到路由组件传递过来的参数id了。
在这里插入图片描述

遗留问题:

由于使用的是函数组件,函数组件中并没有生命周期函数,这也导致了props.getDetail();在每一次页面渲染的时候都要执行一遍,该方法的作用是通过axios获取数据并派发action完成reducer中数据的更新,我们只需要执行一次就行了,在之前的类组件中我使用了
componentDidMount() { this.props.getDetail(); }这个生命周期函数来实现,而在函数组件中,应该使用React Hooks来完成上述需求,等后面学习了React Hooks再对上述代码进行完善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router是一个用于构建单页面应用程序的库。它提供了一种在React应用程序中管理路由的方式。React Router DOM是React Router的一个扩展,用于在Web应用程序中进行路由React Router DOM 5和React Router DOM 6之间有几个重要的区别: 1. 安装方式:React Router DOM 5使用npm包管理器进行安装,命令为`npm install react-router-dom`。而React Router DOM 6使用yarn进行安装,命令为`yarn add react-router-dom@next`。 2. 路由组件:在React Router DOM 5中,使用`<Route>`组件来定义路由。而在React Router DOM 6中,使用`<Route>`组件的替代方案`<Routes>`来定义路由。 3. 路由匹配方式:React Router DOM 5使用基于路径的匹配方式来确定哪个路由应该被渲染。而React Router DOM 6引入了新的匹配方式,称为元素匹配(element matching),它可以根据组件的类型来匹配路由。 4. 嵌套路由:在React Router DOM 5中,嵌套路由需要使用嵌套的`<Route>`组件来定义。而在React Router DOM 6中,可以使用嵌套的`<Routes>`组件来定义嵌套路由。 5. 动态路由:在React Router DOM 5中,可以通过在路径中使用参数来定义动态路由。而在React Router DOM 6中,可以使用`<Route>`组件的新属性`element`来定义动态路由。 6. 错误处理:React Router DOM 5使用`<Switch>`组件来处理路由匹配错误。而React Router DOM 6使用`<Routes>`组件的新属性`fallback`来处理路由匹配错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值