ReactJS状态与属性

reactjs React.js

达蒙理查德

2020-03-11

这可能会在负责任和有见识之间走出一条界限,但是我将反复讨论如何随着复杂性的增加和使用某些方向来构建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的第一种方法是可行的吗?

第836篇《ReactJS状态与属性》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

3个回答
ItachiTom 2020.03.11

从《React中的思考》中读到的内容

让我们遍历每个,找出哪个是状态。只需对每个数据问三个问题:

  1. 它是通过道具从父母那里传入的吗?如果是这样,则可能不是状态。
  2. 它会随着时间变化吗?如果不是,则可能不是状态。

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

神奇神奇Near 2020.03.11

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

道具和状态之间的确切区别是什么?

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

改变道具和状态

宝儿猿 2020.03.11

来自React doc

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

TrySpace:当更新道具(或状态)(通过setProps / setState或父对象)时,组件也会重新渲染。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android