ToB企服应用市场:ToB评测及商务社交产业平台

标题: react 18中,利用useRef 获取其他组件的dom并操作节点,flushSync强制同步 [打印本页]

作者: 反转基因福娃    时间: 2024-7-18 18:53
标题: react 18中,利用useRef 获取其他组件的dom并操作节点,flushSync强制同步
React 不答应组件访问其他组件的 DOM 节点。乃至自己的子组件也不行!这是故意的。Refs 是一种脱围机制,应该谨慎利用。手动操作 另一个 组件的 DOM 节点会使你的代码更加脆弱。
    相反,想要 暴露其 DOM 节点的组件必须选择该行为。一个组件可以指定将它的 ref “转发”给一个子组件。
  1. import { forwardRef, useRef } from 'react';
  2. const MyInput = forwardRef((props, ref) => {
  3.   return <input {...props} ref={ref} />;
  4. });
  5. export default function Form() {
  6.   const inputRef = useRef(null);
  7.   function handleClick() {
  8.     inputRef.current.focus();
  9.   }
  10.   return (
  11.     <>
  12.       <MyInput ref={inputRef} />
  13.       <button onClick={handleClick}>
  14.         聚焦输入框
  15.       </button>
  16.     </>
  17.   );
  18. }
复制代码
flushSync 强制 React 同步更新

  1. import { useState, useRef } from 'react';
  2. import { flushSync } from 'react-dom';
  3. export default function TodoList() {
  4.   const listRef = useRef(null);
  5.   const [text, setText] = useState('');
  6.   const [todos, setTodos] = useState(
  7.     initialTodos
  8.   );
  9.   function handleAdd() {
  10.     const newTodo = { id: nextId++, text: text };
  11.     flushSync(() => {
  12.       setText('');
  13.       setTodos([ ...todos, newTodo]);      
  14.     });
  15.     listRef.current.lastChild.scrollIntoView({
  16.       behavior: 'smooth',
  17.       block: 'nearest'
  18.     });
  19.   }
  20.   return (
  21.     <>
  22.       <button onClick={handleAdd}>
  23.         添加
  24.       </button>
  25.       <input
  26.         value={text}
  27.         onChange={e => setText(e.target.value)}
  28.       />
  29.       <ul ref={listRef}>
  30.         {todos.map(todo => (
  31.           <li key={todo.id}>{todo.text}</li>
  32.         ))}
  33.       </ul>
  34.     </>
  35.   );
  36. }
  37. let nextId = 0;
  38. let initialTodos = [];
  39. for (let i = 0; i < 20; i++) {
  40.   initialTodos.push({
  41.     id: nextId++,
  42.     text: '待办 #' + (i + 1)
  43.   });
  44. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4