开发者问题收集

如何使用 redux-toolkit 访问 redux 中另一个切片的状态?

2020-06-18
47826

在我的 Redux 存储中,我有多个切片,并且我想访问 speciesSlice 内 settingsSlice 的 lang 状态。

这是我的切片的代码示例:

const settingsSlice = createSlice({
  name: 'settings',
  initialState: { lang: 'en', theme: 'dark' },
  reducers: {
    ...
  },
});

const speciesSlice = createSlice({
  name: 'species',
  initialState: data[`vds-list-${HERE I WANT TO USE THE "lang" STATE OF THE SETTINGSSLICE}`],
  reducers: {
    ...
  },
});

到目前为止,我还没有找到解决方案,所以也许这是不可能的?

我只能使用一个切片,其中包含所有的状态,但我真的很想将状态的不同部分分成不同的切片。

3个回答
根据定义,

还原器只能访问其拥有的状态部分。 因此,如果我有 {用户:用户REDUCER,帖子:postsreducer}userSreducer 无法访问 ports> posts State slice。 /p>

参见 “我如何在还原器之间共享状态?” 以获取更多详细信息。

markerikson
2020-06-18

我通过简单地导入 redux 存储对象并调用 getState() 方法实现了这一点。

因此在 speciesSlice 减速器操作中您可以这样做:

const speciesSlice = createSlice({
  name: 'species',
  initialState: data[`vds-list-${HERE I WANT TO USE THE "lang" STATE OF THE SETTINGSSLICE}`],
  reducers: {
    ...
    setLang: (state, _) => {
      const reduxStore = store.getState();
      const lang = reduxStore.settingsSlice.lang;
      state = data[`vds-list-${lang}`];
    },
    ...
  },
});
Muhammad Omran
2022-04-04

我们可以通过 添加 extraReducers 来响应 action

// Slice A - sliceA.js
export const sliceAinitialState = {
  lang: 'en',
}
const sliceA = createSlice({
  name: 'A'
  initialSlice: sliceAinitialState,
  reducers: {
    langChangedAtSliceA: (state, action) => state.lang = action.payload,
  }
})
export const {langChangedAtSliceA } = sliceA.actions

// Slice B - sliceB.js
import {sliceAinitialState, langChangedAtSliceA} from 'sliceA.js'
const sliceB = createSlice({
  name: 'B'
  initialSlice: {
    lang: sliceAinitialState.lang
  },
  extraReducers: (builder) => {
    builder.addCase(langChangedAtSliceA, (state, action) => {
      state.lang = action.payload
    })
  }
})
Rustem
2023-03-11