React – 将表单元素状态传递给兄弟/父元素的正确方法?

2023-11-26

  • 假设我有一个 React 类 P,它呈现两个子类,C1 和 C2。
  • C1 包含一个输入字段。我将此输入字段称为 Foo。
  • 我的目标是让 C2 对食物的变化做出反应。

我提出了两种解决方案,但都感觉不太正确。

第一个解决方案:

  1. 为 P 分配一个状态,state.input.
  2. 创建一个onChangeP 中的函数,它接收一个事件并设置state.input.
  3. 通过这个onChange将 C1 作为props,并让 C1 绑定this.props.onChange to the onChange of Foo.

这有效。每当 Foo 的值发生变化时,就会触发setState在 P 中,因此 P 将有输入传递给 C2。

但出于同样的原因,感觉不太正确:我正在从子元素设置父元素的状态。这似乎违背了React的设计原则:单向数据流。
这是我应该这样做的,还是有更 React 自然的解决方案?

第二种解决方案:

只需将 Foo 放入 P 即可。

但这是我在构建应用程序时应该遵循的设计原则吗?将所有表单元素放在render最高级别的班级?

就像我的例子一样,如果我有一个大的 C1 渲染,我真的不想把整个renderC1 至renderP 只是因为 C1 有一个表单元素。

我该怎么做呢?


那么,如果我理解正确的话,您的第一个解决方案是建议您在根组件中保留状态?我不能代表 React 的创建者说话,但总的来说,我认为这是一个合适的解决方案。

维护状态是创建 React 的原因之一(至少我认为)。如果您曾经实现过自己的状态模式客户端来处理具有大量相互依赖的移动部分的动态 UI,那么您会喜欢 React,因为它减轻了很多状态管理的痛苦。

通过将状态保持在层次结构中的更高位置,并通过事件更新它,您的数据流仍然几乎是单向的,您只是响应根组件中的事件,您并没有真正通过双向绑定获取数据,您告诉根组件“嘿,这里发生了一些事情,请检查这些值”,或者您正在向上传递子组件中某些数据的状态以更新状态。您更改了 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React – 将表单元素状态传递给兄弟/父元素的正确方法? 的相关文章

随机推荐

  • ggplot 函数在图例下方添加文本

    在 R 中 我想创建一个函数 它接受 ggplot 对象和一些文本并返回 ggplot 对象 方法是在图例下方添加文本 在图的右侧 同时将图例保留在右侧 myplot ggplot iris aes x Sepal Length y Sep
  • 单一来源项目结构有哪些缺点?

    我是目前公司的新人 正在从事由我的直接团队领导编写的项目 该公司通常不使用 C 但我的同事用 C C 编写了高效的代码 只有我们知道如何用 C 编码 我和我的领导 所以没有第三种意见可以涉及 在我对这个项目有了足够的了解之后 我意识到整个结
  • 什么是无界数组?

    什么是无界数组 无界数组和动态分配数组有什么区别 与无界数组相关的常见操作有哪些 就像我们有堆栈数据结构的弹出和推送 无界数组可以 并且通常是 静态分配 实现无界数组时的主要关注点是提供类似动态数组的自由来在运行时决定数组大小 而不会因运行
  • 与序列化相比,使用 MarshalByRefObject 的成本有多高?

    在我的 Azure Web 角色代码中 我有一个CustomIdentity类派生自System Security Principal IIdentity 在某些时候 NET 运行时尝试序列化该类 and 序列化不起作用 试图解决我搜索了很
  • 为什么 range-for 找不到 std::istream_iterator 的 begin 和 end 重载?

    我有这样的代码 std ifstream file filename std ios base in if file good file imbue std locale std locale new delimeter tokens fo
  • 扩展此类以在列表视图中撤消/重做

    我正在使用第三方代码来管理 Windows 窗体项目中的撤消 重做操作 我需要扩展该类来管理列表视图中的撤消 重做操作 这意味着 撤消 重做添加 删除项目和子项目 撤消 重做检查 取消检查行 撤消 重做一些我可能错过的其他重要事情 我不知道
  • 环回模型中的动态属性或聚合函数

    我将如何在环回模型中使用聚合函数 如果我有一个由 mysql 数据库支持的模型 我是否可以让 Model1 与 Model2 具有 hasMany 关系 具有给定的数字属性 并在 Model1 中拥有一个从 Model2 获取该字段的 SU
  • 如何从 php 中的字符串中获取确定数量的单词?

    这就是我正在尝试做的事情 我有一段文本 我想从字符串中提取前 50 个单词 而不切断中间的单词 这就是为什么我更喜欢单词而不是字符 然后我可以使用 left 函数 我知道 str word count var 函数将返回字符串中的单词数 但
  • PL/SQL中如何查看变量的类型?

    PL SQL 中是否有函数可以显示变量的确切类型 例如 SQL 中的 DUMP 函数 我尝试过以下方法 DECLARE l variable INTEGER 1 BEGIN DBMS OUTPUT PUT LINE DUMP l varia
  • 单击文件上传按钮后出现延迟?

    当我单击 选择要上传的文件 即输入类型 文件 时 从单击按钮和选择文件到在按钮旁边显示所选文件之间存在延迟 浏览器是否正在尝试将文件加载到浏览器中 为什么有延迟 接下来 我如何显示 请稍候 消息立即地选择文件后 我尝试了各种 JQ 选项 似
  • javascript 如何判断对象是否存在于数组中

    我有一个 JavaScript 对象数组 与此类似的东西 var objectArray Name A Id 1 Name B Id 2 Name C Id 3 Name D Id 4 现在我试图找出一个对象是否具有给定的属性Name值存在
  • 如何在 jQuery 中选择“this”内的元素?

    我知道我可以这样选择一个元素 ul topnav gt li target css border 3px double red 但我该怎么做 this gt li target css border 3px double red this
  • 将图像存储到 Access 数据库的附件字段中

    我正在编写一个 VB 应用程序 需要在数据库中存储图像 用户在计算机上选择图像 这会以字符串形式提供路径 这是我的尝试 但是我收到错误 INSERT INTO 查询不能包含多值字段 这是我的代码 Dim buff As Byte Nothi
  • 从 SKlearn 决策树中检索决策边界线(x,y 坐标格式)

    我正在尝试在外部可视化平台上创建曲面图 我正在使用 iris 数据集sklearn 决策树文档页面 我还使用相同的方法来创建决策曲面图 但我的最终目标不是 matplot lib 视觉效果 因此从这里我将数据输入到我的可视化软件中 为此 我
  • 为什么我会收到 AttributeError: 'NoneType' object has no attribute 'something'?

    我收到一条错误消息 AttributeError NoneType object has no attribute something 我该如何理解这个消息 哪些一般情况可能会导致这种情况AttributeError 以及如何识别问题 Th
  • ROS AsyncSpinner 的多线程行为

    我试图了解 ROS 中的 AsyncSpinner 是如何工作的 因为我可能有一些误解 你可以找到类似的问题here As seen here它的定义提到 异步旋转器 产生几个线程 可配置 将并行执行回调 同时不会阻塞执行该操作的线程 叫它
  • 在 Laravel 中保存表单数据

    现在我有一个包含性别 选项和 user id 的表单 我的public function store Request request 看起来像这样 public function store Request request task new
  • Visual Studio 11 - 设计视图对于 x64 和 ARM 目标平台不可用,因为文档包含自定义元素

    我正在测试 Visual Studio 11 beta 看来我遇到了一个重大障碍 有人尝试过打开包含带有用户控件的 WPF 窗口的实际生产 WPF 项目吗 当我尝试打开包含用户控件的 WPF 窗口或控件时 设计视图会显示一条不错的错误消息
  • 如何在 WPF 中声明将 Itemsource 作为枚举值的组合框 itemTemplate?

    我有一个枚举可以说 enum MyEnum FirstImage SecondImage ThirdImage FourthImage 我已将此枚举绑定到 XAML 中的组合框 在定义组合框时 我定义了组合框的 ItemTemplate 以
  • React – 将表单元素状态传递给兄弟/父元素的正确方法?

    假设我有一个 React 类 P 它呈现两个子类 C1 和 C2 C1 包含一个输入字段 我将此输入字段称为 Foo 我的目标是让 C2 对食物的变化做出反应 我提出了两种解决方案 但都感觉不太正确 第一个解决方案 为 P 分配一个状态 s