ReactJS 状态与props

IT技术 reactjs
2021-05-17 06:42:51

这可能是在可回答和自以为是之间徘徊,但随着复杂性的增加,我会反复讨论如何构建 ReactJS 组件,并且可以使用一些方向。

来自 AngularJS,我想将我的模型作为属性传递给组件,并让组件直接修改模型。或者我应该将模型拆分为各种state属性并在向上游发送时将其编译回一起?ReactJS 的方式是什么?

以博客文章编辑器为例。尝试直接修改模型最终看起来像:

var PostEditor = React.createClass({
  updateText: function(e) {
    var text = e.target.value;
    this.props.post.text = text;
    this.forceUpdate();
  },
  render: function() {
    return (
      <input value={this.props.post.text} onChange={this.updateText}/>
      <button onClick={this.props.post.save}/>Save</button>
    );
  }
});

这似乎是错误的。

是否更像是 React 方式来制作我们的text模型属性state,并在保存之前将其编译回模型,例如:

var PostEditor = React.createClass({
  getInitialState: function() {
    return {
      text: ""
    };
  },
  componentWillMount: function() {
    this.setState({
      text: this.props.post.text
    });
  },
  updateText: function(e) {
    this.setState({
      text: e.target.value
    });
  },
  savePost: function() {
    this.props.post.text = this.state.text;
    this.props.post.save();
  },
  render: function() {
    return (
      <input value={this.state.text} onChange={this.updateText}/>
      <button onClick={this.savePost}/>Save</button>
    );
  }
});

这不需要调用this.forceUpdate(),但是随着模型的增长,(帖子可能有作者、主题、标签、评论、评级等),组件开始变得非常复杂。

使用ReactLink的第一种方法是要走的路吗?

4个回答

2016 年更新: React 变了,“props vs state”的解释变得非常简单。如果组件需要更改数据 - 将其置于 state 中,否则置于 props 中。因为props现在是只读的

props 和 state 之间的确切区别是什么?

你可以在这里找到很好的解释(完整版)

改变props和状态

你的第二种方法更像它。React 并不关心模型,因为它关心以及它们如何在您的应用程序中流动。理想情况下,您的后期模型将存储在根的单个组件中。然后创建每个使用模型部分的子组件。

您可以将回调传递给需要修改数据的子组件,并从子组件调用它们。

直接修改 this.props 或 this.state 不是一个好主意,因为 React 将无法接受更改。那是因为 React 对您的 post prop 进行了浅层比较,以确定它是否已更改。

我制作了这个jsfiddle来展示数据如何从外部组件流到内部组件。

handleClick方法显示了 3 种(im)正确更新状态的方法:

var Outer = React.createClass({

  getInitialState: function() {
    return {data: {value: 'at first, it works'}};
  },

  handleClick: function () {

    // 1. This doesn't work, render is not triggered.
    // Never set state directly because the updated values
    // can still be read, which can lead to unexpected behavior.

    this.state.data.value = 'but React will never know!';

    // 2. This works, because we use setState

    var newData = {value: 'it works 2'};
    this.setState({data: newData});

    // 3. Alternatively you can use React's immutability helpers
    // to update more complex models.
    // Read more: http://facebook.github.io/react/docs/update.html

    var newState = React.addons.update(this.state, {
      data: {value: {$set: 'it works'}}
    });
    this.setState(newState);
 },

  render: function() {
      return <Inner data={this.state.data} handleClick={this.handleClick} />;
  }
});

来自 React 文档

props 是不可变的:它们从父级传递过来并且由父级“拥有”。为了实现交互,我们向组件引入了可变状态。this.state 是组件私有的,可以通过调用 this.setState() 进行更改。当状态更新时,组件重新渲染自身。

来自TrySpace:当 props(或 state)更新(通过 setProps/setState 或 parent)时,组件也会重新渲染。

阅读Thinking in React

让我们逐一分析并找出哪个是状态。只需对每条数据提出三个问题:

  1. 它是通过 props 从父级传入的吗?如果是这样,它可能不是状态。
  2. 它会随着时间而改变吗?如果没有,它可能不是状态。

  3. 您可以根据组件中的任何其他状态或props计算它吗?如果是这样,它不是状态。