Tec*_*irl 10 javascript reactjs redux redux-toolkit
我正在尝试使用 @reduxjs/Toolkit 触发一个简单的操作,但它不起作用。
我看到该操作已调度,但就像切片减速器没有监听它或其他什么。
const say = createAction("ui/say", what => ({ payload: what }));
const uiSlice = createSlice({
name: "ui",
initialState: { said: "" },
reducers: {
[say.type]: (state, action) => {
console.log("saying", action.payload); //<-- not showing, why?
state.currentList = action.payload;
}
}
});
const store = configureStore({
reducer: combineReducers({
ui: uiSlice.reducer
})
});
const Chat = () => {
const dispatch = useDispatch();
const [whatToSay, setWhatToSay] = useState("");
const whatWasSaid = useSelector(state => state.ui.said);
const onSubmit = e => {
e.preventDefault();
dispatch(say(whatToSay));
setWhatToSay("");
};
return (
<div>
<form onSubmit={onSubmit}>
<input type="text" onChange={e => setWhatToSay(e.target.value)} />
<button>Say</button>
</form>
{whatWasSaid ? <p>You said: {whatWasSaid}</p> : <p>Say something</p>}
</div>
);
};
Run Code Online (Sandbox Code Playgroud)
这是一个最小的复制示例: https://codesandbox.io/s/redux-toolkit-0tzxs ?file=/src/index.js
我认为你的createSliceAPI不匹配。
从您的代码中,您尝试为操作实现侦听器,因此您可能需要改用extraReducers:
const uiSlice = createSlice({
name: "ui",
initialState: { said: "" },
// Not reducers: {}
extraReducers: {
[say.type]: (state, action) => {
console.log("saying", action.payload);
state.currentList = action.payload;
}
}
});
Run Code Online (Sandbox Code Playgroud)
注意APIreducers的prop createSlice:
reducers: Object<string, ReducerFunction | ReducerAndPrepareObject>
Run Code Online (Sandbox Code Playgroud)
say如果你想在其中使用reducers应该是:
const say = (state, payload) => {
console.log("saying", payload);
state.currentList = payload;
};
const uiSlice = createSlice({
name: "ui",
initialState: { said: "" },
reducers: { say }
});
// Usage
dispatch(uiSlice.actions.say(whatToSay));
Run Code Online (Sandbox Code Playgroud)
@markerikson:对于
createSlice,reducers 字段用于定义reducer 并生成与这些reducers 匹配的操作。该extraReducers字段用于处理已在其他地方定义的操作。
| 归档时间: |
|
| 查看次数: |
9201 次 |
| 最近记录: |