[web教学] React中ref的使用方法和使用场景(详解)

[复制链接]
查看1117 | 回复0 | 2023-8-23 11:52:15 | 显示全部楼层 |阅读模式 来自 中国北京
择要

不管在Vue中照旧React,如果我们想使用一个元素的DOM,不必要通过JS中使用DOM的方法,它们提供了一个专属的API就是ref。
而Vue中的ref大概比较简单,这一篇重要讲一下如安在React中使用ref,以及使用ref的场景。
1.ref的挂载

在React中,ref可以挂载到html元素上,同时也可以挂载在React元素上,看下面的代码:
  1. import React, { Component } from 'react'
  2. // import { findDOMNode } from 'react-dom'
  3. import Child from './Child'
  4. export default class Father extends Component {
  5.   componentDidMount(){
  6.     console.log(this.refs.refElement);
  7.     console.log(this.refs.child);
  8.   }
  9.   render() {
  10.     return (
  11.       <div>
  12.         <input ref={ 'refElement' }></input>
  13.         <Child ref={ 'child' }/>
  14.         <button onClick={this.fn}>123</button>
  15.       </div>
  16.     )
  17.   }
  18. }
复制代码
控制台的打印为:

可以看到,在React中,ref是可以挂载到HTML元素和React元素上的。
(1)挂载HTML元素,返回真实的DOM
(2)挂载React元素,返回render后的实例对象

同时React也提供了一个方法findDOMNode可以将React元素的ref返回变成真实的DOM元素。
  1.         import { findDOMNode } from 'react-dom'
  2.     console.log(findDOMNode(this.refs.child));
复制代码
同时在上面的代码我们也可以看出来,ref的挂载是在componentDidMount等生命周期之前实行的
2.使用ref的三种方式

(1)字符串的方式
  1. import React, { Component } from 'react'
  2. export default class Father extends Component {
  3.   componentDidMount(){
  4.     console.log(this.refs.refElement);
  5.   }
  6.   render() {
  7.     return (
  8.       <div>
  9.         <input ref={ 'refElement' }></input>
  10.         <button onClick={this.fn}>123</button>
  11.       </div>
  12.     )
  13.   }
  14. }
复制代码
这种方式和Vue的ref比较相似,但是官方现在已经不保举使用该方式,后续大概还会废弃。
(2)函数的方式
  1. import React, { Component } from 'react'
  2. export default class Father extends Component {
  3.   componentDidMount(){
  4.     console.log(this.refElement);
  5.   }
  6.   render() {
  7.     return (
  8.       <div>
  9.         <input ref={ ref => this.refElement = ref }></input>
  10.         <button onClick={this.fn}>123</button>
  11.       </div>
  12.     )
  13.   }
  14. }
复制代码
(3)react.CreateRef的方式
  1. import React, { Component } from 'react'
  2. export default class Father extends Component {
  3.   refElement = React.createRef();
  4.   componentDidMount(){
  5.     console.log(this.refElement.current);
  6.   }
  7.   render() {
  8.     return (
  9.       <div>
  10.         <input ref={this.refElement}></input>
  11.         <button onClick={this.fn}>123</button>
  12.       </div>
  13.     )
  14.   }
  15. }
复制代码
记住这内里通过refElement中的current,获取真实的DOM元素。
3.ref的使用场景

这里我们说一个比较常见的场景,就是点击按钮让输入框聚焦:
  1. import React, { Component } from 'react'
  2. export default class Father extends Component {
  3.   refElement = React.createRef();
  4.   componentDidMount(){
  5.     console.log(this.refElement.current);
  6.   }
  7.   fn = ()=>{
  8.     this.refElement.current.focus();
  9.   }
  10.   render() {
  11.     return (
  12.       <div>
  13.         <input ref={this.refElement}></input>
  14.         <button onClick={this.fn}>聚焦</button>
  15.       </div>
  16.     )
  17.   }
  18. }
复制代码
通过获取DOM后,调用DOM上的focus方法API,来让input框进行聚焦。
同时ref也可以适用于一些DOM元素的动画结果,比方移动,变大变小,都必要通过ref来控制DOM,进行操作。

来源:https://blog.csdn.net/weixin_46726346/article/details/127545244
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则