Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 18.06.2020
Сообщений: 41

Почему рендерится бесконечное количество раз?

18.04.2023, 16:30. Показов 723. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Вчера начал знакомство с React. Для примера решил получить данные по ссылке и далее их использовать.
Но почему-то React бесконечно рендерит объекты, внешне это незаметно, но если выводить сообщения в консоль(console.log(mark.id)), то они бесконечно пишутся.

Что пытаюсь получить от своего кода: мне нужно чтобы данные с сервиса загрузились один раз и хранились в переменной markerPins всегда, пока не будет обновлена страница


Пример кода основного рендера Map:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import React from 'react'
import { MapContainer,  TileLayer, Marker, Popup} from 'react-leaflet'
import UserMarkers from './UserMarkers'
import axios from 'axios'
import { useState, useEffect } from 'react';
 
 
 
export default function Map(){
    const markersSrc = 'https://reqres.in/api/users?page=1'
    const [markerPins, setMarkerPins] = useState([]);
    const pos = [51.505, -0.09]
 
 
    useEffect(() => {
        axios.get(markersSrc).then( 
            (res) => setMarkerPins( res.data.data ) 
            )
    })
     
        return(
            <MapContainer center={pos} zoom={13} scrollWheelZoom={true} attributionControl={false} >
                <TileLayer
                attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
                url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
                />
                <Marker position={pos}>
                <Popup>
                    A pretty CSS3 popup. <br /> Easily customizable.
                    < a href='https://www.yandex.ru/'>Яндекс</ a>
                </Popup>
                </Marker>
                <UserMarkers mPins={ markerPins }/>
            </MapContainer>   
        )
 
}

UserMarkers:
JavaScript
1
2
3
4
5
6
7
8
9
import React from 'react'
import MyMarker from './MyMarker'
 
export default function UserMarkers({mPins}){
 
        return (
            mPins.map( (el) => ( <MyMarker mark={el} key={el.id}/> ) )
        )  
}

MyMarker:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import React from 'react'
import { Marker, Popup } from 'react-leaflet'
 
export default function MyMarker({ mark, key }) {
 
            return (
                <Marker position={ [51.505 + mark.id, -0.09] }>
                    <Popup>
                        {console.log(mark.id)}
                        {mark.id} <br/>
                        {mark.email} <br/>
                        < a href='https://www.yandex.ru/'>Яндекс</ a>
                    </Popup>
                </Marker>
            )
}
Добавлено через 10 минут
То есть в сухом остатке в Map рендере я объявил стейт, чтобы там хранить свою информацию
JavaScript
1
const [markerPins, setMarkerPins] = useState([]);
Далее его заполнил
JavaScript
1
2
3
4
5
useEffect(() => {
        axios.get(markersSrc).then( 
            (res) => setMarkerPins( res.data.data ) 
            )
    })
И потом передаю его на рендер:
JavaScript
1
<UserMarkers mPins={ markerPins }/>
Добавлено через 14 минут
Вопросы в сухом остатке:
Как правильно взять данные по ссылке и хранить в state и почему идет бесконечный рендер?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2023, 16:30
Ответы с готовыми решениями:

Почему функция вызывается один раз, а не бесконечное число раз
Программа показывает, как работать с анимацией цвета. Мы берём случайный цвет и медленно изменяем его на другой случайный. Я объявляю...

Перемещает обьект по полю бесконечное количество раз
Хотел сделать небольшую игру про рубку деревьев на кнопку g, но после нажатия этой кнопки он начинает перемещать обьект по полю бесконечное...

Написать цикл (перечисление от 10 до 0 повторялось бесконечное количество раз)
Подскажите, что нужно дописать в программу,чтобы перечисление от 10 до 0 повторялось бесконечное количество раз (после нуля надо, чтобы a...

7
250 / 184 / 58
Регистрация: 12.03.2021
Сообщений: 1,043
18.04.2023, 16:44
Цитата Сообщение от WhiteRing Посмотреть сообщение
сухом остатке
это я так и не понял. что?
Цитата Сообщение от WhiteRing Посмотреть сообщение
но если выводить сообщения в консоль(console.log(mark.id)), то они бесконечно пишутся
в приложенном коде не видать. где консоль лог?
Цитата Сообщение от WhiteRing Посмотреть сообщение
бесконечно пишутся
точно бесконечно, а не по количеству элементов в markerPins?
и может дело в том, что лефлет ререндерит на каждый чих?
0
1 / 1 / 0
Регистрация: 18.06.2020
Сообщений: 41
18.04.2023, 17:26  [ТС]
Цитата Сообщение от Splaisto Посмотреть сообщение
точно бесконечно, а не по количеству элементов в markerPins?
по сути их всего 6

а рендер идет и в console.log фигачит.

Цитата Сообщение от Splaisto Посмотреть сообщение
в приложенном коде не видать. где консоль лог?
в MyMarker
0
250 / 184 / 58
Регистрация: 12.03.2021
Сообщений: 1,043
18.04.2023, 17:50
Цитата Сообщение от WhiteRing Посмотреть сообщение
в MyMarker
угу, вижу. так это в попапе на карте, которая как я уже писал
Цитата Сообщение от Splaisto Посмотреть сообщение
ререндерит на каждый чих
0
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
19.04.2023, 09:21
Лучший ответ Сообщение было отмечено WhiteRing как решение

Решение

Цитата Сообщение от WhiteRing Посмотреть сообщение
почему идет бесконечный рендер?
у useEffect не указаны зависимости поэтому он срабатывает на каждый рендер
в каждом эффекте вызывается setState который устанавливает данные и вызывает перерендер
на перерендере срабатывает useEffect и.т.д

можно сделать пустой массив зависимостей и этот код отработает один раз
JavaScript
1
2
3
4
5
useEffect(() => {
    axios.get(markersSrc).then( 
        (res) => setMarkerPins( res.data.data ) 
    )
}, [])
Цитата Сообщение от WhiteRing Посмотреть сообщение
Как правильно взять данные по ссылке и хранить в state
в целом можно так хранить
я бы только еще вынес логику по axios и url в отдельную функцию в отдельный файл
JavaScript
1
2
const url = "..."
export const getMarkerData = () => axios.get(url)
Добавлено через 7 минут
Цитата Сообщение от WhiteRing Посмотреть сообщение
{console.log(mark.id)}
не обязательно добавлять log в разметку кстати, можно в коде функции добавить просто

чтобы код не ехал а автоформатировался cоветую использовать prettier
1
250 / 184 / 58
Регистрация: 12.03.2021
Сообщений: 1,043
19.04.2023, 09:31
Цитата Сообщение от Ovederax Посмотреть сообщение
можно сделать пустой массив зависимостей и этот код отработает один раз
теперь бы мне пояснительную (пишу на классовых). вроде как этот массив служит для отслеживания изменений (аля didUpdate). как его отсутствие свяно с тем, что didMount вызывается постоянно?
0
 Аватар для Ovederax
604 / 404 / 212
Регистрация: 30.04.2017
Сообщений: 744
Записей в блоге: 1
19.04.2023, 09:42
Цитата Сообщение от Splaisto Посмотреть сообщение
(пишу на классовых)
а я пишу практически только на функциональных)

Цитата Сообщение от Splaisto Посмотреть сообщение
вроде как этот массив служит для отслеживания изменений (аля didUpdate)
useEffect срабатывает и при первом рендере
didUpdate не срабатывает при первом рендере как вижу из документации
useEffect это не didMount

Если проводить аналогии (не до конца в них уверен т.к. есть особенности скорей всего)
можно сказать что useEffect с [] это аналог didMount
useEffect без зависимостей это didMount + didUpdate
useEffect с зависимостями это didUpdate с автопроверками по зависимостям
https://stackoverflow.com/ques... -component
1
250 / 184 / 58
Регистрация: 12.03.2021
Сообщений: 1,043
19.04.2023, 10:21
Цитата Сообщение от Ovederax Посмотреть сообщение
useEffect без зависимостей это didMount + didUpdate
ну по логике в массиве как раз хранятся отслеживаемые значения для апдейта. если массив пуст - обновлений нет. только вот когда нет массива это вроде как андейфайнд, получается последний постоянно меняется, что странно. надо подтянуть теорию)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2023, 10:21
Помогаю со студенческими работами здесь

Перемещение объекта справа налево бесконечное количество раз
Пишу прогу, в которой объект двигается слева-на-право, и так бесконечное число раз. У меня объект двигается, но когда я начинаю закрывать...

Почему очень долго рендерится видео?
Почему очень долго рендерится видео? 20-минутное видео с GoPro (4к) рендерится уже 2 часа и показывает еще 8, изменений почти никаких не...

Бесконечное выполнение скрипта раз в секунду
Такая проблема: нужно организовать выполнение скрипта раз в 1 секунду независимо, находится ли кто на сайте или нет. другими словами:...

Программа выводит результат бесконечное число раз. Не ясна причина.
Здравствуйте! я написала программу сортировки одномерного массива простым обменом. Проверила в ее работоспособности, массив выводится в...

Почему деструктор срабатывает больше раз, чем количество созданных объектов?
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот пример #include &lt;iostream&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru