Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React.js道具是否仅用于在组件之间传递数据?_Javascript_Reactjs - Fatal编程技术网

Javascript React.js道具是否仅用于在组件之间传递数据?

Javascript React.js道具是否仅用于在组件之间传递数据?,javascript,reactjs,Javascript,Reactjs,我有一个拥有许多子组件的组件。在render()。在这个循环中,我检查每个项目,看它是否是“特殊的一个”。如果是,则将其存储在变量中 之所以这样做,是因为componentDidMount定义了一个频繁引用的事件处理程序,它需要对特殊项进行引用(并且不希望重复遍历所有项) 在React中,将此引用存储在this.props.specialItem或this.specialItem中是否惯用 以下是psuedocode中的情况示例: var ItemList = React.createClass

我有一个拥有许多子组件的组件。在
render()。在这个循环中,我检查每个项目,看它是否是“特殊的一个”。如果是,则将其存储在变量中

之所以这样做,是因为
componentDidMount
定义了一个频繁引用的事件处理程序,它需要对特殊项进行引用(并且不希望重复遍历所有项)

在React中,将此引用存储在
this.props.specialItem
this.specialItem
中是否惯用

以下是psuedocode中的情况示例:

var ItemList = React.createClass({
  componentDidMount: function() {
    $(document).keydown(function(e) {
      if (e.which === 27) {
        this.setState({ currentItem: this.specialItem });
        return;
      }
    }.bind(this));
  },

  render: function() {
    var items = _.map(this.state.data, function(item) {
      if (!this.specialItem && this.isSpecial(item)) {
        ////////////////////////////////////////////////////
        this.specialItem = item;
        // or should this be this.props.specialItem ?
        ////////////////////////////////////////////////////
      }
      // ...
    }.bind(this));
  }
});

查看您的伪代码,我们知道一些事情:

  • this.state.data
    是一个项目数组
  • this.isSpecial(item)
    告诉我们某个项目是否是特殊的
  • 按Esc键时,我们要将
    状态.currentItem
    设置为特殊项
这样,我们就可以从渲染函数中删除这个特殊的逻辑,并且只在我们的按键处理程序中使用它

componentDidMount: function(){
    $(document).keydown(function(e) {
        if (e.which === 27) {
            var special = this.state.data.find(this.isSpecial);
            this.setState({currentItem: special});
        }
    }.bind(this));
}
这确实依赖于,这是懒惰的(因此效率更高),我们只在用户按下Esc键时进行此检查。。。这可能比调用渲染函数的频率要低得多

如果用户经常点击此键,则将其存储在
this.specialItem
组件将接收道具中,性能可能会稍好一些


在React中,将此引用存储在this.props.specialItem或this.specialItem中是否惯用

千万不要用
this.props.anything=something
设置道具


和往常一样,不要忘记删除
组件中的事件处理程序WillUnmount

我同意将特殊项的查找理想地放在事件处理程序中,但在这种情况下,
render
已经循环了所有项,
this.isSpecial()
是一种非常便宜的查找,我希望用户点击事件处理程序的频率比psuedocode可能建议的要高:)无论如何,这都是很好的建议,您回答了我的问题。非常感谢你!