#reactjs #use-effect
Вопрос:
Я пытаюсь отключить два элемента, проходящих по классу, как это:
const disableMonthAndYear = () => {
const cellsMonth = document.getElementsByClassName('ant-picker-month-btn');
const cellsYear = document.getElementsByClassName('ant-picker-year-btn');
console.log('cellsMonth', cellsMonth);
for (let i = 0; i < cellsMonth.length; i ) {
console.log('i', i); // not entering here
cellsMonth[i].disabled = true;
}
for (let i = 0; i < cellsYear.length; i ) {
cellsYear[i].disabled = true;
}
};
useLayoutEffect(() => {
disableMonthAndYear();
}, []);
Я думал об использовании useLayoutEffect
, потому что хотел вызвать disableMonthAndYear
функцию только тогда, когда DOM был полностью загружен, потому что в console.log('cellsMonth', cellsMonth);
я получаю пустые массивы, но когда я нажимаю на них, я вижу значения внутри…
С a setTimeout
работает нормально, но это не идея, как я должен убедиться, что константа, определенная ими document.getElementsByClassName(
, заполнена данными, прежде чем изменять ее disabled
свойства?
Комментарии:
1.
document
Ни в коем случае не используйтеdocument.getElementsByClassName
document.getElementsById
и так далее. Это ванильный js-материал. Это приемлемо только в первой строке, когда вы выполняете рендеринг DOM. ЕДИНСТВЕННОЕ место, где можно сделать это один раз. Вы используете react не по назначению. Это грязно. Используйте ссылкиuseRef
или, если вы сопоставляете свои таблицы, просто не отображайте их в определенных ячейках, которые не должны отображаться. что угодно! Удалив этот грязный способ, вы также устраните проблему, связанную с тем, что вы не знаете, есть у вас данные или нет, и так далее. Оставьте все, чтобы отреагировать2. Хорошо, но я не могу добавить ссылку во внешнюю библиотеку, эта библиотека (ant date rangepicker) содержит только классы для своих элементов
3. Итак, вы передаете ему объект с данными? Тогда почему бы просто не отфильтровать данные до того, как вы их передадите, чтобы компонент просто никогда не получал данные, которые вы не хотите отображать?
4. Это не имеет никакого отношения к вопросу. Я хочу отключить для divs из внешней библиотеки, в настоящее время она работает с помощью параметра setTimeout и установки параметра disable true для DOM, но мне интересно, есть ли другой способ сделать это, с ref было бы нормально, если бы все компоненты, где реагируют
5. Каждый компонент в дизайне ant (кажется, то, что вы используете) имеет множество API для его изменения. В том числе для таблиц, чтобы сделать пользовательский рендеринг определенного столбца, означающего для ваших
month
year
столбцов и, вы можете добавить простуюif
проверку, чтобы отрисовать его или нет, или, если вы хотите отрисовать, но сdisabled
атрибутом — вы тоже можете это сделать. Трудно точно ответить, как помочь, когда мы не знаем точной ситуации. Какому компоненту вы передаете информацию? что он делает? Потому что то, что вы нам предоставили, — это грязный код реакции, который не следует использовать. пожалуйста, обновите свой пост с дополнительной информацией