如何在 ReactJS 渲染后将焦点设置到输入字段?
在使用React中的表单时,有时可能需要将焦点设置到任何输入字段。例如,我们希望仅当用户在输入字段中输入一些文本时才启用提交按钮。在这种情况下,我们可以将焦点设置到输入字段,以便用户知道他们必须在输入字段中输入一些文本才能启用按钮。
在本教程中,我们将学习在 ReactJS 渲染后将焦点设置到输入字段的多种方法。
使用 autoFocus 属性与输入字段
我们可以在 HTML 中使用autoFocus属性来将焦点设置到输入字段,但是我们需要使用驼峰式命名法,例如 autoFocus。
当我们将autoFocus属性传递到任何输入字段时,它会在 ReactJS 中渲染后自动获得焦点。
语法
用户可以按照以下语法使用autoFocus属性在 ReactJS 渲染后将焦点设置到输入字段。
<input id = "name" autoFocus />
在上面的语法中,我们创建了一个简单的输入字段并使用了autoFocus属性。
示例
在下面的示例中,我们创建了一个输入字段。此外,我们还将focusText变量绑定为输入字段的值。我们还使用 handleInput() 函数处理输入值。
由于我们在输入字段中添加了 autoFocus 属性,因此每当我们刷新网页时,它都会自动将焦点设置到输入字段。
#App.js
import React, { useState } from "react"; export default function App() { const [foucsText, setFocusText] = useState(true); function handleInput(event) { let value = event.target.value; setFocusText(value); } return ( <div className = "App"> <h2> {" "} Using the <i> autoFocus </i> attribute with an input field to set focus on input after rendering. {" "} </h2> <label for = "name"> Enter some text: </label> <br></br> <input id = "name" autoFocus onInput = {handleInput} value = {foucsText} /> </div> ); }
输出
使用 ref 和 componentDidMount() 方法
ref 允许我们将任何 HTML 元素的引用存储在变量中。因此,我们可以使用 ref 将输入元素存储在任何变量中。之后,我们可以使用 focus() 方法与变量一起将焦点设置到输入字段。
componentDidMount()方法是 ReactJS 中的生命周期方法。它会在组件渲染完成后自动执行。因此,我们可以使用输入变量中的 focus() 方法在componentDidMount()方法内设置渲染后的输入焦点。
语法
用户可以按照以下语法使用带有输入元素的 ref 将焦点设置到输入元素。
<input ref = {(inp) => { inp.focus(); }} />
在上面的语法中,我们使用了 ref,它将回调函数作为值,在回调函数中,我们使用了 focus() 方法来将焦点设置到输入元素。
示例
在下面的示例中,我们创建了两个输入元素。我们在第二个输入中使用了 ref,而第一个输入是普通的,没有 ref 属性。
ref 属性将回调函数作为值。回调函数接受一个参数,该参数引用使用了“ref”的输入。之后,我们可以使用该输入的 focus() 方法并将焦点设置到输入元素。
import React from "react"; class App extends React.Component { render() { return ( <div> <h2> {" "} Using the <i> refs </i> with an input field to set focus on input after rendering.{" "} </h2> <input defaultValue = "This input is not focused!" /> <br></br> <br></br> <input ref = {(inp) => { inp.focus(); }} defaultValue = "This is focused input!" /> </div> ); } } export default App;
输出
在上面的输出中,用户可以看到第一个输入未聚焦,第二个输入已聚焦。
示例
在下面的示例中,我们使用“ref”属性获取输入引用。之后,我们在类组件中使用了 componentDidMount() 方法,并在该方法中访问了输入并使用了 focus() 方法将焦点设置到该元素。
import React from "react"; class App extends React.Component { componentDidMount() { this.secondInput.focus(); } render() { return ( <div> <h2> {" "} Using the <i> refs and componentDidMount() method </i> with an input field to set focus on input after rendering.{" "} </h2> <input defaultValue = "This input is not focused!" ref = {(firstInp) => { this.firstInput = firstInp; }} /> <br></br> <br></br> <input ref = {(secondInput) => { this.secondInput = secondInput; }} defaultValue = "This is focused input!" /> </div> ); } } export default App;
输出
使用 ref 和 useRef() hook
如上所述,我们可以使用“ref”属性来获取元素的引用。useRef() 是函数组件中的一个 hook,它替代了类组件的生命周期方法。
我们可以使用 useEffect() hook 在渲染完成后将焦点设置到输入字段。
语法
用户可以按照以下语法使用 useRef() 和 useEffect() hook 在渲染后将焦点设置到输入字段。
useEffect(() => { input.current.focus(); }, []);
在上面的语法中,我们将回调函数作为第一个参数传递,它将焦点设置到输入字段,并将 [] 作为第二个参数,这意味着仅在渲染组件后设置一次焦点。
示例
在下面的示例中,首先,我们使用 useRef() 创建一个 ref 并将其存储在 testRef 变量中。之后,我们使用“ref”属性将输入的引用分配给 testRef 变量。
接下来,我们在 useEffect() hook 中使用 testRef 输入变量在渲染后将焦点设置到输入字段。
import React, { useState, useRef, useEffect } from "react"; export default function App() { const testRef = useRef(); useEffect(() => { testRef.current.focus(); }, []); const [foucsText, setFocusText] = useState(""); function handleInput(event) { let value = event.target.value; setFocusText(value); } return ( <div className = "App"> <h2> {" "} Using the <i> useEffect hooks </i> with an input field to set focus on input after rendering.{" "} </h2> <label for = "name">Enter some text: </label> <br></br> <input id = "name" ref = {testRef} onInput = {handleInput} value = {foucsText} /> </div> ); }