Как работает стейт менеджер?

Всем добрый день, пробую разобраться со стейт менеджерами, я понимаю, что стейт менеджер предназначен для хранения глобального состояния (грубо говоря глобальная переменная). К которой можно обратиться из любого компонента.
Но проблема в том, что на одной и той же странице все работает корректно, но когда я изменяю стейт на странице А, то на странице Б стейт не меняется, помогите пожалуйста разобраться где у меня ошибка
redux toolkit
store
import { configureStore } from '@reduxjs/toolkit'
import counterSlice from './counterSlice'

export const store = configureStore({
  reducer: {
    counter: counterSlice
  },
})

export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch


slice
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import type { RootState } from '../Store/store'

interface CounterState {
  value: number
}

const initialState: CounterState = {
  value: 0,
}

export const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    increment: (state) => {
      state.value += 1
    },
    decrement: (state) => {
      state.value -= 1
    },
    incrementByAmount: (state, action: PayloadAction<number>) => {
      state.value += action.payload
    },
  },
})

export const { increment, decrement, incrementByAmount } = counterSlice.actions

export const selectCount = (state: RootState) => state.counter.value

export default counterSlice.reducer


hooks
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from '../store'

export const useAppDispatch = () => useDispatch<AppDispatch>()
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector


в компоненте
const count = useAppSelector((state) => state.counter.value)
  const dispatch = useAppDispatch()

<div>
        <div>
          <button
            aria-label="Increment value"
            onClick={() => dispatch(increment())}
          >
          Increment
          </button>
          <span>{count}</span>
          <button
            aria-label="Decrement value"
            onClick={() => dispatch(decrement())}
          >
          Decrement
          </button>
        </div>
      </div>
  • Вопрос задан
  • 495 просмотров
Решения вопроса 2
Alexandroppolus
@Alexandroppolus
кодир
тот стейт, который в редуксе - он общий внутри дерева реакт на одной вкладке. Чтобы пошарить на другие вкладки, можно, например, сохранять в localStorage, а по событию window.addEventListener('storage', ...) отлавливать изменения и подтягивать их в стейт-манагер. Это будет состояние в пределах браузера.
Можно сразу сохранять на сервер - старым добрым аяксом, вебсокетами, и т.д., тут нужны доработки на бэке. Такой путь сложнее, чем localStorage, но с той же корзиной может быть по другому никак - если единиц товара не очень много, то надо оперативно отслеживать его доступность другим пользователям.
Ответ написан
@kyzinatra
Состояние это что-то локальное. Только на конкретной странице браузера. Если вы хотите чтобы у 2 отдельно открытых страниц было синхронизированно состояние то вам нужно использовать веб сокеты. Ну или другими протоколами. Можно по http сделать. Это лучший вариант
Есть костыль с cохранением в IDB https://learn.javascript.ru/indexeddb
или в localstorage, но костыль) Если по -человечески то подклдючать работу бэка
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы