Более чистый способ изменить ориентацию на дочерние компоненты в Реагировании

Я пытаюсь найти более чистый способ использовать клавиши со стрелками для перемещения фокуса вверх и вниз в списке входов с использованием 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/

Ответ 1

Есть несколько способов сделать это, но ни один из них не "лучше", чем этот.

Альтернативы будут использовать mixin, но это приносит ментальную стоимость абстракции черного ящика для небольшого выигрыша. Я бы просто сохранил его, как есть.