当前位置: 首页 > news >正文

react 18中,使用useRef 获取其他组件的dom并操作节点,flushSync强制同步更新useState

React 不允许组件访问其他组件的 DOM 节点。甚至自己的子组件也不行!这是故意的。Refs 是一种脱围机制,应该谨慎使用。手动操作 另一个 组件的 DOM 节点会使你的代码更加脆弱。

相反,想要 暴露其 DOM 节点的组件必须选择该行为。一个组件可以指定将它的 ref “转发”给一个子组件。

import { forwardRef, useRef } from 'react';const MyInput = forwardRef((props, ref) => {return <input {...props} ref={ref} />;
});export default function Form() {const inputRef = useRef(null);function handleClick() {inputRef.current.focus();}return (<><MyInput ref={inputRef} /><button onClick={handleClick}>聚焦输入框</button></>);
}

flushSync 强制 React 同步更新

import { useState, useRef } from 'react';
import { flushSync } from 'react-dom';export default function TodoList() {const listRef = useRef(null);const [text, setText] = useState('');const [todos, setTodos] = useState(initialTodos);function handleAdd() {const newTodo = { id: nextId++, text: text };flushSync(() => {setText('');setTodos([ ...todos, newTodo]);      });listRef.current.lastChild.scrollIntoView({behavior: 'smooth',block: 'nearest'});}return (<><button onClick={handleAdd}>添加</button><inputvalue={text}onChange={e => setText(e.target.value)}/><ul ref={listRef}>{todos.map(todo => (<li key={todo.id}>{todo.text}</li>))}</ul></>);
}let nextId = 0;
let initialTodos = [];
for (let i = 0; i < 20; i++) {initialTodos.push({id: nextId++,text: '待办 #' + (i + 1)});
}
http://www.lryc.cn/news/398842.html

相关文章:

  • Jupyter Notebook基础:用IPython实现动态编程
  • Python 爬虫:使用打码平台来识别各种验证码:
  • 理解算法复杂度:空间复杂度详解
  • 浅析Kafka Streams消息流式处理流程及原理
  • QGroundControl的总体架构,模块化设计和主要组件的功能。
  • oracle 表空间文件迁移
  • JVM学习(day1)
  • js项目生产环境中移除 console
  • ROS2 + 科大讯飞 初步实现机器人语音控制
  • HTML5新增的input元素属性:placeholder、required、autofocus、min、max等
  • Cornerstone3D导致浏览器崩溃的踩坑记录
  • 【鸿蒙学习笔记】Stage模型
  • Docker进入MongoDB
  • APP与API:魔法世界的咒语与念咒者
  • 云计算安全需求分析与安全保护工程
  • 七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境
  • 操作系统——进程的状态与转换
  • 80. UE5 RPG 实现UI显示技能冷却进度功能
  • Vue2-集成路由Vue Router介绍与使用
  • TemuAPI接口:获取商品详情功能
  • deepstream读取mp4文件及不同类型视频输入bug解决
  • Redis服务器统计和配置信息简介
  • Linux Mac 安装Higress 平替 Spring Cloud Gateway
  • 基于重叠群稀疏的总变分信号降噪及在旋转机械故障诊断中的应用(MATLAB)
  • 【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)
  • 微信小程序---npm 支持
  • 02MFC画笔/画刷/画椭圆/圆/(延时)文字
  • JavaWeb(四:Ajax与Json)
  • Spring源码中的模板方法模式
  • 初学SpringMVC之 JSON 篇