这可能是在回答问题和固执己见之间徘徊,但我会反复讨论如何随着复杂性的增长构建ReactJS组件,并可能会用到一些方向.

Coming from AngularJS, I want to pass my model into the component as a property and have the component modify the model directly. Or should I be splitting the model up into various 100 properties and compiling it back together when sending back upstream? What is the ReactJS way?

以博客帖子编辑为例.试图直接修改模型的结果如下:

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>
    );
  }
});

这似乎是错的.

让我们的text模型属性state,并在保存之前将其编译回模型,这更像是一种react 方式吗

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(),但随着模型的增长,(一篇帖子可能有作者、主题、标签、 comments 、评分等…)组件开始变得非常复杂.

第一种方法是ReactLink吗?

推荐答案

你的第二种方法更像它.React与其说关心模型,不如说关心values个模型,以及它们如何在你的应用程序中流动.理想情况下,post模型将存储在根目录下的单个组件中.然后创建子组件,每个子组件都使用模型的一部分.

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

修改这个.props 还是这个.直接陈述并不是一个好主意,因为React将无法了解这些变化.这是因为React会对你的帖子props 做一个肤浅的比较,以确定它是否发生了变化.

我制作这个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} />;
  }
});

Reactjs相关问答推荐

如何在react 流中使用文本区域和改变 node 的输入大小?

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

在Map()完成React.js中的多个垃圾API请求后执行函数

react -无法获取函数的最新参数值

获取类别和页面的参数

在 React 中是否有任何理由要记住 Redux 操作创建者?

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

在React中使用if条件时如何更改Tailwind中元素的文本 colored颜色

Reactjs:MUI5:MobileDateTimePicker API:如何自定义日历中的文本

使用D3.js绘制和展示弦图的右下方象限

为什么这个 React 组件会导致无限渲染?

Redux Toolkit 配置,是否适用于全栈应用程序?

在 React 中,为什么在使用 addEventListener 时外部元素上的 onclick 事件监听器在内部元素的 onclick 事件监听器之前执行?

将复杂状态和 setState 传递给更简单的 api

如何通过 id 从 useSprings 数组中删除元素

React JS:如何判断用户使用的是浏览器 url 还是桌面 electron

Material UI:使用 mui 手风琴时出现props 类型失败:isValidElement 不是函数

刷新页面时状态改变问题

Axios 删除在带有授权令牌的react js 中不起作用

React - useParams() 不会失败 null / undefined 判断