【问题标题】:Cleaner way to change focus on child components in React在 React 中改变对子组件的关注的更简洁的方法
【发布时间】:2015-02-26 22:43:20
【问题描述】:

我正在尝试找出一种更简洁的方法来使用箭头键在使用 React 的输入列表中上下移动焦点。列表是父组件,输入是子组件。为了弄清楚接下来应该关注什么输入,我给每个孩子一个ref 以及一个我用来跟踪排序的数字id。当检测到箭头键时,回调会找到具有正确ref 的孩子并进入该孩子的refs 以获取输入并为其提供焦点。

我是 React 的新手,感觉很脏,因此我想知道是否有更清洁的解决方案。

代码和工作 jsfiddle:

var Child = React.createClass({
    handleUp: function(e) {
        switch(e.key) {
            case "ArrowDown":
                this.props.handleFocus(this.props.id+1);
            break;
            case "ArrowUp":
                this.props.handleFocus(this.props.id-1);            
            break;
        }
    },
    render: function() {
        return <div><input defaultValue={this.props.name} onKeyUp={this.handleUp} ref="input" /></div>;
    }
});

var Parent = React.createClass({
    handleFocus: function(id) {
        var child = this.refs['child' + id];
        if (!child) return;
        var input = child.refs.input;
        input.getDOMNode().focus();
    },
    render: function() {
        var inputs = [];
        for (var i=0; i<10; i++) {
            inputs.push(<Child key={i} id={i} name={"value" + i} handleFocus={this.handleFocus} ref={'child' + i} />);
        }
        return <div>
            {inputs}
        </div>;
    }
});

http://jsfiddle.net/69z2wepo/509/

【问题讨论】:

  • 对于这种特殊情况,我真的想让箭头键采取行动,但总的来说,标签是个好主意
  • 你的 jsfiddle 不起作用

标签: focus reactjs


【解决方案1】:

有几种方法可以做到这一点,但没有比这更“更好”的了。

替代方案会使用 mixin,但这会带来黑盒抽象的心理成本,而收益甚微。我会保持原样。

【讨论】:

  • 这似乎很公平。当refkey 都存在时,声明一个单独的id 似乎是多余的。谢谢!
  • 你可以抽象出“其中一些类似的东西:handleFocus={ this.handleFocus.bind(i) },然后在你的handleFocus函数中接受一个额外的参数来指示方向
猜你喜欢
  • 2021-07-25
  • 2017-10-04
  • 2021-04-22
  • 2016-11-09
  • 2011-06-13
  • 2017-05-02
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多