You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zustand状态中操作对象内数组时提示user对象不存在问题排查

问题排查与修复

核心问题

你的setFavoriteMovie函数存在嵌套状态更新的语法错误,Zustand无法识别直接修改嵌套属性的写法,必须通过创建新对象的方式更新嵌套状态。

错误原因

在Zustand的set回调中,你直接尝试修改user.favoriteMovies,但这种写法不符合状态更新规则:

  • set函数需要返回一个新的state片段,嵌套对象必须通过展开运算符生成新对象,不能直接修改原属性。
  • 代码中user.favoriteMovies的写法属于无效语法,因为在返回的对象字面量中,无法直接引用外层的user,必须基于state参数中的user构建新对象。

修复后的代码

import { create } from "zustand";
import { UserObject } from "../pages/login";

interface Store {
  user: UserObject;
  setUser: (data: UserObject) => void;
  setFavoriteMovie: (id: number) => void;
}

const emptyUserObject = {
  username: "",
  email: "",
  name: "",
  favoriteMovies: [],
};

const userStore = create<Store>((set) => ({
  user: emptyUserObject,
  setUser: (data: UserObject) => {
    set(() => ({ user: data }));
  },
  setFavoriteMovie: (id: number) => {
    set((state) => ({
      // 生成新的user对象,复用原有属性,更新favoriteMovies数组
      user: {
        ...state.user,
        favoriteMovies: [...state.user.favoriteMovies, id],
      },
    }));
  },
}));

额外优化点

  1. 将setUser的参数类型从any改为UserObject,保证类型安全。
  2. 修正setFavoriteMovie的返回值类型为void,无需返回任何值。

内容的提问来源于stack exchange,提问作者CzechCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:48:24