React方向:react中5种Dom的操作方式

ops/2025/1/15 5:23:24/
1、通过原生JS获取Dom去操作

通过document.querySelector('#title')原生js的方式去拿到dom节点,然后去进行操作。

import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title = document.querySelector('#title');console.log(title);title.style.background = 'skyblue'}render() {return (<><h1 id="title">测试节点</h1><button onClick={this.handleGetDom}>点击操作Dom</button></>)}
}export default App;
2、通过react官方提供的ref以及refs去获取DOM元素

但是需要值得一提的是,官方的refs将在未来的时间段内会被废除,并且因ref挂载的节点是挂载在组件实例上,因此函数不能使用es5的写法,如果使用es5的写法,需要.bind去更改this指向,否则this.refs拿到的将是undefined。

    handleGetDom = () => {console.log(this);let { header } = this.refs;header.style.background = 'gold';}render() {return (<><h1 ref={'header'}>测试节点</h1><button onClick={this.handleGetDom}>点击操作Dom</button></>)}
运行结果.png
3、通过react官方提供的ReactDOM.findDOMNode去操作DOM元素

使用这种方式需要注意的是ReactDOM需要使用import ReactDOM from 'react-dom'提前引入进来,否则是找不到findDOMNode这个方法的。

import {Component} from "react";
import ReactDOM from 'react-dom'class App extends Component {handleGetDom = () => {let title = document.querySelector('#title');ReactDOM.findDOMNode(title).style.background = 'green'}render() {return (<><h1 id="title">测试节点</h1><button onClick={this.handleGetDom}>点击操作Dom</button></>)}
}export default App;
4、通过react官方推荐的ref回调函数去获取DOM元素

前面涉及到refs即将被删除,因此,新版本 React 不推荐 使用ref string去操作DOM,转而推荐我们使用 ref callback的使用方式,通过这种方式挂载到实例对象上面,只需要在回调函数中使用this.属性名即可

import {Component} from "react";class App extends Component {handleGetDom = () => {this._title.style.background = 'red'}render() {return (<><h1 ref={(ele)=>{this._title = ele}}>测试节点</h1><button onClick={this.handleGetDom}>点击操作Dom</button></>)}
}export default App;
执行结果.png
5、react官方推荐的写法:React.createRef()

Refs 是使用 React.createRef() 创建的,并通过 ref 属性附加到 React 元素。在构造组件时,通常将 Refs 分配给实例属性,以便可以在整个组件中引用它们。当 ref 被传递给 render 中的元素时,对该节点的引用可以在 ref 的 current 属性中被访问。

ref 的值根据节点的类型而有所不同:

  • 当 ref 属性用于 HTML 元素时,构造函数中使用 React.createRef() 创建的 ref 接收底层 DOM 元素作为其 current 属性。
  • 当 ref 属性用于自定义 class 组件时,ref 对象接收组件的挂载实例作为其 current 属性。
  • 不能在函数组件上使用 ref 属性,因为他们没有实例。
示例:

通过实现监听输入框的值以及将输入框的值追加到获取到的dom元素ul中去,在通过获取ul的子节点li,去给所有的li添加点击事件

import React, {Component} from "react";class App extends Component {state = {msg:''}// 使用官方推荐的获取节点的写法进行操作title = React.createRef();// 监听输入框的值handleChange = (e) => {this.setState({msg:e.target.value})}// 将监听到输入框的值追加到获取到的ul的DOM元素中去handleAdd = () => {let {current} = this.title; //解构refs绑定的domcurrent.innerHTML += `<li>${this.state.msg}</li>`;// 追加完成后清空输入框this.setState({msg:''})// 打印下是否获取到了ul下的所有子节点console.log(current.childNodes);// 通过操作DOM给每个子节点li再次添加点击事件this.title.current.childNodes.forEach((item,index)=>{item.onclick = ()=>{item.innerHTML +=`<b>点击了li元素<b>`;}})}render() {return (<><input type="text" value={this.state.msg} onChange={this.handleChange}></input><button onClick={this.handleAdd}>添加数据</button><ul ref={this.title}></ul></>)}
}export default App;
执行结果.png
最后编辑于:2025-01-11 21:04:59


喜欢的朋友记得点赞、收藏、关注哦!!!


http://www.ppmy.cn/ops/150212.html

相关文章

Notepad++上NppFTP插件的安装和使用教程

一、NppFTP插件下载 图示是已经安装好了插件。 在搜索框里面搜NppFTP&#xff0c;一般情况下&#xff0c;自带的下载地址容易下载失败。这里准备了一个下载连接&#xff1a;Release v0.29.10 ashkulz/NppFTP GitHub 这里我下载的是x86版本 下载好后在nodepad的插件里面选择打…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

Java学习,集合遍历

Java遍历集合&#xff08;如List, Set, Map等&#xff09;通常有多种方法。遍历集合的方式&#xff0c;包括传统for循环、增强的for循环&#xff08;也称"for-each"循环&#xff09;、迭代器&#xff08;Iterator&#xff09;以及流&#xff08;Stream&#xff09;AP…

Mysql--运维篇--备份和恢复(逻辑备份,mysqldump,物理备份,热备份,温备份,冷备份,二进制文件备份和恢复等)

MySQL 提供了多种备份方式&#xff0c;每种方式适用于不同的场景和需求。根据备份的粒度、速度、恢复时间和对数据库的影响&#xff0c;可以选择合适的备份策略。主要备份方式有三大类&#xff1a;逻辑备份&#xff08;mysqldump&#xff09;&#xff0c;物理备份和二进制文件备…

2025年三个月自学手册 网络安全(黑客技术)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“…

MySQL 学习指南与资料分享

MySQL 学习资料 MySQL 学习资料 MySQL 学习资料 在如今数据驱动发展的大趋势下&#xff0c;MySQL 作为开源关系型数据库管理系统的佼佼者&#xff0c;广泛应用于各个领域&#xff0c;从个人博客搭建到大型电商平台的数据管理&#xff0c;它都发挥着关键作用。如果你立志掌握这…

Ubuntu 部署Docker + Dify,遇到的坑, 最新亲测镜像

这里写自定义目录标题 Ubuntu 部署Docker Dify virtual box双向粘贴 VBoxClient --clipboard -d Ubuntu docker更新软件包安装docker依赖添加Docker官方GPG密钥添加Docker软件源安装docker配置用户组&#xff08;可选&#xff09;运行docker systemctl start docker验证是否成…

网管平台(进阶篇):路由器的管理实践

在当今数字化时代&#xff0c;路由器作为网络连接的核心设备&#xff0c;其管理对于确保网络的稳定、高效和安全至关重要。本文旨在深入探讨路由器管理的重要性、基本设置步骤、高级功能配置以及日常维护&#xff0c;帮助读者构建一个高效且安全的网络环境。 一、路由器管理的…