프로그래밍 방식으로 포커스 입력에 반응하는 방법
매우 간단한 사용 사례인 UI 기능을 구현하려고 합니다.
- 내용물이 들어 있는 라벨이 있습니다.
- 클릭하면 텍스트 입력이 사용 가능한 라벨의 내용으로 대체됩니다.
- 사용자는 콘텐츠를 편집할 수 있습니다.
- Enter 키를 누르면 입력이 숨겨지고 업데이트된 내용과 함께 레이블이 반환됩니다.
드디어 (사실 MongoBD 백엔드, 레덕스 등을 사용하여) 모든 것을 정확하게 할 수 있었고, 유일하게 할 수 없었던 것(구글 검색과 S.O 읽기 하루 종일 지불)을 할 수 있었습니다.F 유사 투고)는 다음과 같습니다.
텍스트 입력이 나타나면 포커스를 전송할 수 없습니다!처음에는 이렇게 피곤했어요.
<div className={((this.state.toggleWordEdit) ? '' : 'hidden')}>
<input id={this.props.word._id} className="form-control"
ref="updateTheWord"
defaultValue={this.state.word}
onChange={this.handleChange}
onKeyPress={this.handleSubmit}
autoFocus={this.state.toggleWordEdit}/></div>
<div className={((this.state.toggleWordEdit) ? 'hidden' : '')}>
<h3 onClick={this.updateWord}>
{this.state.word}</h3>
</div>
그러나 자동 포커스는 확실히 작동하지 않았습니다(양식이 렌더링되어 있지만 숨겨진 상태이기 때문에 자동 포커스를 사용할 수 없기 때문에 "추측"했습니다).
다음으로, 다음과 같이 시도했습니다.updateWor, 구글과 S.O.F.에서 찾은 많은 제안:
this.refs.updateTheWord.focus();
비슷한 제안도 있었지만 모두 효과가 없었습니다.그리고 리액트를 속여보고 뭔가 할 수 있는지 알아보려고 했어!실제 DOM 사용:
const x = document.getElementById(this.props.word._id);
x.focus();
그것도 효과가 없었어요.한 가지 말로 표현할 수 없는 것은 다음과 같은 제안입니다. "ref"를 메서드로 사용하는 것("추측") 저는 이러한 컴포넌트가 여러 개 있고 컴포넌트당 가치를 더 얻기 위해 ref가 필요하기 때문에 시도조차 하지 않았습니다.그리고 제 ref가 명명되지 않으면 어떻게 가치를 얻을 수 있을지 상상도 할 수 없었습니다.
(라벨을 교환하는 단일 입력 상자가 필요하기 때문에) 폼을 사용하지 않을 경우 CSS(부트스트랩) 클래스가 '숨김'이 없어졌을 때 포커스를 어떻게 설정할 수 있는지 이해시켜 주시겠습니까?
참조를 사용하는 방법이 가장 선호되는 방법이 아닙니다.그렇지 않으면 더 이상 베스트 프랙티스가 아닙니다.이런 방법을 시도해 보십시오.
class MyClass extends React.Component {
constructor(props) {
super(props);
this.focus = this.focus.bind(this);
}
focus() {
this.textInput.current.focus();
}
render() {
return (
<div>
<input
type="text"
ref={(input) => { this.textInput = input; }} />
<input
type="button"
value="Set Focus"
onClick={this.focus}
/>
</div>
);
}
}
갱신하다
React 16.3 이상에서는 API를 사용할 수 있습니다.
class MyClass extends React.Component {
constructor(props) {
super(props);
// create a ref to store the textInput DOM element
this.textInput = React.createRef();
this.focus = this.focus.bind(this);
}
focus() {
// Explicitly focus the text input using the raw DOM API
// Note: we're accessing "current" to get the DOM node
this.textInput.current.focus();
}
render() {
// tell React that we want to associate the <input> ref
// with the `textInput` that we created in the constructor
return (
<div>
<input
type="text"
ref={this.textInput} />
<input
type="button"
value="Set Focus"
onClick={this.focus}
/>
</div>
);
}
}
React 18.xx 이상에서는 후크를 사용할 수 있습니다.
import React, { useRef } from "react";
export const Form = () => {
const inputRef = useRef(null);
const focus = () => {
inputRef.current.focus();
};
return (
<div>
<input type="text" ref={inputRef} />
<input type="button" value="Set Focus" onClick={focus} />
</div>
);
};
자동 포커스 애트리뷰트를 추가하기만 하면input
(물론 들어가 있습니다)
<input autoFocus ...
useFocus 훅
// General Focus Hook
const useFocus = (initialFocus = false, id = "") => {
const [focus, setFocus] = useState(initialFocus)
const setFocusWithTrueDefault = (param) => setFocus(isBoolean(param)? param : true)
return ([
setFocusWithTrueDefault, {
autoFocus: focus,
key: `${id}${focus}`,
onFocus: () => setFocus(true),
onBlur: () => setFocus(false),
},
])
}
const FocusDemo = () => {
const [labelStr, setLabelStr] = useState("Your initial Value")
const [setFocus, focusProps] = useFocus(true)
return (
<> {/* React.Fragment */}
<input
onChange={(e)=> setLabelStr(e.target.value)}
value={labelStr}
{...focusProps}
/>
<h3 onClick={setFocus}>{labelStr}</h3>
</>
)
}
앞서 말한 답변 외에setTimeout
잘 되게 하다
handleClick() {
if (this.searchInput) {
setTimeout(() => {
this.searchInput.focus();
}, 100);
}
}
어디에searchInput
입력의 jsx ref 입니다.
<input
type="text"
name="searchText"
ref={(input) => { this.searchInput = input; }}
placeholder="Search" />
및 그handleClick()
는 입니다.onClick
임의의 요소에 대한 핸들러
@BenCarp의 답변(타자기본)
「 」를 .inputRef
input
하면 돼setFocus
점을맞맞 맞맞맞다다
export const useInputFocus = (): [MutableRefObject<HTMLInputElement | undefined>, () => void] => {
const inputRef = useRef<HTMLInputElement>();
const setFocus = (): void => {
const currentEl = inputRef.current;
if (currentEl) {
currentEl.focus();
}
};
return [inputRef, setFocus];
};
componentDidUpdate
componentDidUpdate(prevProps, prevState) {
this.input.focus();
}
"하여 입력 참조한 후 "useRef"를할 수 .reference.current.focus()
언급URL : https://stackoverflow.com/questions/43145549/how-react-programmatically-focus-input
'programing' 카테고리의 다른 글
Json 및 순환 참조 예외 (0) | 2023.03.04 |
---|---|
Wordpress - 이미지가 미디어 라이브러리에 표시되지 않음 (0) | 2023.03.04 |
React 앱을 서버의 서브 디렉토리에 번들하려면 어떻게 해야 합니까? (0) | 2023.03.04 |
이벤트 리스너 동적 추가 (0) | 2023.03.04 |
로컬 파일로 요청을 가져올 수 없습니다. (0) | 2023.02.27 |