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

useEffect и загрузка данных

25.02.2021, 19:22. Показов 796. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пишу приложение на React+Redux+MySQL. При совершении запроса на получение данных в функциональной компоненте возникает проблема: данные не могут отобразиться сразу, так как данные приходят не мгновенно, а спустя некоторое время. Для решения этой проблемы я использую useEffect. Но использование useEffect в "чистом виде" создаёт проблемы с производительностью, так как при послании запроса на сервер, сервер возвращает ответ, который в свою очередь провоцирует послание нового запроса. В итоге сервер просто тонет в запросах. Указание useEffect запускать обновление только когда изменятся данные не выводит из этого цикла запросов. Мне не хватает знаний useEffect для решения данной проблемы. Максимум я соорудил костыль из цикла с переменной, которая обновляется через определённый промежуток времени.
Код проблемной компоненты:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import React, { useEffect, useState } from 'react';
 
import css from './Searchpage.module.css';
 
import Checkbox from "../UI Elements/Checkbox/Checkbox";
import Colorprobe from "../UI Elements/Colorprobe/Colorprobe";
import Itemcard from "../UI Elements/Itemcard/Itemcard";
import Circlebutton from "../UI Elements/Circlebutton/Circlebutton";
 
import { connect } from 'react-redux';
import { getAllModels, getAllTypes, getAllColors, getAllSizes } from '../../Redux/action';
 
function Searchpage(props) {
    let itemsPerPage = 4;
    const [reloader, setReloader] = useState(0);
    const [allItems, setAllItems] = useState([]);
    const [allTypes, setAllTypes] = useState([]);
    const [allColors, setAllColors] = useState([]);
    const [allSizes, setAllSizes] = useState([]);
    const [currentPage, setCurrentPage] = useState(1);
    const [filter, setFilter] = useState('');
    
    useEffect(() => {
        props.getAllModels(filter);
        props.getAllTypes();
        props.getAllColors();
        props.getAllSizes();
        setAllItems(props.modelsdata.models);
        setAllTypes(props.modelsdata.types);
        setAllColors(props.itemsdata.colors);
        setAllSizes(props.itemsdata.sizes);
        if (reloader < 5){
            setTimeout(() => {
                setReloader(reloader + 1);
            }, 500);
        }
        
    }, [reloader, filter]);
 
    let pagesAr = [];
    let items = [];
    let itemElements;
    let pageElements;
    let typeElements;
    let sizeElements;
    let colorElements;
 
    const updateCurrentPage = (value) => {
        setCurrentPage(value);
    }
 
    const updateColorFilter = (value) => {
        let res;
        if (filter == ''){
            res = filter + 'WHERE items.color = \''+ value +'\' '
        }else{
            res = filter + 'OR items.color = \''+ value +'\' '
        }
        setFilter(res);
        setReloader(0);
    }
 
    if (allItems.length > 0){
        let pages = Math.ceil(allItems.length/itemsPerPage);
 
        for (let i = 0; i < pages; i++) {
            pagesAr[i] = i + 1;
        }
        
        for (let i = currentPage * itemsPerPage - itemsPerPage; i < currentPage * itemsPerPage; i++) {
            if (allItems[i] != null){
                items.push(allItems[i]);
            }
        }
        itemElements = items.map(i => <Itemcard itemname={i.name} price={i.price + " руб."} discount={i.discount} img={'data:image/jpg;base64,' + btoa(Array.from(new Uint8Array(i.image.data)).map(b => String.fromCharCode(b)).join(''))} margin="0 0 10px 0" key={i.name + i.price + i.discount} />);
        pageElements = pagesAr.map(p => <Circlebutton caption={p} value={p} onClick={updateCurrentPage} key={p} />);
        typeElements = allTypes.map(t => <p className={css.groupposition}>{t.type}</p>);
        sizeElements = allSizes.map(s => <Checkbox name="size" caption={s.size} value={s.size}/>);
        colorElements = allColors.map(c => <Colorprobe color={c.color} name="color" key={c.color} onChange={updateColorFilter} />);
    }
 
    return(
        <div className={css.content + " container"}>
            <div>
            <div className={css.searchbar}>
                <h1 className={css.groupname}>Женская одежда</h1>
                <div className={css.group}>
                    {typeElements}
                </div>
                <h1 className={css.groupname}>Цена</h1>
                <div className={css.group}>
                </div>
                <h1 className={css.groupname}>Размер</h1>
                <div className={css.group}>
                    {sizeElements}
                </div>
                <h1 className={css.groupname}>Цвет</h1>
                <div className={css.group}>
                    <div className={css.colorprobes}>
                        {colorElements}
                    </div>
                </div>
            </div>
            </div>
            <div className={css.listofcontents}>
                <div className={css.listofcontentscontainer}>
                    {itemElements}
                </div>
                <div className={css.listofcontentscontainer}>
                    <div className={css.pagebuttonscontainer}>{pageElements}</div>
                </div>
            </div>
        </div>
    );
}
 
const mapStateToProps = (state) => state;
const mapDispatchToProps = {getAllModels, getAllTypes, getAllColors, getAllSizes}
 
export default connect(mapStateToProps, mapDispatchToProps)(Searchpage);
Ссылка на весь проект (на проблемный файл в частности) на GitHub: https://github.com/TheNCf/kali... chpage.jsx

Для любознательных: это дипломный проект.

Добавлено через 1 час 18 минут
Проблема решена путём создания двух useEffect-ов вместо одного. Как оказалось, если у двух useEffect-ов стоят разные ограничивающие перерисовку переменные, то перерисовка, вызванная одним из useEffect-ов, не вызовет перерисовку другого useEffect. Странно, что об этом не написано в документации. Дойти до этого пришлось путём проведения теста.

Вот пример уже работающего кода, который не вызывает постоянных запросов:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   const [downloadData, setDownloadData] = useState(true);
    const [allItems, setAllItems] = useState([]);
    const [currentPage, setCurrentPage] = useState(1);
    const [filter, setFilter] = useState('');
    
    useEffect(() => {
        if (downloadData){
            props.getAllModels(filter);
            setDownloadData(false);
        }
    }, [downloadData]);
 
    useEffect(() => {
        setAllItems(props.modelsdata.models);
        console.log("test");
    }, [props.modelsdata]);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2021, 19:22
Ответы с готовыми решениями:

Route и UseEffect
Всем привет ! Вот код. //----TASKS------------------------- export const Tasks =() =&gt; {return...

useState initial state или useEffect
Здравствуйте!!! Я так понял что можно в useState передать функцию и стелать както так: const =...

Почему при попытке обновить state из useEffect он не обновляется?
Почему при попытке обновить tabsFields из useEffect он не обновляется? // Apollo Client запрос к GraphQL серверу const {...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2021, 19:22
Помогаю со студенческими работами здесь

Загрузка Данных Из Терминала Сбора Данных В Требование-накладную Упп
В УПП 8.2 стандартно предусмотрена загрузка из терминала сбора данных в документ &quot;ПоступлениеТоваровИУслуг&quot;. По этому образцу...

Извлечение данных с сайта и загрузка этих данных в эксель
Всем доброго суток. Вопрос такого плана. Есть подраздел на сайте. В качестве примера рассмотрим сайт НБА (nba.com). Там есть раздел...

Загрузка данных, построение графика, сохранение и очистка данных
здравствуйте, нужно написать программу, в которой будет построение графика, кнопки: загрузка данных, нарисовать график, сохранение данных и...

Загрузка данных через любой документ в базу данных
Здравствуйте, имеется любой документ (пусть хоть docx, txt, xls, xml, без разницы). Так вот, как реализовать отправку данных через...

Загрузка данных из Excel в базу данных Access на VBA
Буду очень рад если кто-нибудь приведет более менее понятный код, как можно это реализовать средствами VBA


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru