我们可以将setState作为道具从一个组件传递给另一个组件并在React中从子组件更改父状态吗?

时间:2018-05-07 13:25:05

标签: javascript reactjs function setstate react-props

 class App extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
    this.setState=this.setState.bind(this)
  }

  render() {
    return (
      <div>
        <Hello name={this.state.name} />
        <p>
          Start editing to see some magic happen :)
        </p>
        <Child {...this}/>
      </div>
    );
  }
}

child Component
var Child=(self)=>{
  return(
    <button  onClick={()=>{
      self .setState({
        name:"viswa"
      })
    }}>Click </button>
  )

这里我绑定了setState函数并将其作为道具发送到子组件。这将改变父级的状态。这是正确的吗?

3 个答案:

答案 0 :(得分:0)

正如@yBrodsky所说,你应该传递一个改变状态的函数。这是一个例子:

class App extends Component {
  constructor() {
    super();
    this.state = {
      name: 'React'
    };
    this.update=this.update.bind(this);
  }

  update(nextState) {
    this.setState(nextState);
  }

  render() {
    return (
      <Child updateParent={this.update} />
    );
  }
}

const Child = ({updateParent}) => (
  <button onClick={() => updateParent({name: 'Foo bar'})}>Click</button>
);

您现在可以完全控制子项中父项的状态。只需将对象轻微合并到父状态即可。在此示例中,name中的App将在按钮点击时更改为Foo bar

答案 1 :(得分:0)

  

但这比传递函数简单。如果我想改变许多状态改变。与传递函数相比,这将是简单快捷的方式吗?

执行此操作的正确方法与您的一样简单,并且不违反最佳做法:

class App extends Component {
  state = {
      name: 'React',
  };

  render() {
    return (
      <div>
        <Hello name={this.state.name} />
        <p>
          Start editing to see some magic happen :)
        </p>
        <Child onClick={() => this.setState({name: 'viswa'})}/>
      </div>
    );
  }
}

const Child=({onClick})=>(
    <button onClick={onClick}>Click</button>
);

答案 2 :(得分:0)

您不应直接传递setState,因为setState函数不会立即更改状态。

正如documents所说:

  

将setState()视为请求而不是立即命令   更新组件。为了获得更好的感知性能,React可能会   延迟它,然后一次更新几个组件。应对   并不保证立即应用状态变化。

setState()并不总是立即更新组件。它可以批量推迟更新或推迟更新。因此,您最好一起管理setState函数的调用,因为可能存在改变父类状态的竞争。不建议将此功能传递给其他组件。

在一个类中封装setState函数的调用,使代码变得强大。

相关问题