我如何使用 useReducer 将 js 与 firestore 反应?它总是 return 未定义

how can i use useReducer react js with firestore? it always return undifined

我如何使用 useReducer react js 与 firestore?它总是 return 未定义

我正在尝试将 reducer 与 firebase 结合使用,但是如果我在 useEffect 中使用 dispatch,我将无法获取数组。

userType 工作正常。我做错了什么?

首次渲染app.js页面时,我想加载登录用户数据,用户数据

和firestore中的订单信息产品信息,放入状态,进行管理。

如果有更好的方法,请推荐。

const iState = {
  orders: [],
  userType: "before",
};
function reducer(state, action) {
  switch (action.type) {
    case "ORDERS":
      return { orders: [...state.orders, [action.order]] };
    case "CHANGE":
      return { userType: action.userType };
    default:
      return state;
  }
}
function Counter() {
  const [user, loading] = useAuthState(auth);
  const [state, dispatch] = useReducer(reducer, iState);
  const { orders, userType } = state;
  useEffect(() => {
    db.collection("accounts")
      .doc(user?.email)
      .get()
      .then(doc => dispatch({ type: "CHANGE", userType: doc?.data()?.type }));
    db.collection("orders")
      .doc("b2b")
      .collection("b2borders")
      .onSnapshot(snapshot =>
        dispatch({
          type: "ORDERS",
          order: snapshot.docs.map(doc => ({ id: doc.id, data: doc.data() })),
        })
      );
  }, [user, dispatch]);
  if (loading || userType === "before") {
    return (
      <div className="grid place-items-center h-screen w-full">
        <div className="text-center pb-24 flex flex-col justify-center items-center">
          <Spinner name="ball-spin-fade-loader" color="gray" fadeIn="none" />
        </div>
      </div>
    );
  }
  if (user && userType === "admin") {
    return (
      <div className="grid place-items-center h-screen w-full">
        {console.log(orders)}
      </div>
    );
  }
  return (
    <>
      <div className="grid place-items-center h-screen w-full">
        <div className="text-center pb-24 flex flex-col justify-center items-center">
          <Spinner name="ball-spin-fade-loader" color="gray" fadeIn="none" />
        </div>
      </div>
    </>
  );
}
export default Counter;

您没有正确编写减速器。 reducer 是一个纯函数,它将当前状态和分派的动作作为输入,returns 是新状态。因此,每当您 return 来自 reducer 的新状态对象时,它都会完全替换您当前的状态对象,而不是将您的新状态与当前状态合并。

因此,您必须将减速器更改为如下所示:

function reducer(state, action) {
  switch (action.type) {
    case "ORDERS":
      return {...state, orders: [...state.orders, {...action.order}] };
    case "CHANGE":
      return {...state, userType: action.userType };
    default:
      return state;
  }
}