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

Изменение state

21.02.2024, 14:30. Показов 379. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет! Делаю дипломный проект и столкнулся с проблемой отрисовки измененного state. Есть компонент с контентом, есть компонент навигации. В компоненте навигации элемент navlink с аттрибутом onclick. При клике по элементу должны сортироваться данные по определенному параметру и выводиться на экран. Но этого не происходит. Хотя, если удалить зависимости у хука 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
import { useDispatch } from 'react-redux';
import '../Styles/Navigation.css';
import {NavLink} from 'react-router-dom';
import { getOrders, getSortedOrders } from '../Redux/Reducers/ordersSlice';
 
const Navigation = () => {
    const dispatch = useDispatch();
    const getAllOrders = () => {
        dispatch(getOrders());
    };
    const getUncoordinatedOrders = () => {
        dispatch(getSortedOrders('несогласован'));
    };
    const getOrdersInProgress = () => {
        dispatch(getSortedOrders('в работе'));
    };
    const getCompletedOrders = () => {
        dispatch(getSortedOrders('завершен'));
    };
 
    return (
        <aside className = "menu">
            <p className = 'menu-label'>Личные задачи</p>
            <ul className = 'menu-list'>
                <li><NavLink to = "/Tasks">Список поручений</NavLink></li>
            </ul>
            <p className = "menu-label">Заказы</p>
            <ul className = "menu-list">
                <li>
                    <NavLink to = "/Orders" onClick = {getAllOrders}>Все заказы</NavLink>
                    <ul>
                        <li><NavLink to = "/Orders" onClick = {getUncoordinatedOrders}>На согласовании</NavLink></li>
                        <li><NavLink to = "/Orders" onClick = {getOrdersInProgress}>В работе</NavLink></li>
                        <li><NavLink to = "/Orders" onClick = {getCompletedOrders}>Завершенные</NavLink></li>
                    </ul>
                </li>
            </ul>
        </aside>
    );
}
 
export default Navigation;

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
import React from 'react';
import { connect, useDispatch, useSelector } from 'react-redux';
import { createOrder, getOrders } from '../../../Redux/Reducers/ordersSlice';
import '../../../Styles/Content.css';
import OrdersEditButtons from './OrdersEditButtons';
import { useEffect } from 'react';
 
const Orders = () => {
    const dispatch = useDispatch();
    const state = useSelector(state => state.orders.orders);
    useEffect(() => {dispatch(getOrders())}, [dispatch, state]);
    let orderNumber = React.createRef();
    let orderType = React.createRef();
    let orderPrice = React.createRef();
    let orderClient = React.createRef();
    let orderDate = React.createRef();
    let orderComplectation = React.createRef();
    let orderStatus = React.createRef();
    const user = JSON.parse(window.localStorage.getItem('user'));
    let disabled;
    if(user.userRole === 'director' || user.userRole === 'designer' || user.userRole === 'developer'){
        disabled = false;
    } else {
        disabled = true;
    }
    const addNewOrder = () => {
        if(orderNumber.current.value.length < 4 || orderNumber.current.value.length > 4 || orderNumber.current.value < 0) {
            alert('Укажите валидный номер заказа, состоящий из четырех цифр');
        }else if(orderPrice.current.value === '' || orderPrice.current.value < 0) {
            alert('Укажите валидную стоимость заказа');
        } else if(orderClient.current.value === '' || orderDate.current.value === '') {
            alert('Заполните все поля!');
        } else {
            const newOrder = {
                id : state.length + 1,
                number : orderNumber.current.value,
                type : orderType.current.value,
                price : orderPrice.current.value,
                client : orderClient.current.value,
                date : orderDate.current.value,
                complectation : orderComplectation.current.value,
                files : [],
                status : orderStatus.current.value
            }
            dispatch(createOrder(newOrder));
            orderNumber.current.value  = '';
            orderPrice.current.value = '';
            orderClient.current.value = '';
            orderDate.current.value = '';
        }    
    }
    let result = state.map((item, index) => {
        return (
            <tr key = {index}>
                <td>{item.number}</td>
                <td>{item.type}</td>
                <td>{item.price}</td>
                <td>{item.client}</td>
                <td>{new Date(item.date).toLocaleDateString()}</td>
                <td>{item.complectation}</td>
                <td>{item.status}</td>
                <td><OrdersEditButtons id = {item.id} orderNumber = {item.number}/></td>
            </tr>
        );
    });
    return (
        <div className = 'content'>
            <h1 className = 'subtitle has-text-centered'>Заказы</h1>
            <table className = 'table is-hoverable is-fullwidth'>
                <thead>
                    <tr>
                        <th>Номер заказа</th>
                        <th>Тип изделия</th>
                        <th>Стоимость</th>
                        <th>Клиент</th>
                        <th>Дата</th>
                        <th>Комплектация</th>
                        <th>Статус</th>
                        <th></th>
                    </tr>
                </thead>
                <tbody>
                    {result}
                </tbody>
            </table>
        </div>
    );
}
 
 
export default connect()(Orders);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2024, 14:30
Ответы с готовыми решениями:

Изменение state
Здравствуйте, столкнулся с такой проблемой: Есть компонент App, внутри которого есть state.value. Нужно c помощью компонента Child при...

Как правильно обновлять state на основе предыдущего значения state? Какие могут при этом возникнуть проблемы?
Как правильно обновлять state на основе предыдущего значения state? Какие могут при этом возникнуть проблемы? Обновить state на основе...

Redux vs State
Доброго времени суток. Написал свой календарь (с возможностью выбора диапазонов дат - месяцев, выбора одного дня-месяца). Начинал его...

3
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3832 / 1667 / 431
Регистрация: 14.03.2022
Сообщений: 4,205
21.02.2024, 15:15
Цитата Сообщение от Dragunov Посмотреть сообщение
Делаю дипломный проект
Общее впечатление - жуть.

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

Начинай с простого и работающего. Потом добавляй свои изыски. Так хоть поймешь после чего перестало работать.

Делай компоненты максимально простенькие. Не более пяти тегов в return...
У тебя пока какие-то монстры получаются.

Добавлено через 5 минут
Цитата Сообщение от Dragunov Посмотреть сообщение
JavaScript
1
2
import { createOrder, getOrders } from '../../../Redux/Reducers/ordersSlice';
import '../../../Styles/Content.css';
Дабы не "мутить" так с путями - используй алиасы.
Вот тебе статейка на эту тему...
https://vc.ru/dev/661503-sokra... yu-aliasov

Добавлено через 1 минуту
Цитата Сообщение от Dragunov Посмотреть сообщение
JavaScript
1
let orderNumber = React.createRef()
Рефы не меняются - используй const
Так же есть хук для рефов - useRef()

Добавлено через 1 минуту
Цитата Сообщение от Dragunov Посмотреть сообщение
JavaScript
1
useEffect(() => {dispatch(getOrders())}, [dispatch, state]);
Дюже много скобок...

Облегченный вариант
JavaScript
1
useEffect(_ => dispatch(getOrders()), [dispatch, state]);
Добавлено через 8 минут
Цитата Сообщение от Dragunov Посмотреть сообщение
JavaScript
1
2
3
import React from 'react';
// ...
import { useEffect } from 'react';
JavaScript
1
import React, { useEffect } from 'react';
Оно сам React мало когда нужен... Просто бери "из него" что нужно и все
JavaScript
1
import { useEffect, useState, useRef } from 'react';
0
1 / 1 / 1
Регистрация: 08.10.2020
Сообщений: 34
21.02.2024, 16:43  [ТС]
navigation
Code
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 { useDispatch } from 'react-redux';
import {NavLink} from 'react-router-dom';
import { getOrders, getSortedOrders } from '../Redux/Reducers/ordersSlice';
 
const Navigation = () => {
    const dispatch = useDispatch();
    const getAllOrders = () => {
        dispatch(getOrders());
    };
    const getUncoordinatedOrders = () => {
        dispatch(getSortedOrders('несогласован'));
    };
    const getOrdersInProgress = () => {
        dispatch(getSortedOrders('в работе'));
    };
    const getCompletedOrders = () => {
        dispatch(getSortedOrders('завершен'));
    };
 
    return (
        <aside className = "menu">
            <p className = "menu-label">Заказы</p>
            <ul className = "menu-list">
                <li>
                    <NavLink to = "/Orders" onClick = {getAllOrders}>Все заказы</NavLink>
                    <ul>
                        <li><NavLink to = "/Orders" onClick = {getUncoordinatedOrders}>На согласовании</NavLink></li>
                        <li><NavLink to = "/Orders" onClick = {getOrdersInProgress}>В работе</NavLink></li>
                        <li><NavLink to = "/Orders" onClick = {getCompletedOrders}>Завершенные</NavLink></li>
                    </ul>
                </li>
            </ul>
        </aside>
    );
}
 
export default Navigation;
Content
Code
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
import { useEffect } from 'react';
import { connect, useDispatch, useSelector } from 'react-redux';
import { getOrders } from '../../../Redux/Reducers/ordersSlice';
import OrdersEditButtons from './OrdersEditButtons';
 
const Orders = () => {
    const dispatch = useDispatch();
    const state = useSelector(state => state.orders.orders);
    useEffect(() => {dispatch(getOrders())}, [dispatch, state]);
    let result = state.map((item, index) => {
        return (
            <tr key = {index}>
                <td>{item.number}</td>
                <td>{item.type}</td>
                <td>{item.price}</td>
                <td>{item.client}</td>
                <td>{new Date(item.date).toLocaleDateString()}</td>
                <td>{item.complectation}</td>
                <td>{item.status}</td>
                <td><OrdersEditButtons id = {item.id} orderNumber = {item.number}/></td>
            </tr>
        );
    });
    return (
        <div className = 'content'>
            <h1 className = 'subtitle has-text-centered'>Заказы</h1>
            <table className = 'table is-hoverable is-fullwidth'>
                <tbody>
                    {result}
                </tbody>
            </table>
        </div>
    );
}
export default connect()(Orders);
Reducers
Code
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
export const getOrders = createAsyncThunk('orders/getOrders', async () => {
    try {
        const {data} = await axios.get('http://localhost:3001/api/orders');
        return data;
    } catch (error) {
        console.log(error);
    }
});
 
export const getSortedOrders = createAsyncThunk('orders/getSortedOrders', async (orderStatus) => {
    try {
        const {data} = await axios.get(`http://localhost:3001/api/orders/${orderStatus}`);
        return data;
    } catch (error) {
        console.log(error);
    }
});
 
builder.addCase(getOrders.fulfilled, (state, action) => {
            state.orders= action.payload.orders;
        })
 
builder.addCase(getSortedOrders.fulfilled, (state, action) => {
            state.orders = action.payload.sortedOrders;
        })
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3832 / 1667 / 431
Регистрация: 14.03.2022
Сообщений: 4,205
21.02.2024, 16:49
Цитата Сообщение от Dragunov Посмотреть сообщение
JavaScript
1
2
3
4
5
6
7
8
9
10
<tr key = {index}>
 <td>{item.number}</td>
 <td>{item.type}</td>
 <td>{item.price}</td>
 <td>{item.client}</td>
 <td>{new Date(item.date).toLocaleDateString()}</td>
 <td>{item.complectation}</td>
 <td>{item.status}</td>
 <td><OrdersEditButtons id = {item.id} orderNumber = {item.number}/></td>
 </tr>
Вот это все в отдельный компонент...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2024, 16:49
Помогаю со студенческими работами здесь

State и Render
Доброго времени суток! Пытаюсь решить следующую задачу! Есть компонент со стейтом, в котором есть поле id: В return рендера этого...

Не изменяется state
Здравствуйте! Не могу понять почему не отрабатывает this.setState() при вызове функции. Вот код: constructor(props){ ...

Наследование state
Можно ли унаследовать this.state у класса? и как это сделать. Пример class Example extends Component { constructor(props) { ...

TypeError: state is not iterable
Доброго времени суток! Подскажите, почему появляется такая ошибка? Это редьюсер: export let initialCostsState = { costs: , ...

Изменяю state но компонент не рендерится!
Приветствую Знатоки! При изменении массива не рендерится компонент &lt;TaskPanel /&gt;, сильно не пинайте я только вливарекчусь :) file...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru