【问题标题】:update child component when parent component changes父组件改变时更新子组件
【发布时间】:2017-11-03 00:44:43
【问题描述】:

我对 React js 有点陌生。我有两个问题。我来了

问题 1

我想在更新(重新渲染)父组件时更新(重新渲染)子组件。经过一番谷歌搜索,我发现当道具发生变化并且我们调用 forceUpdate 函数时,只更新父组件而不是子组件。如果我想更新子组件,我需要使用 setState 函数并在状态中设置一些东西来更新子组件。 但我面临的问题是,当我在父组件中设置状态时,子组件没有更新。没有调用孩子的渲染方法。有人可以告诉我我做错了什么吗?

Parent.jsx

class Application extends React.Component {
  isBindEvents=false;



  componentWillMount(){
    let {dispatch} = this.props;

  dispatch(getCompanyInfo( "abcd.com", (res) => { // THIS IS A ACTION CALL
  

    this.props.user = res.data.user;       
    this.setState({name:res.data.user.name})

    this.forceUpdate()

  }))
}

 render(){


return ( <div className='react-wrapper'>
    <ABCD {...this.props} /> // THIS IS THE CHILD COMPONENT WHICH I WANT TO RE-RENDER WHEN THE PARENT COMPONENT CHANGES
    <div >
     
      <div id="body" >
        <div>
        <div >
          <div className="container-fluid">
            {this.props.posts}
          </div>
        </div>
        </div>
      </div>
    </div>
   
</div>)
  }
}

export default connect(mapStateToProps)(Application)

儿童.JSX

class ABCD extends React.Component {

 

  render() {

   

    let isShowUser = this.props.user 
      ? true
      : false;

    

    return (
      <div> Here is the user name {isShowUser? this.props.user.name: 'user not present'} </div>
    );
  }
}


export default connect(mapStateToProps)(ABCD);

现在我正在做的是,当应用程序组件正在安装时,我会生成一个对后端服务器的 ajax 调用,当它返回时它会更新道具并设置状态,以便该子组件也被重新渲染,但子组件组件没有重新渲染。有人可以告诉我出了什么问题。

问题 2

The next question is related to react router I'm using react router for the routeing.This is how I'm using router 

module.exports = {
  path: '/',
  component: Application,
  
  indexRoute: require('./abcd'),
  childRoutes: [
    require('./componentTwo'),
    require('./componentOne'),
  ]
};

现在假设我要去组件二路由,它将渲染组件二,我在应用程序组件中生成一个 ajax 调用,并根据 ajax 调用返回的数据在应用程序组件中设置一些道具,然后我还希望组件二在应用程序中更改某些道具后立即重新渲染有没有办法做到这一点

感谢任何帮助,我们将不胜感激

【问题讨论】:

    标签: javascript jquery reactjs react-router axios


    【解决方案1】:
    this.props.user = res.data.user; 
    

    你不能分配给道具。道具是从父母那里传递的。将用户设置为状态并将状态传递给您的子组件,如下所示:

    <ABCD {...this.props} user={this.state.user} />
    

    在您的子组件中,您现在可以访问this.props.user。那时也不需要 this.forceUpdate()。

    【讨论】:

    • Joren,当我这样做时,`this.setState({name:res.data.user.name})` 不会重新渲染我的子组件
    • 它会但它不会显示任何内容,因为在您的子组件中 this.props.user 仍然未定义。试试this.setState({user: res.data.user})。如果您在子组件中使用 console.log('rendered child'),您将看到它在父组件中设置状态后重新呈现。
    • 不,它没有更新
    • 如果你记录 res.data.user 是否定义过?
    • 是的,它已定义。如果我登录它,我可以看到用户数据
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 2021-06-08
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2018-04-18
    • 2018-04-22
    相关资源
    最近更新 更多