react,在componentDidMount里面获取数据调用setState为何没有触发重渲染?

新手上路,请多包涵

想用react做一个搜索框,组建件传值已经能从input传到list组件修改state.keyword值,但getData()函数中使用fetchJsonp获取json数据只是初始的state.keyword的值,所以获取数据不会改变,请问有什么方法可以解决呢?

state.keyword初始值为 jianai 通过getData方法获取json

    componentDidMount(){
        var that = this;
        const keyword = this.props.keyword;
        var url = "https://api.douban.com/v2/book/search?q="+keyword;
        var getData = function(){
            return fetchJsonp(url)
            .then(function(response) {
                return response.json()
            }).then(function(json) {
                console.log('parsed json', json.books[0]);
            
                return json;
            }).catch(function(ex) {
                console.log('parsing failed', ex)
            })
        }

        getData().then(function(data){
            that.setState({
                author:data.books[0].author,
                imgsrc:data.books[0].image
            });             
        })
     
    }
<div className="list-book">
                    <div className="list-box">
                        <li>{this.state.author}</li>
                    </div>
                    <div className="list-box">
                        <img src={this.state.imgsrc} />
                    </div>
                    <div className="list-box">
                        <li>{keyword}</li>
                    </div>
                </div>

运行结果如图
图片描述

通过搜索框修改后,keyword值变了,但getData函数没有再次调用

图片描述

阅读 6.1k
2 个回答

生命周期:
除非 你重新创建组件, 才会调用 componentsDidMount,
如果 你通过改变 props.
你需要 在 componentWillReceiveProps 里加入响应的函数。

componentsDidMount只会在组件加载完后执行一次,之后更新state、props都不会执行,除非重新加载组件。
componentWillReceiveProps在组件传进来的props被更改时,将被调用。
所以可以在componentWillReceiveProps函数里改变state来重新获取数据。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题