2017-02-19 15 views
6

Nie mogę automatycznie ustawić ostrości znacznika wejściowego renderowanego w tym komponencie. Czego tu mi brakuje?AutoFocus element wejściowy w celu reakcji JS

class TaskBox extends Component { 
    constructor() { 
    super(); 
    this.focus = this.focus.bind(this); 
    } 

    focus() { 
    this.textInput.focus(); 
    } 

    componentWillUpdate(){ 
    this.focus(); 
    } 

    render() { 
    let props = this.props; 
    return (
     <div style={{display: props.visible ? 'block' : 'none'}}> 
     <input 
     ref={(input) => { this.textInput = input; }} 
     onBlur={props.blurFN} /> 
     <div> 
      <div>Imp.</div> 
      <div>Urg.</div> 
      <div>Role</div> 
     </div> 
     <div> 
      <button>Add goal</button> 
     </div> 
     </div> 
    ) 
    } 
} 

Każda pomoc jest doceniana.

+0

Gdy jesteś renderowania bezstanową składnik, można po prostu dodać znak 'autoFocus' do elementu wejściowego i automatycznie ustawi ostrość w elemencie. –

Odpowiedz

6

Jest atrybut dostępny dla automatycznego ogniskowania autoFocus, możemy użyć dla automatycznego ogniskowania elementu wejściowego zamiast korzystania ref.

Korzystanie autoFocus z elementem wejściowym:

<input autoFocus />

Możemy również wykorzystać ref, ale z dopiskiem musimy wywołać metodę ostrości na właściwym miejscu, z którego dzwonisz, że w componentWillUpdate metody cyklu życia, że ​​metoda nie wyzwalane podczas wstępnego renderowania, zamiast tej metody użycie componentDidMount cyklem:

componentDidMount(){ 
    this.focus(); 
} 

shouldComponentUpdate: jest zawsze wywoływana przed metodą renderowania i umożliwia określenie, czy konieczne jest ponowne renderowanie, czy można je pominąć. Oczywiście ta metoda nigdy nie jest wywoływana przy renderowaniu początkowym. Zostanie wywołana tylko wtedy, gdy nastąpi zmiana stanu w komponencie.

componentWillUpdate zostaje wywołany, gdy tylko shouldComponentUpdate zwróci true.

componentDidMount: Natychmiast po wywołaniu metody renderowania wywoływana jest funkcja componentDidMount. Dostęp do DOM można uzyskać za pomocą tej metody, umożliwiając zdefiniowanie operacji DOM lub operacji pobierania danych. Wszelkie interakcje DOM powinny zawsze mieć miejsce w tym przypadku.

referencyjny: https://facebook.github.io/react/docs/react-component.html

+0

dokładnie! Właśnie to sobie uświadomiłem. Zaczął działać componentDidMount. Dlaczego nie możemy skupić się na componentWillUpdate? jeden jest przed renderowaniem, a drugi po nim, i to jest wyzwalane, aby zmienić stan. @mayank jest to, ponieważ składnik macierzysty był w trybie 'display: none' podczas renderowania? Oznacza to, że jeśli 'wyświetlamy: none' wejściowy znacznik HTML, a następnie ustawiamy go programowo, a po nim, wyświetlamy go (' display: block'), fokus nie działa. Czy dobrze myślę? – Ayan

+1

komponentWillUpdate nie zostanie wywołany przy pierwszym renderowaniu, składnik componentDidMount zostanie wywołany zaraz po renderowaniu, więc musisz skupić element wejściowy w tej metodzie, sprawdź zaktualizowaną odpowiedź :) –

+1

'componentDidMount' będzie wykonane tylko po' render() ' w fazie montowania cyklu życia. Tak, to jest poprawne tylko dla fazy "montażu". Dla cyklu życia aktualizacji nie jest poprawny. –

0

Ustaw identyfikator do wejścia, a następnie użyć .setAttribute('autoFocus', true) do elementu, gdy chcesz to koncentruje

Powiązane problemy