首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有React子组件的封装

带有React子组件的封装
EN

Stack Overflow用户
提问于 2015-06-15 08:11:15
回答 1查看 1.6K关注 0票数 1

一个子组件的访问状态(仅仅是状态,而不是反应状态)应该如何反应?

我已经构建了一个小的。在其中,我曾经有一个组件显示了所选选项的列表和一个按钮,以允许编辑这些选项。单击该按钮将打开一个Modal,其中包含一组复选框,每个选项都有一个。模态是它自己的反应成分。显示所选选项的顶层组件和编辑它们的按钮拥有状态,而Modal则使用道具呈现。一旦Modal被取消,我希望获得复选框的状态来更新父对象的状态。为此,我使用the调用子对象'getSelectedOptions‘上的一个函数,该函数为我返回一些JSON,以标识所选的选项。因此,当选择Modal时,它会调用从父函数传入的回调函数,然后向Modal请求所选的新选项集。

下面是我的代码的简化版本

代码语言:javascript
复制
OptionsChooser = React.createClass({
  //function passed to Modal, called when user "OK's" their new selection
  optionsSelected: function() {
    var optsSelected = this.refs.modal.getOptionsSelected();
    //setState locally and save to server...
  },

  render: function() {
    return (
      <UneditableOptions />
      <button onClick={this.showModal}>Select options</button>
      <div>
        <Modal 
          ref="modal" 
          options={this.state.options} 
          optionsSelected={this.optionsSelected} 
        />
      </div>
      );
  }
});

Modal = React.createClass({
  getOptionsSelected: function() {
    return $(React.findDOMNode(this.refs.optionsselector))
      .find('input[type="checkbox"]:checked').map(function(i, input){
        return {
          normalisedName: input.value
        };
      }
     );
   },

  render: function() {
    return (
      //Modal with list of checkboxes, dismissing calls optionsSelected function passed in
    );
  }
});

这使Modal的UI的实现细节对父程序隐藏起来,这在我看来是一个很好的编码实践。然而,我被告知,以这种方式使用refs可能是不正确的,我应该以某种方式传递状态,或者让父组件访问复选框本身。我还是比较新的反应,所以想知道在这种情况下是否有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-15 11:23:08

是啊,你真的不想用这样的裁判。相反,一种方法是向Modal传递一个回调:

代码语言:javascript
复制
OptionsChooser = React.createClass({
  onOptionSelect: function(data) {

  },

  render: function() {
    return <Modal onClose={this.onOptionSelect} />
  }
});

Modal = React.createClass({

  onClose: function() {
    var selectedOptions = this.state.selectedOptions;
    this.props.onClose(selectedOptions);
  },

  render: function() {
    return ();
  }
});

也就是说,孩子调用一个通过道具传入的函数。而且,你得到的选择的方式看起来过于挑剔。相反,您可以有一个函数,当复选框被勾选时运行,并将选择存储在Modal状态。

解决此问题的另一个解决方案可能是使用Flux模式,在这种模式中,您的子组件用数据触发一个操作,并将其中继到存储区,您的顶级组件会监听该存储。不过,这有点超出了这个问题的范围。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30840258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档