TL; DR: я создал npm
пакет с именем use-dynamic-refs
для динамического создания ссылок. Найдите здесь
Эта проблема
Одна из моих основных проблем с React - динамическая установка и получение компонента refs
. Это было особенно болезненно, потому что мне нужно было передать созданное refs
нескольким компонентам, а иногда и слоям глубоко внутри дерева компонентов.
Раньше мне приходилось что-то делать в отношении:
const Before = () => {
const foo = ['random_id_1' , 'random_id_2']'
const refsArray = foo.map(() => createRef());
return (
<div>
{data.map( eachId => (
<div ref={refsArray[index].current} key={eachId}/>)}
</div>
);
};
И, чтобы использовать ref
позже, возможно, верните массив объектов в refsArray
с помощью ключа id
, подобного этому
const refsArray = foo.map(eachId => ({id: eachId, ref: createRef()}));
Как я это решил
Я создал крошечный пакет npm под названием use-dynamic-refs
. С помощью хука use-dynamic-refs
вы можете просто сделать:
npm i use-dynamic-refs
а потом,
import React, { useEffect } from 'react'; import useDynamicRefs from 'use-dynamic-refs';
const Example = () => { const foo = ['random_id_1', 'random_id_2']; const [getRef, setRef] = useDynamicRefs();
useEffect(() => { // Get ref for specific ID const id1 = getRef('random_id_1'); console.log(id1) }, [])
return ( <> {/* Simple set ref. */} <span ref={setRef('random_id_3')}></span>
{/* Set refs dynamically in Array.map() */} { foo.map((eachId, idx) => ( <div ref={setRef(eachId)}> Hello {eachId} </div>))} </> ) }
Как это работает
Под капотом use-dynamic-refs
используется одноэлементный экземпляр Javascript Map
. Это дает вам хранилище пар ключ-значение ваших ссылок, хранящихся по идентификатору.
Примечание. Проблема с этим подходом заключается в том, что вам нужно убедиться, чтоid
являются уникальными, чтобы избежать перезаписи существующих ссылок.
Ссылки говорите?
Репозиторий Github:
https://github.com/fitzmode/use-dynamic-refs
NPM:
https://www.npmjs.com/package/use-dynamic-refs
Обратная связь и PR приветствуются!