Why Too many re-renders?
Доброго времени суток. Страница на реакте, на ней должен выводиться список, состоящий из заголовка {title} и содержания {body}. При первой отрисовке должны выводится только заголовки и содержание 1-го элемента списка. Далее при нажатии на любой заголовок должно отображаться его содержание, а уже открытое содержание "закрываться". По факту - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop. Подскажите, что не так?
const [openId, setopenId] = useState(1); const onButtonClick = (liId) => { setopenId({openId: openId === liId ? openId : liId}) return ( <div className={styles.li_container}> <ul> <li key = {1}> <button onClick = {onButtonClick(1)} className={styles.headerLi}>Can I see any examples?</button> {openId === 1 && <div id="example1" className={styles.bodyLi}> Our creatives have submitted more than 6 Million names and thousands of logos on our ntests. </div>} </li> <li key = {2}> <button onClick = {onButtonClick(2)} className={styles.headerLi}>111Can I see any examples?</button> {openId === 2 && <div className={styles.bodyLi}> 111Our creatives have submitted more than 6 Million names and thousands of logos onubmitted in recent contests. </div>} ) |
Во-первых: оберни код в [js]. И вообще всегда в интернете если ты где-то кажешь свой код - оборачивай его в соответствующий тег. Никто не будет твою стену мусора неформатированную разбирать.
Во-вторых: здесь только кусок, выкладывай полноценный пример. |
Но вообще и так вижу, проблема в:
onClick = {onButtonClick(1)} React вам не Vue, он тупой и действует также как чистый javascript: onButtonClick(1) - это вызов функции onButtonClick с параметром 1 вот прямо сейчас во время рендера, в сам же onClick назначается возвращаемое из onButtonClick значение, в данном случае undefined. Надо назначать обработчиком функцию, а не её результат: onClick = {() => onButtonClick(1)} Но правильнее делать так: onClick = {onButtonClick} А 1 это или 2 получать внутри onButtonClick из event.target. |
Спасибо, что ответил. Стало чуть понятнее. При попытке "использовать" event.target была ошибка "невозможно прочитать значение null".
Цитата:
|
Цитата:
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Цитата:
|
Цитата:
|
Цитата:
Что для решения этой простой задачи ты сильно говнокодишь. Заголовки это какой-то текст? А что такое их "содержание"? Обычно для такого рода данных уже можно организовать некий сторадж с данными, а потом эти данные выводить на странице. У тебя же какая-то голимая "статика", да еще в таком не лицеприятном виде. :( |
Цитата:
|
Часовой пояс GMT +3, время: 20:57. |