#javascript #reactjs
Вопрос:
У меня есть элемент, идентификатор которого я передаю в библиотеку, но для выполнения операций с переданным элементом требуется время. В настоящее время это выглядит так:
useEffect(() => {
Promise.all(build("#el")).then(() => {
...
})
}, [])
// build() is the function imported from an external library
// which creates some sort of visualisation of element `el`
return(
<>
<Component1 />
<div id="el" />
<Component />
</>
)
Поэтому я хотел создать загрузчик, который будет работать до тех пор, пока функция не будет запущена, вот так:
const [loading, setLoading] = useState(true);
useEffect(() => {
Promise.all(build("#el")).then(() => {
...
}).finally(() => setLoading(false));
}, [])
if(loading) return <div>Loading...</div>
return(
<>
<Component1 />
<div id="el" />
<Component />
</>
)
Но проблема в том, что внешняя библиотека не может найти элемент «el», потому что он не существует в DOM до тех пор, пока точечная загрузка не станет ложной. Это сработало бы, если бы я создал элемент непосредственно в index.html но тогда я не смог бы расположить этот элемент.
Есть ли какой-нибудь способ добиться этого?
Комментарии:
1.
build
это функция, импортированная из внешней библиотеки, она создает некоторую визуализацию элементаel
.2. Я действительно хочу
loading
, чтобы состояние выполнялось до техbuild()
пор, пока оно не будет завершено; Проблема в том, что тогда оно не будет найденоel
в DOM. Я почему-то хочу, чтобы он существовал в DOM.3. при загрузке=true#el не существует
Ответ №1:
Вместо раннего возврата вы могли бы условно отобразить загрузчик в дополнение к пустому #el
div.
return(
<>
... possibly other content
{loading amp;amp; <div>Loading...</div>)
... possibly other content
{!loading amp;amp; <Component1 />}
<div id="el"></div>
{!loading amp;amp; <Component />}
... possibly other content
</>
)
Суть в том, что вы хотите #el
, чтобы div отображался независимо от loading
состояния. Остальная часть пользовательского интерфейса этого компонента может вращаться вокруг условной визуализации loading
государством, если это необходимо.
Комментарии:
1. Это работает в данном случае, но мой компонент React возвращает несколько элементов, и элемент
el
должен быть расположен внутри него. Так что ставить его ниже всего остального было бы неправильно, вот почему я возвращал его раньше. Я просто отредактировал свой пример, чтобы показать, что я имею в виду.2. не могли бы вы использовать
display: none;
on#el
, чтобы скрыть его, но при этом оставаться в DOM, чтобы библиотека могла получить к нему доступ?3. @ShreySachdeva Этот шаблон не влияет на то, где вы визуализируете
<div id="el"></div>
внутри этого компонента, он может быть визуализирован там, где вы его визуализировали ранее. Поможет ли это, если я помещу туда»….», чтобы указать, что есть другой контент?