需求:有一个数组, 当用 map 遍历数组时,希望对数组中的每一项都返回一个 input 元素,且对每个 input 都创建一个 ref 用于获取对应的 dom 节点

方法一

  • 创建一个 ref 数组
  • 在遍历结果数组时,ref 属性可以是一个函数,直接将 dom 节点插入到数组中
  • inputRefs.current[i] = dom 可以改成 inputRefs.current.push(dom) ```tsx const inputRefs = useRef([])

return results.map((item, i) => (

inputRefs.current[i] = dom}/>
))

  1. <a name="zvAcy"></a>
  2. ### 方法二
  3. - 先创建一个 ref 数组
  4. - 遍历结果数组,给 ref 数组创建对应数量的子 ref
  5. - 再次遍历结果数组,将结果数组中的子项 ref 与 ref 数组中的子 ref 关联
  6. - `??` 是空值合并运算符,当左侧为 null 或 undefined 时返回右侧运算值
  7. ```tsx
  8. import { createRef, MutableRefObject, useRef } from 'react'
  9. const component:React.FC = () => {
  10. const inputRefs = useRef<MutableRefObject<HTMLInputElement>>[]>([])
  11. inputRefs.current = HistoryStore.list.map(
  12. (element, i) => inputRefs.current[i] ?? createRef()
  13. )
  14. return (
  15. <>
  16. results.map((item, i) => (
  17. <div key={i}>
  18. <input type="text" ref={ inputRefs.current[i] }/>
  19. <button onClick={ () => handleCopy(inputRefs.current[i].current) }>复制</button>
  20. </div>
  21. ))
  22. </>
  23. )
  24. }

参考