返回
React ref 从原理到应用
前端
2023-12-28 17:09:38
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<h1>React ref 从原理到应用</h1>
<h2>前言</h2>
<p>
提到 ref 或者 refs,如果你用过 React 16 以前的版本,第一印象都是用来访问 DOM 或者修改组件实例的,正如官网所介绍的这样:
</p>
<blockquote>
React ref 属性是一个 ref 回调函数,回调函数接收单个参数:指向 DOM 元素或组件实例的 ref 对象。
</blockquote>
<p>
然后到了 React 16.3 出现的 createRef,以便于创建可变的 ref,也就是人们俗称的"可变 ref"或"动态 ref"。
</p>
<h2>原理</h2>
<p>
在 React 16 以前的版本中,ref 是一个字符串,它指向组件实例或 DOM 元素。在 React 16.3 中,ref 是一个对象,它有一个 current 属性,指向组件实例或 DOM 元素。
</p>
<p>
创建 ref 的方式也有所不同。在 React 16 以前的版本中,ref 是一个属性,它被传递给组件。在 React 16.3 中,ref 是一个函数,它被调用来创建 ref 对象。
</p>
<p>
例如,以下是如何在 React 16 以前的版本中使用 ref:
</p>
<code>
class MyComponent extends React.Component {
render() {
return <input ref="myInput" />;
}
}
</code>
<p>
以下是如何在 React 16.3 中使用 ref:
</p>
<code>
class MyComponent extends React.Component {
myInputRef = React.createRef();
render() {
return <input ref={this.myInputRef} />;
}
}
</code>
<p>
在 React 16.3 中,ref 对象的 current 属性指向组件实例或 DOM 元素。可以通过以下方式访问 ref 对象的 current 属性:
</p>
<code>
const myInputRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向 DOM 元素
componentDidMount() {
console.log(myInputRef.current); // DOM 元素
}
</code>
<h2>应用</h2>
<p>
ref 可以用于各种场景,例如:
</p>
<ul>
<li>访问 DOM 元素</li>
<li>修改组件实例</li>
<li>创建可变的 ref</li>
<li>在组件之间传递数据</li>
</ul>
<p>
以下是一些 ref 的具体应用场景:
</p>
<ul>
<li>
<strong>访问 DOM 元素:</strong>可以使用 ref 来访问 DOM 元素,然后对其进行操作。例如,以下是如何使用 ref 来获取输入框的值:
<br>
```
const myInputRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向 DOM 元素
componentDidMount() {
const value = myInputRef.current.value;
}
```
</li>
<li>
<strong>修改组件实例:</strong>可以使用 ref 来修改组件实例。例如,以下是如何使用 ref 来设置组件实例的状态:
<br>
```
const myComponentRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向组件实例
componentDidMount() {
myComponentRef.current.setState({ count: 1 });
}
```
</li>
<li>
<strong>创建可变的 ref:</strong>可以使用 ref 来创建可变的 ref。例如,以下是如何使用 ref 来创建可变的 ref,并将其传递给子组件:
<br>
```
const myRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向组件实例
componentDidMount() {
this.props.childComponentRef(myRef);
}
```
</li>
<li>
<strong>在组件之间传递数据:</strong>可以使用 ref 来在组件之间传递数据。例如,以下是如何使用 ref 来将数据从父组件传递给子组件:
<br>
```
// 父组件
const myRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向组件实例
componentDidMount() {
this.props.childComponentRef(myRef);
}
// 子组件
const myComponentRef = React.createRef();
// 在组件挂载后,ref 对象的 current 属性指向组件实例
componentDidMount() {
const data = myComponentRef.current.getData();
}
```
</li>
</ul>
<h2>总结</h2>
<p>
ref 是 React 中一个非常有用的工具,它可以用于各种场景。通过理解 ref 的原理和应用,我们可以更好地利用 ref 来构建复杂的 React 应用程序。
</p>
</body>
</html>