首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Redux工具包中使用createSlice动态加载initialState

在Redux工具包中使用createSlice动态加载initialState
EN

Stack Overflow用户
提问于 2020-04-03 02:57:02
回答 1查看 2.4K关注 0票数 5

有没有一种众所周知的模式,可以将动态初始状态的有效负载注入Redux-Toolkit的initialState对象?

也就是说,我想这样做-

代码语言:javascript
复制
import initialState from './initialState';

function generateSlice(payload = {}){
  const postsSlice = createSlice({
    name: 'posts',
    initialState: {...initialState, ...payload}, /// inject data here
    reducers: {...}
  })
}

例如,除非在带有data {availableRooms: [{...}]}的初始化上注入,否则{availableRooms: []}是一个空数组

此模式不起作用,但是,b/c我想导出可分派的操作,如下所示-

代码语言:javascript
复制
 const postsSlice = createSlice({
    name: 'posts',
    initialState: {...initialState, ...payload},
    reducers: {...}
  })

export {actionName} from postsSlice.actions;

*****
import {actionName} from '../mySlice'

...
const dispatch = useDispatch();
dispatch(actionName('exampleVal'));
...

我受到airbnb linting规则的约束,所以我不能在let上导出-

代码语言:javascript
复制
let actions; ///Bad
function generateSlice(payload){
  const postsSlice = createSlice({
    name: 'posts',
    initialState: {...initialState, ...payload},
    reducers: {...}
  })
  actions = postsSlict.actions
}

export actions;

我所追求的功能在没有使用createSlice的情况下会更容易一些。我提出这个问题的原因是,我在很多地方看到推荐使用createSlice而不是createAction + createReducer,但我没有看到任何简单的方法来引入我正在寻找的动态数据。

我对redux-orm一无所知,但我认为我所追求的功能与this SO question类似

EN

回答 1

Stack Overflow用户

发布于 2020-12-03 02:06:08

这是我目前的解决方案,它完全跳过了createSlice

在根渲染中

代码语言:javascript
复制
...
const store = initStore(data);
 <Provider store={store}>
  <App />
</Provider>

和init函数(为简洁起见进行了删减)

代码语言:javascript
复制
import {
  configureStore,
  getDefaultMiddleware,
  combineReducers,
} from '@reduxjs/toolkit';
import reservationReducer from '@reservation/reducer';
import spaceHierarchyReducer from '@map/reducer';
import appStoreReducer from '@app/reducer';

let ReduxStore;

function initStore(
  ssrState: Partial<RootStore> = {},
) {
  if (ReduxStore) {
    return ReduxStore;
  }
  const slices = {
    reservation: reservationReducer,
    spaceHierarchy: spaceHierarchyReducer,
    appStore: appStoreReducer,
  };
  const reducer = combineReducers(slices);
  const preloadedState = getInitialState(ssrState);
  const store = configureStore({
    reducer,
    middleware,
    preloadedState,
  });

  ReduxStore = store;
  initDispatch(store);
  return store;
}

getInitialState中,我解析URL并根据业务需求设置存储,这是服务器端数据+url可注入参数的混合。然后,在initDispatch中,我为一些基于注入的初始状态的初始化逻辑调用store.dispatch()

在这里,Typescript的使用非常有用,因为它强制执行从getInitialState返回的数据的形状以及reducers的形状。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60999058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档