[javascript] 렌더링 후 입력 필드에 초점을 설정하는 방법은 무엇입니까?

구성 요소가 렌더링 된 후 특정 텍스트 필드에 포커스를 설정하는 반응 방식은 무엇입니까?

문서는 다음과 같은 참조 사용을 제안하는 것 같습니다.

ref="nameInput"render 함수에서 입력 필드에 설정 한 후 다음을 호출하십시오.

this.refs.nameInput.getInputDOMNode().focus(); 

하지만 어디로 전화해야합니까? 몇 곳을 시도했지만 제대로 작동하지 않습니다.



답변

당신은 그것을해야 componentDidMount하고 refs callback대신. 이 같은

componentDidMount(){
   this.nameInput.focus(); 
}

class App extends React.Component{
  componentDidMount(){
    this.nameInput.focus();
  }
  render() {
    return(
      <div>
        <input 
          defaultValue="Won't focus" 
        />
        <input 
          ref={(input) => { this.nameInput = input; }} 
          defaultValue="will focus"
        />
      </div>
    );
  }
}
    
ReactDOM.render(<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.1/react-dom.js"></script>
<div id="app"></div>


답변

@Dhiraj의 답변은 정확하며 편의상 autoFocus 소품을 사용하여 마운트 할 때 입력에 자동으로 초점을 맞출 수 있습니다.

<input autoFocus name=...

jsx에서는 autoFocus대소 문자를 구분하지 않는 일반 오래된 HTML과 달리 (자본 F)입니다.


답변

React 0.15 에서 가장 간결한 방법은 다음과 같습니다.

<input ref={input => input && input.focus()}/>


답변

마운트에 집중

요소를 마운트 (초기 렌더링) 할 때 요소에 초점을 맞추려면 autoFocus 속성을 사용하면됩니다.

<input type="text" autoFocus />

다이나믹 포커스

포커스를 동적으로 제어하려면 일반 함수를 사용하여 구성 요소에서 구현 세부 정보를 숨 깁니다.

React 16.8 + 기능적 구성 요소-초점 후크 사용

const FocusDemo = () => {

    const [inputRef, setInputFocus] = useFocus()

    return (
        <>
            <button onClick={setInputFocus} >
               FOCUS
            </button>
            <input ref={inputRef} />
        </>
    )

}
const useFocus = () => {
    const htmlElRef = useRef(null)
    const setFocus = () => {htmlElRef.current &&  htmlElRef.current.focus()}

    return [ htmlElRef, setFocus ]
}

전체 데모

반응 16.3 + 클래스 구성 요소-활용

class App extends Component {
  constructor(props){
    super(props)
    this.inputFocus = utilizeFocus()
  }

  render(){
    return (
      <>
          <button onClick={this.inputFocus.setFocus}>
             FOCUS
          </button>
          <input ref={this.inputFocus.ref}/>
      </>
    )
  }
}
const utilizeFocus = () => {
    const ref = React.createRef()
    const setFocus = () => {ref.current &&  ref.current.focus()}

    return {setFocus, ref}
}

전체 데모


답변

React에서 자동 초점을 만들고 싶다면 간단합니다.

<input autoFocus type="text" />

해당 코드를 어디에 둘 것인지 알고 싶다면 componentDidMount ()에 답하십시오.

v014.3

componentDidMount() {
    this.refs.linkInput.focus()
}

대부분의 경우 참조를 DOM 노드에 첨부하고 findDOMNode를 전혀 사용하지 않아도됩니다.

https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode 에서 API 문서를 읽으십시오.


답변

React 16.3 은 컴포넌트 생성자에 참조를 생성하고 아래와 같이 사용하여이를 처리하는 편리한 방법을 새로 추가했습니다.

class MyForm extends Component {
  constructor(props) {
      super(props);

      this.textInput = React.createRef();
  }

  componentDidMount() {
    this.textInput.current.focus(); // one important change here is that we need to access the element via current.
  }

  render() {
    // instead of using arrow function, the created ref can be used directly.
    return(
      <div>
        <input ref={this.textInput} />
      </div>
    );
  }
}

자세한 내용 은 React 블로그 에서이 기사 를 확인할 수 있습니다 .

최신 정보:

반작용부터 출발 16.8 , useRef후크는 동일한 결과를 달성하기 위해 기능 요소에 사용될 수있다 :

import React, { useEffect, useRef } from 'react';

const MyForm = () => {
  const textInput = useRef(null);

  useEffect(() => {
    textInput.current.focus();
  }, []);

  return (
    <div>
      <input ref={textInput} />
    </div>
  );
};


답변

반응 난 그냥이 문제에 달려 내가 사용하고 15.0.1 15.0.2을 내가 ES6 구문을 사용하고 있는데 꽤 15 절은 몇 주 전에 떨어 이후로는 다른 답변에서 필요한 것을 얻을하지 않았다 this.refs특성을 더 이상 사용되지 않고 제거되었습니다 .

일반적으로 필요한 것은 다음과 같습니다.

  1. 구성 요소가 장착 될 때 첫 번째 입력 (필드) 요소의 초점을 맞 춥니 다
  2. 오류가있는 첫 번째 입력 (필드) 요소에 초점을 맞 춥니 다 (제출 후)

나는 사용하고있다 :

  • 반응 컨테이너 / 프레젠테이션 구성 요소
  • 리덕스
  • 반응 라우터

첫 번째 입력 요소에 집중

페이지 autoFocus={true}의 첫 번째 부분 <input />을 사용 하여 구성 요소가 마운트 될 때 포커스를 얻습니다.

오류가있는 첫 번째 입력 요소에 초점 맞추기

시간이 더 걸리고 더 복잡해졌습니다. 간결한 솔루션과 관련이없는 코드를 보관하고 있습니다.

Redux Store / 주

포커스를 설정해야하는지, 포커스를 설정해야하는지 확인하려면 전역 상태가 필요하므로 구성 요소를 다시 렌더링 할 때 포커스를 다시 설정하지 않습니다 ( componentDidUpdate()포커스 설정을 확인하는 데 사용합니다). )

응용 프로그램에 적합하게 설계 될 수 있습니다.

{
    form: {
        resetFocus: false,
    }
}

컨테이너 구성 요소

구성 요소 resetfocus에 포커스를 설정 하면 속성을 설정하고 속성을 지우려면 콜백 이 필요 합니다.

또한 내 프로젝트는 상당히 크기 때문에 액션 크리에이터를 별도의 파일로 구성했으며 더 관리하기 쉬운 덩어리로 나누고 싶었습니다.

import { connect } from 'react-redux';
import MyField from '../presentation/MyField';
import ActionCreator from '../actions/action-creators';

function mapStateToProps(state) {
    return {
        resetFocus: state.form.resetFocus
    }
}

function mapDispatchToProps(dispatch) {
    return {
        clearResetFocus() {
            dispatch(ActionCreator.clearResetFocus());
        }
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(MyField);

프리젠 테이션 컴포넌트

import React, { PropTypes } form 'react';

export default class MyField extends React.Component {
    // don't forget to .bind(this)
    constructor(props) {
        super(props);
        this._handleRef = this._handleRef.bind(this);
    }

    // This is not called on the initial render so
    // this._input will be set before this get called
    componentDidUpdate() {
        if(!this.props.resetFocus) {
            return false;
        }

        if(this.shouldfocus()) {
            this._input.focus();
            this.props.clearResetFocus();
        }
    }

    // When the component mounts, it will save a 
    // reference to itself as _input, which we'll
    // be able to call in subsequent componentDidUpdate()
    // calls if we need to set focus.
    _handleRef(c) {
        this._input = c;
    }

    // Whatever logic you need to determine if this
    // component should get focus
    shouldFocus() {
        // ...
    }

    // pass the _handleRef callback so we can access 
    // a reference of this element in other component methods
    render() {
        return (
            <input ref={this._handleRef} type="text" />
        );
    }
}

Myfield.propTypes = {
    clearResetFocus: PropTypes.func,
    resetFocus: PropTypes.bool
}

개요

일반적인 아이디어는 오류가있을 수 있고 집중 될 수있는 각 양식 필드가 자체를 점검하고 자체에 초점을 설정해야하는지 여부입니다.

주어진 필드가 포커스를 설정하기에 적합한 필드인지 확인하기 위해 발생해야하는 비즈니스 로직이 있습니다. 개별 응용 프로그램에 따라 다르므로 표시되지 않습니다.

양식이 제출되면 해당 이벤트는 글로벌 포커스 플래그 resetFocus를 true 로 설정해야 합니다. 그런 다음 각 구성 요소가 자체적으로 업데이트 될 때 포커스가 있는지 확인하고, 그렇다면 포커스를 재설정하기 위해 이벤트를 전달하여 다른 요소가 계속 확인하지 않아도됩니다.

편집
보조 노트로서, 나는 “유틸리티”파일에 내 비즈니스 로직을했고 난 그냥 각 내에서 방법을 수출하고 호출 shouldfocus()하는 방법.

건배!