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

embedded/2025/1/14 22:41:52/
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/embedded/153951.html

相关文章

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新&#xff0c;就想着更新看看&#xff08;能否冲掉问题&#xff09;4、更新没成功&#xff0c;自动重启电脑5、风险文件&#xff08;好家伙命名还挺规范&#xff0c;一看名字就知道出问题了&#xff09;6、开机有一些注册表…

科大讯飞前端面试题及参考答案 (下)

除了 echarts 还了解其它画图工具吗? 除了 Echarts,还有不少优秀的画图工具可供选择使用。 Highcharts:它是一款功能强大且应用广泛的图表绘制工具,支持多种常见的图表类型,像柱状图、折线图、饼图、散点图等,同时也能创建较为复杂的图表,比如仪表盘图表、极坐标图等。H…

编译与汇编

本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析&#xff0c;语法分析&#xff0c;语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …

AI时代来了,我们不再需要IDE了

大家好&#xff0c;我是编程乐趣。 最近在思考一个问题&#xff0c;那就是AI这么强大。 未来有没有可能&#xff0c;我们就不需要不需要开发工具了&#xff0c;只需一个浏览器就可以开发软件了。 一、AI带来的变化 1、代码生成与补全 AI工具如GitHub Copilot等能够根据代码…

介绍PyTorch张量

介绍PyTorch张量 介绍PyTorch张量 PyTorch张量是我们在PyTorch中编程神经网络时将使用的数据结构。 在编程神经网络时&#xff0c;数据预处理通常是整个过程的第一步&#xff0c;数据预处理的一个目标是将原始输入数据转换为张量形式。 torch.Tensor​类的实例 PyTorch张量…

忘记了PDF文件的密码,怎么办?

PDF文件可以加密&#xff0c;大家都不陌生&#xff0c;并且大家应该也都知道PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和offi…

Springboot Rabbitmq + 线程池技术控制指定数量task执行

定义DataSyncTaskManager&#xff0c;作为线程池任务控制器 package org.demo.scheduletest.service;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueu…

【网络】:网络编程套接字

目录 源IP地址和目的IP地址 源MAC地址和目的MAC地址 源端口号和目的端口号 端口号 VS 进程ID TCP协议和UDP协议 网络字节序 字符串IP和整数IP相互转换 查看当前网络的状态 socket编程接口 socket常见API 创建套接字&#xff08;socket&#xff09; 绑定端口号&…