Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514

Не работает синтаксис мутации в "createSlice" Redux

21.09.2021, 11:45. Показов 1503. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не работает синтаксис мутации в "createSlice" Redux.
Вот к примеру (38 - 41ст) кусок рабочего кода(когда нажимаете на хрестик удаления задания, то выполняется этот кусок), но состояние не изменяется, если переписать на:
JavaScript
1
2
3
4
deleteToDo(state, action) {
            const elemId = action.payload
            return state.filter((item) => item.id !== elemId)
        }
то всё ок, но я хочу использовать возможность immer которая должна быть здесь предоставлена.
github: https://github.com/Alexander-K... a4cb8a0cc8

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
import {initialToDosState} from "../initialState";
// import {constants} from "../constants";
import {v4 as uuidv4} from 'uuid';
import {createSlice} from "@reduxjs/toolkit";
const todosReducer = createSlice({
    name: 'todos',
    initialState: initialToDosState,
    reducers: {
        addToDo(state, action) {
            state = [
                ...state,
                {
                    id: uuidv4(),
                    text: action.payload,
                    completed: false
                }
            ]
        },
        markCompleted: {
            reducer(state, action) {
                state = state.map((item) => {
                    if (item.id === action.payload.id) {
                        return {
                            ...item,
                            completed: action.payload.value
                        }
                    } else {
                        return item
                    }
                })
            },
            prepare(id, completed) {
                return {
                    payload: {id, completed}
                }
            }
        },
        deleteToDo(state, action) {
            const elemId = action.payload
            state = state.filter((item) => item.id !== elemId)
        },
        addColor(state, action) {
            state = state.map(item => {
                if (item.id === action.payload.id) {
                    return {
                        ...item,
                        color: action.payload.newColorValue
                    }
                } else {
                    return item
                }
            })
        },
        markAllCompleted(state, action) {
            state = state.map(todo => ({...todo, completed: action.payload}))
        },
        clearCompleted(state, action) {
            state = state.filter(todo => {
                return !action.payload.id.some(id => id === todo.id)
            })
        }
    }
})
 
export const {addToDo, markCompleted, deleteToDo, addColor, markAllCompleted, clearCompleted} = todosReducer.actions
export default todosReducer.reducer
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2021, 11:45
Ответы с готовыми решениями:

Redux+React. Взаимодействие redux store с сервером
Помогите понять такой момент: Приложение react+redux+ сервер на ноде. Пока не использовал сервер работа redux store была более-менее...

Мутации данных
Подскажите, если у меня на входе массив из 100 значений, он будет как 1 ( правильный ) ну или 100 правильных, далее я генерирую 100...

синтаксис метода, синтаксис конструктора, синтаксис деструктора
Я нашёл в интернете пример использования структуры для обработки исключений. Всё заработало. Однако есть несколько мест, смысл которых я...

5
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
21.09.2021, 20:24
так.. это.. в доке написано что нужно использовать return..

https://redux-toolkit.js.org/u... cing-state
0
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
22.09.2021, 09:10  [ТС]
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
так.. это.. в доке написано что нужно использовать return..

https://redux-toolkit.js.org/u... cing-state
Вот пожалуйста полюбуйтесь что в доке написано.
https://redux.js.org/tutorials... reateslice
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
22.09.2021, 22:15
Цитата Сообщение от AlexKOR5 Посмотреть сообщение
Вот пожалуйста полюбуйтесь что в доке написано.
https://redux.js.org/tutorials... reateslice
не вижу, добавьте пожалуйста цитату с этой странице о чём вы говорите..
1
 Аватар для AlexKOR5
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
23.09.2021, 11:36  [ТС]
Цитата Сообщение от muxahuk1214 Посмотреть сообщение
не вижу, добавьте пожалуйста цитату с этой странице о чём вы говорите..
Вот пример из доки (ст 10)
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
import { createSlice } from '@reduxjs/toolkit'
 
const initialState = []
 
const todosSlice = createSlice({
  name: 'todos',
  initialState,
  reducers: {
    todoAdded(state, action) {
      // ✅ This "mutating" code is okay inside of createSlice!
      state.push(action.payload)
    },
    todoToggled(state, action) {
      const todo = state.find(todo => todo.id === action.payload)
      todo.completed = !todo.completed
    },
    todosLoading(state, action) {
      return {
        ...state,
        status: 'loading'
      }
    }
  }
})
 
export const { todoAdded, todoToggled, todosLoading } = todosSlice.actions
 
export default todosSlice.reducer
Дальше по доке, демонстрируются примеры:

So, instead of this:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function handwrittenReducer(state, action) {
  return {
    ...state,
    first: {
      ...state.first,
      second: {
        ...state.first.second,
        [action.someId]: {
          ...state.first.second[action.someId],
          fourth: action.someValue
        }
      }
    }
  }
}
You can write code that looks like this:
JavaScript
1
2
3
function reducerWithImmer(state, action) {
  state.first.second[action.someId].fourth = action.someValue
}
That's a lot easier to read!

But, here's something very important to remember:

WARNING
You can only write "mutating" logic in Redux Toolkit's createSlice and createReducer because they use Immer inside! If you write mutating logic in reducers without Immer, it will mutate the state and cause bugs!
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
23.09.2021, 23:06
Лучший ответ Сообщение было отмечено AlexKOR5 как решение

Решение

а вот то, на что я прислал ссылку:

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
Resetting and Replacing State#
Sometimes you may want to replace the entire existing state, either because you've loaded some new data, or you want to reset the state back to its initial value.
 
[B]WARNING[/B]
A common mistake is to try assigning [B]state = someValue[/B] directly. This will not work! This only points the local state variable to a different reference. That is neither mutating the existing state object/array in memory, nor returning an entirely new value, so Immer does not make any actual changes.
 
Instead, to replace the existing state, you should return the new value directly:
 
const initialState = []
const todosSlice = createSlice({
  name: 'todos',
  initialState,
  reducers: {
    brokenTodosLoadedReducer(state, action) {
      // ❌ ERROR: does not actually mutate or return anything new!
      state = action.payload
    },
    fixedTodosLoadedReducer(state, action) {
      // ✅ CORRECT: returns a new value to replace the old one
      return action.payload
    },
    correctResetTodosReducer(state, action) {
      // ✅ CORRECT: returns a new value to replace the old one
      return initialState
    },
  },
})
да и к тому же по вашей ссылке нет ни одного примера где бы они перезаписывали верхний уровень (state), они везде в своих примерах перезаписывают нечто внутри state, а не сам state..

В общем, если не работает, то я привёл ссылку, почему может не работать.
Если вы настаиваете на том, что должно работать как у вас написано - сделайте что-бы работало и покажите нам как вы это сделали.

Если считаете, что у них модуль не правильно работает, а именно, вот этот ваш случай, можете на гитхабе зарепортить им ишую и возможно они её пофиксят, ну или ответят что так не будет работать и скажут почему...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2021, 23:06
Помогаю со студенческими работами здесь

Проблема мутации при изменении данных в таблице
Доброго времени суток! Существует задача, при изменении статуса продукта, в той же таблице, триггером выставляется время изменения...

Синтаксис Heredoc странно работает
Почему выводит ошибку Parse error: syntax error, unexpected $end? <?php $x=10; echo <<<МЕТКА $x МЕТКА; ...

Как работает данный синтаксис
Добрый день, подскажите пожалуйста, как работает синтаксис: #define RM_INPUT 0x00B1 // Цифровые входы typedef __packed struct { ...

Kotlin синтаксис, не работает прога
Помогите разобраться в синтаксисе Kotlin. Есть задача считывать введение данные, пока не будет введено "stop" слово, после...

IMG в PHP не работает. Синтаксис правильный
<?php echo "<img src="/uploads/a.jpg" alt="альтернативный текст">"; ?> Вот этот код не работает, выдает ошибку. Файл...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru