如何在ReactJS中创建refs
在ReactJS中,refs用于引用文档中的任何节点。通常情况下,我们可以将props传递给子元素,以通过父组件的状态与子元素交互。然而,有时候子组件不在典型的组件数据流之内。例如,我们有四个组件,数据流是第二个组件是第一个组件的子组件,第三个组件是第二个组件的子组件,第四个组件是第三个组件的子组件。为了从第一个组件与第四个组件交互,从每个组件传递props并不是好的做法。所以,我们可以使用refs来直接从第一个组件与第四个组件交互。
在本教程中,我们将学习两种使用refs引用DOM元素的方法。
通过React.createRef()和useRef() hooks来创建refs
在ReactJs中,创建refs的第一种方法是对于类组件使用React.CreateRef(),对于函数组件使用useRef() hooks。在组件中创建ref变量之后,我们可以将其作为ref属性的值分配给任何HTML元素。因此,它可以包含元素的引用。
语法
用户可以按照下面的语法使用React.Createref()在类组件中创建ref。
this.InputElement = React.createRef();
<input type = "text" ref = {this.InputElement} id = "text" />
在上面的语法中,我们创建了InputElement ref并将其分配给input。
用户可以按照以下语法使用useRef()钩子在功能组件中创建ref。
const input = useRef(null);
<input type = "text" ref = {input} />
在上面的语法中,我们使用useRef()创建了输入的引用,并引用了文本输入框。
示例
在下面的示例中,我们创建了包含文本输入框的类组件。在类组件的构造函数中,我们创建了InputElement的引用和state对象。
此后,当用户点击按钮时,它会执行getInputValue()方法,该方法使用引用来获取输入的值。
import React from "react";
class App extends React.Component {
constructor(props) {
super(props);
//creating refs to access input elements
this.InputElement = React.createRef();
this.getInputValue = this.getInputValue.bind(this);
this.state = {
text: "",
};
}
// method to get texts from the input
getInputValue(e) {
e.preventDefault();
this.setState({ text: this.InputElement.current.value });
}
render() {
return (
<div>
{/* use the ref attribute */}
<h2> Using the refs with class components </h2>
<p>Enter some text below:</p>
<input type = "text" ref = {this.InputElement} id = "text" />
<br></br>
<div> The submitted value is {this.state.text}. </div>
<button onClick = {this.getInputValue}> Click here </button>
</div>
);
}
}
export default App;
输出
示例
在下面的示例中,我们使用了功能组件的refs。在这里,我们使用了userRef() hooks来创建一个输入ref。然后,我们使用ref属性与HTML输入一起使用,并引用了输入ref。
接下来,我们使用ref来获取输入的值,就像第一个示例中一样。
import { useState } from "react";
import { useRef } from "react";
export default function App() {
const input = useRef(null);
const [value, setValue] = useState("");
function handleClick() {
let value = input.current.value;
setValue(value);
}
return (
<div>
<h2>
{" "}
Using the refs with functional components
</h2>
<input type = "text" ref = {input} />
<br></br>
<div> The value you have entered in the text input is {value}.</div>
<input type = "button" value = "Submit Text" onClick = {handleClick} />
</div>
);
}
输出
通过回调函数创建引用
作为开发者,如果你想写出更可读和清晰的代码来创建引用,你应该使用回调引用。元素的’refs’属性接受一个回调函数作为值,而不是一个引用变量。之后,我们可以将元素作为回调函数的第一个参数获取,并可以使用它来将焦点设置在该元素上或执行其他操作。
语法
用户可以使用以下语法通过回调函数来创建引用。
input type = "text" ref = {(ele) => {
this.input = ele;
};
} />
在上面的语法中,input是组件中声明的一个变量,而ele指的是input元素本身。
示例
在下面的示例中,我们可以使用回调函数来创建refs。首先,在构造函数中创建了input变量,并将其初始化为null值。然后,将setRef回调函数作为input元素的refs属性的值传递进去。
refs属性调用setRef()函数,将input元素的引用存储到input变量中,我们可以在getTextInput()方法中访问input变量的值。
import React from "react";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
text: "",
};
this.input = null;
this.setRef = (ele) => {
this.input = ele;
};
this.getTextValue = () => {
this.setState({ text: this.input.value });
};
}
render() {
return (
<div>
{/* use the ref attribute */}
<h2> Using the callback refs in ReactJS </h2>
<input type = "text" ref = {this.setRef} id = "text" />
<br></br>
<div> The submitted value is {this.state.text}. </div>
<button onClick = {this.getTextValue}> Click here </button>
</div>
);
}
}
export default App;
输出
使用refs与子组件交互
引入refs可以在子组件中与父组件进行交互。在这里,我们将在子组件和父组件中创建ref,并通过父组件与子组件的元素进行交互。
语法
用户可以按照以下语法使用refs从父组件与子组件进行交互。
// access refs of the child component
this.childClassRef.current.testRef.current.focus();
return <Child ref={this.childClassRef} />;
在上面的语法中,我们传递了ref给子组件,并访问了子组件的ref。
示例
文件名 – App.js
在App.js文件中,我们导入了子组件并将ref作为prop传递。childClassRef指的是子组件。此外,用户可以看到我们如何在componentDidMount()方法中访问子组件的ref。
testRef ref被声明在子组件中,通过这种方式,我们可以从父组件中访问子组件的ref。
import React from "react";
import Child from "./Child";
class App extends React.Component {
constructor(props) {
super(props);
this.childClassRef = React.createRef();
}
componentDidMount() {
this.childClassRef.current.testRef.current.focus();
}
render() {
return <Child ref = {this.childClassRef} />;
}
}
export default App;
文件名 – Child.js
在 Child.js 文件中,我们使用 React.createRef() 创建了 testRef 引用,并引用了输入元素。
import React from "react";
import { Component } from "react";
class Child extends Component {
constructor(props) {
super(props);
this.testRef = React.createRef();
}
render() {
return (
<div>
<h3> This is a child component. </h3>
<input type = "text" ref = {this.testRef} />
</div>
);
}
}
export default Child;
输出
在上述输出中,用户可以观察到,无论何时刷新页面,应用程序都会将焦点放在父组件的子组件输入元素上。