2014-12-30 8 views
11

Próbuję znaleźć bardziej przejrzysty sposób użycia klawiszy strzałek, aby przenieść ostrość w górę iw dół na liście wejść za pomocą przycisku React. Lista jest składnikiem macierzystym, dane wejściowe dzieci. Aby dowiedzieć się, jakie dane wejściowe należy skoncentrować w następnej kolejności, daję każdemu dziecku numer ref, a także numeryczne id, którego używam do śledzenia zamawiania. Po wykryciu klawisza strzałki wywołanie zwrotne odnajdzie dziecko o poprawnej ref i przejdzie do refs tego dziecka, aby pobrać dane wejściowe i ustawić ostrość.Czystszy sposób zmiany fokusu na elementach potomnych w React

Jestem nowy w React, to jest dość brudne, więc zastanawiam się, czy istnieje czystsze rozwiązanie.

oznaczeniu i jsfiddle pracy:

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/

+0

Nie byłoby łatwiej po prostu ustawić poprawny indeks tabulatorów na elementach wejściowych i pozwolić użytkownikowi na nawigację w polach wprowadzania klawiszem tabulacji (przesunięcie + tabulacja do tyłu), co jest standardowym sposobem wykonania tego. http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-tabindex –

+0

Dla tego konkretnego scenariusza naprawdę chciałem, aby klawisze strzałek działały, ale ogólnie karty są dobry pomysł – mikhuang

+0

twoje jsfiddle nie działa – Soorena

Odpowiedz

1

Istnieje kilka sposobów, aby to zrobić, ale nikt tak naprawdę są 'lepsze' niż to.

Alternatywy użyłyby mixin, ale to przyniesie mentalny koszt abstrakcji czarnego pudełka za niewielki zysk. Po prostu zachowam to, jak jest.

+0

To wydaje się być w porządku. Wydaje się, że zbędne jest deklarowanie oddzielnego "identyfikatora", gdy są tam zarówno 'ref' i' key'. Dzięki! – mikhuang

+0

można wyodrębnić "niektóre z tego z czymś takim jak: handleFocus = {this.handleFocus.bind (i)}, a następnie w handleFocus funkcja akceptuje dodatkowy parametr wskazujący kierunek – BenG

Powiązane problemy