nra*_*ako 5 reactjs redux react-redux redux-toolkit
是否有一种众所周知的模式可以将动态初始状态的负载注入 Redux-Toolkit 的 initialState 对象?
也就是说,我想这样做 -
import initialState from './initialState';
function generateSlice(payload = {}){
const postsSlice = createSlice({
name: 'posts',
initialState: {...initialState, ...payload}, /// inject data here
reducers: {...}
})
}
Run Code Online (Sandbox Code Playgroud)
例如,{availableRooms: []}是一个空数组,除非在 init 上注入数据{availableRooms: [{...}]}
这种模式不起作用,但是,b/c 我想将操作导出为可调度的,就像这样-
const postsSlice = createSlice({
name: 'posts',
initialState: {...initialState, ...payload},
reducers: {...}
})
export {actionName} from postsSlice.actions;
*****
import {actionName} from '../mySlice'
...
const dispatch = useDispatch();
dispatch(actionName('exampleVal'));
...
Run Code Online (Sandbox Code Playgroud)
我受到airbnblinting 规则的限制,所以我不能导出 -
let actions; ///Bad
function generateSlice(payload){
const postsSlice = createSlice({
name: 'posts',
initialState: {...initialState, ...payload},
reducers: {...}
})
actions = postsSlict.actions
}
export actions;
Run Code Online (Sandbox Code Playgroud)
我所追求的功能在不使用createSlice. 我的问题的原因是我在多个地方看到了createSlice推荐 over createAction+ createReducer,但我没有看到任何简单的方法来介绍我正在寻找的动态数据。
我什么都不知道,redux-orm但我认为我所追求的功能类似于这个 SO question
这是我当前的解决方法,createSlice完全跳过。
在根渲染中
...
const store = initStore(data);
<Provider store={store}>
<App />
</Provider>
Run Code Online (Sandbox Code Playgroud)
以及 init 函数(为简洁起见,进行了精简)
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;
}
Run Code Online (Sandbox Code Playgroud)
在 中getInitialState,我解析 URL 并根据业务需求设置商店,混合了服务器端数据 + url 可注入参数。然后,在 中initDispatch,我调用store.dispatch()一些基于注入初始状态的初始化逻辑。
在这里,Typescript 的使用非常有用,因为它强制执行reducer 返回的数据的形状getInitialState以及reducers 的形状。
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |