Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.08.2021, 17:27
Аватар для BodNS
Новичок на форуме
Отправить личное сообщение для BodNS Посмотреть профиль Найти все сообщения от BodNS
 
Регистрация: 08.08.2021
Сообщений: 4

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>}
)

Последний раз редактировалось BodNS, 19.08.2021 в 16:38.
Ответить с цитированием
  #2 (permalink)  
Старый 18.08.2021, 17:37
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Во-первых: оберни код в [js]. И вообще всегда в интернете если ты где-то кажешь свой код - оборачивай его в соответствующий тег. Никто не будет твою стену мусора неформатированную разбирать.
Во-вторых: здесь только кусок, выкладывай полноценный пример.
__________________
29375, 35

Последний раз редактировалось Aetae, 18.08.2021 в 17:42.
Ответить с цитированием
  #3 (permalink)  
Старый 18.08.2021, 17:47
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Но вообще и так вижу, проблема в:
onClick = {onButtonClick(1)}

React вам не Vue, он тупой и действует также как чистый javascript: onButtonClick(1) - это вызов функции onButtonClick с параметром 1 вот прямо сейчас во время рендера, в сам же onClick назначается возвращаемое из onButtonClick значение, в данном случае undefined.
Надо назначать обработчиком функцию, а не её результат:
onClick = {() => onButtonClick(1)}

Но правильнее делать так:
onClick = {onButtonClick}

А 1 это или 2 получать внутри onButtonClick из event.target.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 19.08.2021, 14:54
Аватар для BodNS
Новичок на форуме
Отправить личное сообщение для BodNS Посмотреть профиль Найти все сообщения от BodNS
 
Регистрация: 08.08.2021
Сообщений: 4

Спасибо, что ответил. Стало чуть понятнее. При попытке "использовать" event.target была ошибка "невозможно прочитать значение null".

Сообщение от Aetae Посмотреть сообщение
Во-первых: оберни код в [js]. И вообще всегда в интернете если ты где-то кажешь свой код - оборачивай его в соответствующий тег.
Первый раз пишу на подобном форуме, объясни популярно для тех кто в танке, что значит оберни код в [js] и в какой соответствующий тег надо оборачивать код?
Ответить с цитированием
  #5 (permalink)  
Старый 19.08.2021, 15:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от BodNS
что значит оберни код
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #6 (permalink)  
Старый 19.08.2021, 15:34
Аватар для BodNS
Новичок на форуме
Отправить личное сообщение для BodNS Посмотреть профиль Найти все сообщения от BodNS
 
Регистрация: 08.08.2021
Сообщений: 4

Сообщение от рони
Пожалуйста, отформатируйте свой код!
У Вас нет прав для выполнения этого действия... Как отформатировать?
Ответить с цитированием
  #7 (permalink)  
Старый 19.08.2021, 15:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от BodNS
У Вас нет прав
выйти - зайти, не поможет - ждать полнолуния.
Ответить с цитированием
  #8 (permalink)  
Старый 19.08.2021, 22:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от BodNS
Подскажите, что не так?
Есть мнение... (с)
Что для решения этой простой задачи ты сильно говнокодишь.

Заголовки это какой-то текст?
А что такое их "содержание"?
Обычно для такого рода данных уже можно организовать некий сторадж с данными, а потом эти данные выводить на странице.

У тебя же какая-то голимая "статика", да еще в таком не лицеприятном виде.
Ответить с цитированием
  #9 (permalink)  
Старый 19.08.2021, 22:45
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Цитата:
не лицеприятном
неприглядном
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск