我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React操作DOM之forwardRef问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React操作DOM之forwardRef问题

React操作DOM之forwardRef

React操作DOM有几种方式,传入字符串,传入一个对象(react推荐的方式),传入一个函数,今天就讲一下使用react封装过的高阶组件forwardRef来操作DOM

首先导入

import React, { PureComponent,createRef,forwardRef } from 'react'

然后const一个函数组件,将它作为App的子组件

const Profile = forwardRef(function (props,ref){
  return <h2 ref={ref}>Profile</h2>
})

定义App组件

export default class App extends PureComponent {
  constructor(props){
    super(props);
    this.profileRef = createRef()
  }
  render() {
    return (
      <div>
        <Profile ref={this.profileRef} name={'lsh'}/>
        <button onClick={e=>this.printRef()}>点击</button>
      </div>
    )
  }
  printRef(){
    console.log(this.profileRef.current)
  }
}

当我们点击按钮时候

用这个的好处是什么?因为我们之前操作dom,函数式组件是不行的,因为它没有实例,用这个高阶组件就能完美解决这个问题

React forwardRef使用方法

作用与注意点

  • 传递ref,把自身的ref绑定到其他地方(e.g. 你把文件交给总裁秘书,总裁秘书把文件交给总裁)
  • ref 和 key 有点特殊,不会作为props参数向下传递,this.props拿不到ref对象
  • 函数组件是没有实例的,可以用useImperativeHandle实现部分功能
  • 高阶组件需做特殊处理

父 -> 子 -> 子(Dom)

import React, { useRef } from 'react';
import Content from './content';

const Home = () => {
  // 创建一个Ref对象
  const connectRef = useRef(null);

  const handleFoucus = () => {
    const _ref = connectRef.current;
    _ref.focus();
  };

  return (
    <div>
        <button onClick={() => handleFoucus()}>
          使用子组件中DOM元素的方法
        </button>

        <Content ref={connectRef} />
    </div>
  );
};

export default Home;
import React, { forwardRef } from 'react';


const Content = (props, ref) => {
  return (
    <div>
   	  {}
      <input type="password" ref={ref} />
    </div>
  )
};

export default forwardRef(Content);

父 -> 子 -> 子(class)

import React, { useRef } from 'react';
import Content from './content';

const Home = () => {
  // 创建一个Ref对象
  const connectRef = useRef(null);

  const handleAdd = () => {
    const _ref = connectRef.current;

    const { count } = _ref.state;
    _ref.setState({
      count: count + 1
    })
  };

  return (
    <div>
        <button onClick={() => handleAdd()}>
          使用子组件中class组件的属性和方法
        </button>

        <Content ref={connectRef} />
    </div>
  );
};

export default Home;
import React, { forwardRef } from 'react';
import Header from './header';
import Footer from './footer';


const Content = (props, ref) => {
  return (
    <div>
      {}
      <Header ref={ref} />  {}
		
      {}
    </div>
  )
};

export default forwardRef(Content)
import React from 'react';

export default class Header extends React.Component {
  state = {
    count: 0
  };

  render() {
    return (
      <div>
        {this.state.count}
      </div>
    )
  }
};

高阶组件中的特殊情况

  • 高阶组件本质是函数,参数为组件,返回值是新组件(增强过的组件)
  • 高阶组件会把所有接收到的props,传递给被包装的组件(透传)
  • ref 和 key 类似,不是一个prop,所以不会透传,ref会绑定到外层的高阶组件上
  • 高阶组件可以嵌套多层,e.g. Hoc1(Hoc2(Hoc3(Content)))

所以为了把ref传递给最里面的组件,有两种方法

  • 在最外层用 forwardRef 对 ref 对象进行处理,ref -> ref -> props.key = ref
  • 不用 ref,用自定义props承载 ref 对象,props.key = ref

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React操作DOM之forwardRef问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React操作DOM之forwardRef问题

这篇文章主要介绍了React操作DOM之forwardRef问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-02

React操作DOM之forwardRef问题怎么解决

本篇内容主要讲解“React操作DOM之forwardRef问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React操作DOM之forwardRef问题怎么解决”吧!React操作D
2023-07-05

解决react-connect中使用forwardRef遇到的问题

这篇文章主要介绍了解决react-connect中使用forwardRef遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-20

React怎么使用refs操作DOM

本文小编为大家详细介绍“React怎么使用refs操作DOM”,内容详细,步骤清晰,细节处理妥当,希望这篇“React怎么使用refs操作DOM”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在react框架 甚至
2023-07-04

react中的DOM操作怎么实现

这篇“react中的DOM操作怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“react中的DOM操作怎么实现”文章吧
2023-06-05

react中的DOM操作的实现方法

本篇内容介绍了“react中的DOM操作的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前面的话使用场景ref【HTML元素】【
2023-06-20

React使用refs操作DOM方法详解

React核心就在于虚拟DOM,也就是在React中不总是直接操作页面真实的DOM元素,并且结合Diffing算法,可以做到最小化页面重绘,有些时候不可避免的我们需要一种方法可以操作我们定义的元素标签,并作出对应的修改。在React中提供了一种访问DOM节点的方式,也就是这里的refs
2022-11-13

linux操作之重定向问题

目录一、概述二、输出重定向三、输入重定向1、命令解析2、实例解析四、深入理解重定向1、简介2、命令详解五、Here Document1、语法2、实例解析总结linux中的重定向也就是Shell中学习到的输入/输出重定向,这是我们运用Shel
2023-04-26

React组件渲染后对DOM的操作方式

这篇文章主要介绍了React组件渲染后对DOM的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-13

React移动端项目之pdf预览问题

这篇文章主要介绍了React移动端项目之pdf预览问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-12

java 操作 ad出现问题

如果您在使用Java操作AD数据库时遇到问题,可以尝试以下步骤来解决问题:1. 检查连接设置:确保您的Java代码正确配置了与AD数据库的连接参数,如主机名、端口号、用户名、密码等。确认这些设置是否正确。2. 检查依赖库:确保您的Java项
2023-09-08

解决mysql的赋权操作之GRANTALLPRIVILEGESON*.*TO‘root‘@‘%‘IDENTIFIEDBY‘123456‘WITHGRANTOPTION问题

这篇文章主要介绍了解决mysql的赋权操作之GRANTALLPRIVILEGESON*.*TO‘root‘@‘%‘IDENTIFIEDBY‘123456‘WITHGRANTOPTION问题,本文给大家分享两种情况分析分享解决方案,感兴趣的朋友一起看看吧
2022-11-13

Mybatis Update操作返回值问题

后端的数据持久化使用的是 Mybatis ,在做高并发下账户增减余额的时候,打算使用乐观锁来解决这个问题。在获取update操作的返回值时遇到了一个问题,似乎 Mybatis 进行 update 操作得到的 int 返回值并不是影响的行数。
2023-05-31

SQLServer备份和还原操作问题

1. 如何备份数据库?可以使用SQL Server Management Studio (SSMS)或者Transact-SQL语句来备份数据库。- 使用SSMS:在SSMS中,右键点击需要备份的数据库,选择“任务” > “备份”来打开备份
2023-09-08

Java8-Stream流操作List去重问题

这篇文章主要介绍了Java8-Stream流操作List去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-16

编程热搜

目录