编程语言
首页 > 编程语言> > javascript-目标DOM如何在地图中反应useRef

javascript-目标DOM如何在地图中反应useRef

作者:互联网

我正在寻找有关使用react useRef()挂钩获取DOM元素数组的解决方案.

例:

const Component = () => 
{

  // In `items`, I would like to get an array of DOM element
  let items = useRef(null);

  return <ul>
    {['left', 'right'].map((el, i) =>
      <li key={i} ref={items} children={el} />
    )}
  </ul>
}

我该如何实现?

解决方法:

useRef只是部分类似于React的ref(仅具有当前字段的对象的结构).

useRef挂钩旨在在渲染之间存储一些数据,并且更改数据不会触发重新渲染(与useState不同).

还要提醒您:最好避免在循环或if中初始化钩子.是first rule of hooks.

考虑到这一点,我们:

>创建数组,并通过useRef将其保留在渲染之间
>我们通过createRef()初始化每个数组的元素
>我们可以使用.current符号来引用列表

const Component = () => {

  let refs = useRef([React.createRef(), React.createRef()]);

  useEffect(() => {
    refs.current[0].current.focus()
  }, []);

  return (<ul>
    {['left', 'right'].map((el, i) =>
      <li key={i}><input ref={refs.current[i]} value={el} /></li>
    )}
  </ul>)
}

这是我们可以安全地修改数组(例如,通过更改其长度).但是请不要忘记,由useRef存储的变异数据不会触发重新渲染.因此,要更改长度以重新渲染,我们需要涉及useState.

const Component = () => {

  const [length, setLength] = useState(2);
  const refs = useRef([React.createRef(), React.createRef()]);

  function updateLength({ target: { value }}) {
    setLength(value);
    refs.current = refs.current.splice(0, value);
    for(let i = 0; i< value; i++) {
      refs.current[i] = refs.current[i] || React.createRef();
    }
    refs.current = refs.current.map((item) => item || React.createRef());
  }

  useEffect(() => {
   refs.current[refs.current.length - 1].current.focus()
  }, [length]);

  return (<>
    <ul>
    {refs.current.map((el, i) =>
      <li key={i}><input ref={refs.current[i]} value={i} /></li>
    )}
  </ul>
  <input value={refs.current.length} type="number" onChange={updateLength} />
  </>)
}

另外,请勿在首次渲染时尝试访问refs.current [0] .current-这会引发错误.

      return (<ul>
        {['left', 'right'].map((el, i) =>
          <li key={i}>
            <input ref={refs.current[i]} value={el} />
            {refs.current[i].current.value}</li> // cannot read property `value` of undefined
        )}
      </ul>)

所以你要么守卫

      return (<ul>
        {['left', 'right'].map((el, i) =>
          <li key={i}>
            <input ref={refs.current[i]} value={el} />
            {refs.current[i].current && refs.current[i].current.value}</li> // cannot read property `value` of undefined
        )}
      </ul>)

或在useEffect挂钩中访问它.原因:ref是在元素渲染后绑定的,因此在渲染运行期间首次运行时尚未初始化.

标签:javascript,reactjs,react-hooks
来源: https://codeday.me/bug/20191010/1888441.html