我如何解决 Cannot use 'in' operator to search for ‘1’ in undefined in react?

how i fix Cannot use 'in' operator to search for '1' in undefined in react?

我想学习 redux 和 redux 工具包,但我遇到了问题。我不知道如何解决它。

我只想在用户存储中存储任何项目。

在我的示例中,这 2 个项目:

id: '1' 用户名:输入

store.js

import { configureStore } from '@reduxjs/toolkit';
import userReducer from './usersSlice';

const store = configureStore({
  reducer: {
    users: userReducer
  },
})

export default store;

usersSlicer.js

import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'

export const todoAdapter = createEntityAdapter();
export const todoSelector = todoAdapter.getSelectors(state => state.users);

const initialState = {

}

const usersSlice = createSlice({
  name: 'users',
  initialState,
  reducers: {
    addUser: todoAdapter.addOne
  }
});

export const { addUser } = usersSlice.actions
export default usersSlice.reducer

Form.js

import { useState } from 'react';
import { addUser } from '../store/usersSlice';
import { useDispatch } from 'react-redux';
const Form = () => {
  const dispatch = useDispatch();
  const [input, setInput] = useState('');

  dispatch(addUser({
    id: '1',
    username: input
  }));

  return (
    <form>
      <input type="text" onChange={e => setInput(e.target.value)}/>
    </form>
  )
};

export default Form;

问题:初始状态

console.log("initial", todoAdapter.getInitialState());

上面的语句显示了 todoAdapter 创建的初始状态。它是一个带有数组 属性 ids 和对象 属性 entities 的对象。看起来像:

initial {ids: Array(0), entities: Object}

todoAdapter 上调用 addOne 是在 entities 属性.

中搜索键 1

您的切片的初始状态是一个空对象 {}。它没有 idsentitiesaddOne 函数在 state.entities 中搜索 id 1 时,出现错误 “无法使用 'in' 运算符在未定义中搜索‘1’” 因为 state.entitiesundefined.

解决方案

对此有一个非常简单的解决方案。您可以将切片的初始状态设置为实体适配器提供的状态。

const usersSlice = createSlice({
  name: "users",
  initialState: todoAdapter.getInitialState(),
  reducers: {
    addUser: todoAdapter.addOne
  }
});