减速器中未触发 redux-toolkit 操作

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

Den*_*ash 6

我认为你的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)

编辑 redux-toolkit

@markerikson:对于createSlice,reducers 字段用于定义reducer 并生成与这些reducers 匹配的操作。该extraReducers字段用于处理已在其他地方定义的操作。