美文网首页
React中router-dom相同路径不同参数时页面不重载问题

React中router-dom相同路径不同参数时页面不重载问题

作者: fanzhh | 来源:发表于2019-06-23 17:13 被阅读0次

版本如下:

"dependencies": {
    "axios": "^0.18.0",
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-router-dom": "^5.0.0",
    ...
  },

App.js代码片段:

...
<Route path="/lesson/:id" exact render={props=>
            <Lesson 
              base_url={URL} 
              isLogin={this.state.isLogin} 
              token={this.state.token} 
              username={this.state.username} 
            />
          }/>
...

Lesson.js代码片段:

...
componentDidMount() {
        let id = this.props.match.params.id;
        axios({
            url: '/app1/lesson/' + id + '/',
            headers: {}
        })
        .then(更新状态)
        ...
    }
...
render(){
    return 
        ...
        <Row>
                          <Col>
                            {lesson.prev_id>0?
                              <Button 
                                variant="outline-info" 
                                onClick={()=>this.props.history.push('/lesson/'+lesson.prev_id)}
                              >
                                  上一课:{lesson.prev_title}
                            </Button>
                            :<div/>}
                          </Col>
                          <Col 
                            className="col-center"
                          >
                            <Button 
                                variant="outline-info" 
                                onClick={()=>this.props.history.push('/course/'+lesson.course_id)}
                            >返回课程列表</Button></Col>
                          <Col className="col-right">
                              <Button 
                                variant="outline-info" 
                                onClick={()=>this.props.history.push('/lesson/'+lesson.next_id)}>
                                    下一课:{lesson.next_title}
                              </Button>
                           </Col>
                      </Row>
        ...
}

现在的问题是,Lesson页面加载后,单击“上一课”、“下一课”,浏览器地址栏改变,页面不重载,显示仍然是初次载入后的数据。

经查这个页面:

...
Along with componentDidMount, You also need to implement the componentWillReceiveProps or use getDerivedStateFromProps(from v16.3.0 onwards) in Products page since the same component is re-rendered with updated params and not re-mounted when you change the route params, this is because params are passed as props to the component and on props change, React components re-render and not re-mounted.
...

意思是页面加载后,参数是作为属性props传入的,属性的改变并不会导致页面部件更新,状态state的改变才会。

于是将axios获取数据放入单独函数fetchLesson中,增加componentWillReceiveProps函数:

componentWillReceiveProps(newProps) {
        let id = newProps.match.params.id;
        if (typeof(id) !== 'undefined' && id !== null && id !== this.props.match.params.id) {
            console.log('will fetch new lesson...')
            this.fetchLesson(id);
        }
    }

componentDidMount修改如下:

componentDidMount() {
        let id = this.props.match.params.id;
        this.fetchLesson(id);
    }

问题解决。

相关文章

  • React中router-dom相同路径不同参数时页面不重载问题

    版本如下: App.js代码片段: Lesson.js代码片段: 现在的问题是,Lesson页面加载后,单击“上一...

  • C++学习笔记

    重载函数 定义:函数名相同,参数个数、参数类型、参数顺序不同的多个函数我们称为函数重载 构成条件: 返回值不同不构...

  • 重载和重写的区别

    重载(overload):编译时多态性发生在同一个类中,方法名相同参数列表不同(参数个数不同、参数类型不同、参数顺...

  • Java编程思想复习之方法重载

    重载:方法名相同 参数类型不同或者参数个数不同1.构造器重载 2函数重载示例代码如下:

  • NO.16 方法的重载

    重载:方法名相同,参数列表不同,与返回值类型无关 重载的分类: 1、参数个数不同 2、参数类型不同...

  • 【从零开始学Java】学习笔记day010

    一.方法重载 概念: 方法名相同,参数列表不同,与返回值类型无关 参数列表不同: 参数个数不同,算不同 参数类型不...

  • 2.C++对C的扩展

    重载(overload) C++中,引用了函数重载的概念,函数名同名,参数列表不同形成重载。重载规则: 函数名相同...

  • java方法重载时的调用选择

    重载:方法名相同,参数列表不同;参数列表包括参数的个数,类型,不包括参数的返回值,抛出的异常等。对于方法重载时具体...

  • [初学C++]C++的拓展--函数重载

    重载规则**1)函数名相同。2)参数个数不同,参数的类型不同,参数顺序不同,均可构成重载。3)仅仅返回值类型不同则...

  • Swift学习_读取json文件&重载

    相关知识:swift支持方法的重载方法的重载:方法名称相同,但是参数不同。包括:参数的类型不同参数的个数不同 Ma...

网友评论

      本文标题:React中router-dom相同路径不同参数时页面不重载问题

      本文链接:https://www.haomeiwen.com/subject/tpgvfctx.html