私は非常に単純なユースケース、UI機能を実装しようとしています。
最終的にすべてが正しくなりました(実際にはMongoBDバックエンド、リデュースなど)。そして、私ができなかった唯一のこと(グーグルで1日を支払い、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>
しかし、autoFocusは確かに機能しませんでした(フォームがレンダリングされるため「推測」されますが、非表示の状態なので、autoFocusは役に立たなくなります)。
次に、this.updateWorで試しました。GoogleやS.O.Fで見つけた提案の多くです。
this.refs.updateTheWord.focus();
同様の提案と一緒にすべてが機能しませんでした。また、Reactをだまそうとして、何かできるかどうかを確認しました。私は実際のDOMを使用しました:
const x = document.getElementById(this.props.Word._id);
x.focus();
そしてそれも機能しませんでした。 Wordに入れることさえ理解できなかったことの1つは、次のような提案です。 メソッドとしてrefを持っている(I "guess") これらのコンポーネントが複数あるため、試してさえいませんでした。コンポーネントごとにさらに値を取得するにはrefが必要です。また、refに名前が付けられていない場合、どのように値を取得できるか想像できませんでした。
フォームを使用していない場合(ラベルを置き換える単一の入力ボックスが必要なため)、CSS(ブートストラップ)クラスが失われているときにフォーカスを設定する方法を理解するのに役立つアイデアを教えてください隠してください?
Refの使用方法は、最も推奨される方法ではなく、ベストプラクティスでもありません。このようなことを試してください
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.以降ではReact.createRef()
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>
);
}
}
autofocus 属性をinput
に追加するだけです。 (もちろんJSX
ではautoFocus
)
<input autoFocus ...
コンポーネントを更新するたびにcomponentDidUpdate
メソッドを使用します
componentDidUpdate(prevProps, prevState) {
this.input.focus();
}
// 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>
</>
)
}
より完全なデモについては、[ここをクリック] [1]をクリックしてください。
以前の回答に加えて、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
ハンドラーです