• 假设我有一个React类P,它呈现两个子类C1和C2.
  • C1包含一个输入字段.我将把这个输入字段称为Foo.
  • 我的目标是让C2对Foo的变化做出react .

我想出了两个解决方案,但两个都不太合适.

第一个解决方案:

  1. 给P分配一个状态,state.input.
  2. 在P中创建一个onChange函数,它接收一个事件并设置state.input.
  3. onChange作为props传递给C1,让C1将this.props.onChange绑定到Foo的onChange.

这很管用.每当Foo的值发生变化时,它就会触发P中的setState,因此P将有输入传递给C2.

But it doesn't feel quite right for the same reason: I'm setting the state of a parent element from a child element. This seems to betray the design principle of React: single-direction data flow.
Is this how I'm supposed to do it, or is there a more React-natural solution?

第二个解决方案:

把福放在P里.

But is this a design principle I should follow when I structure my app—putting all form elements in the 100 of the highest-level class?

就像在我的例子中,如果我对C1有一个大的渲染,我真的不想仅仅因为C1有一个form元素就把C1的整个render放到P的render.

我该怎么做?

推荐答案

所以,如果我理解正确,你的第一个解决方案是建议你在根组件中保持状态?我不能代表React的创建者说话,但总的来说,我觉得这是一个合适的解决方案.

保持状态是React产生的原因之一(至少我认为是这样).如果你曾经实现过自己的状态模式客户端来处理一个动态UI,它有很多相互依赖的移动部件,那么你会喜欢React,因为它减轻了很多状态管理的痛苦.

通过在层次 struct 中进一步保持状态,并通过事件进行更新,您的数据流仍然基本上是单向的,您只是响应根组件中的事件,而不是通过双向绑定来获取数据,您告诉根组件"嘿,这里发生了什么,请判断这些值",或者向上传递子组件中某些数据的状态,以便更新状态.您更改了C1中的状态,并且希望C2知道它,因此,通过更新根组件中的状态并重新渲染,C2的props 现在是同步的,因为状态在根组件中更新并传递.

class Example extends React.Component {
  constructor (props) {
    super(props)
    this.state = { data: 'test' }
  }
  render () {
    return (
      <div>
        <C1 onUpdate={this.onUpdate.bind(this)}/>
        <C2 data={this.state.data}/>
      </div>
    )
  }
  onUpdate (data) { this.setState({ data }) }
}

class C1 extends React.Component {
    render () {
      return (
        <div>
          <input type='text' ref='myInput'/>
          <input type='button' onClick={this.update.bind(this)} value='Update C2'/>
        </div>
      )
    }
    update () {
      this.props.onUpdate(this.refs.myInput.getDOMNode().value)
    }
})

class C2 extends React.Component {
    render () {
      return <div>{this.props.data}</div>
    }
})

ReactDOM.renderComponent(<Example/>, document.body)

Reactjs相关问答推荐

如何实现黑暗模式 map ?

react 表复选框不对任何操作做出react

客户端组件中服务器组件的两难境地

单击按钮时在子元素中不显示任何内容-react

我想删除NextJs中的X轴标签APEXCHARTS

for each 子级加载父路由加载器

子路径上未定义useMatches句柄

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

获取更多数据后更新 DOM,而不刷新 React.js 中的页面

i18next中复数键的理解

如何实现 redux 工具包来注册用户?

我正在通过 API(有效)从 MongoDB 传递数据.可视化但我不断收到此 TypeError: Cannot convert undefined or null to object

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

为什么接受 useState 返回的函数的 setter 在使用 React 的单个调用中执行两次?

如何使用 React 在客户端获取 nestjs websocket 异常错误?

刷新页面时状态改变问题

为什么我在此代码段中看不到 useEffect for count = 1?

将 dict 值转换并插入到react 钩子的列表中

ReactJS:按钮启用禁用更改 colored颜色

试图将页面限制为仅登录但有条件的用户似乎永远不会运行