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

在TanStack Table单元格调用Zustand Hook触发ESLint错误的解决方法

解决TanStack Table单元格中调用Zustand Hook的ESLint错误

方案1:将单元格内容封装为独立React组件(推荐)

这是最符合React Hook规则的标准做法,把原本写在cell函数里的逻辑抽成一个大写开头的React组件,在组件内部合法调用Hook:

// 定义独立的单元格组件
const CartQuantityCell = ({ row }) => {
  const product = row.original;
  const productId = product.id;
  
  // 合法调用Zustand Hook
  const cart = useCartStore((state) => state.cart);
  const updateQuantity = useCartStore((state) => state.updateQuantity);
  const removeItem = useCartStore((state) => state.removeFromCart);

  const cartItem = cart.find((item) => item.id === productId);
  const quantity = cartItem ? cartItem.quantity : product.quantity;

  // 返回单元格的交互内容
  return (
    <div className="cart-cell">
      <input 
        type="number" 
        min="1"
        value={quantity} 
        onChange={(e) => updateQuantity(productId, Number(e.target.value))}
      />
      <button onClick={() => removeItem(productId)} className="remove-btn">删除</button>
    </div>
  );
};

// 在TanStack Table列配置中使用该组件
const columns = [
  // 其他列配置...
  {
    header: '购物车数量',
    cell: ({ row }) => <CartQuantityCell row={row} />,
  },
];

方案2:直接访问Zustand Store(非响应式场景)

如果你的场景不需要实时响应购物车数据变化(仅静态展示),可以直接调用Zustand Store的getState()方法获取状态,避开Hook调用限制:

// 假设你的Zustand Store实例是这样创建的
const useCartStore = create((set, get) => ({
  cart: [],
  updateQuantity: (id, qty) => { /* 状态更新逻辑 */ },
  removeFromCart: (id) => { /* 状态更新逻辑 */ },
}));

// 直接获取Store实例
const cartStore = useCartStore;

// 在cell函数中使用
const columns = [
  {
    header: '购物车数量',
    cell: ({ row }) => {
      const product = row.original;
      const productId = product.id;
      
      // 直接获取当前状态
      const cart = cartStore.getState().cart;
      const cartItem = cart.find((item) => item.id === productId);
      const quantity = cartItem ? cartItem.quantity : product.quantity;

      // 调用Store方法时同样使用getState()
      return (
        <div>
          <span>{quantity}</span>
          <button onClick={() => cartStore.getState().removeFromCart(productId)}>删除</button>
        </div>
      );
    },
  },
];

⚠️ 注意:这种方式不会自动订阅Store变化,当购物车数据更新时单元格不会自动重新渲染,仅适合静态展示或手动处理更新的场景。

方案3:父组件预取数据注入表格

如果表格数据与购物车数据关联紧密,可以在表格所在的父组件中先获取完整的购物车数据,将数量信息预注入到每行产品数据中,避免在cell函数中调用Hook:

// 表格所在的父组件
const ProductTable = () => {
  const cart = useCartStore((state) => state.cart);
  // 假设原始产品列表为products
  const productsWithCartData = products.map(product => {
    const cartItem = cart.find(item => item.id === product.id);
    return {
      ...product,
      cartQuantity: cartItem ? cartItem.quantity : product.quantity,
    };
  });

  const columns = [
    {
      header: '购物车数量',
      cell: ({ row }) => {
        // 直接使用预计算好的cartQuantity
        return <span>{row.original.cartQuantity}</span>;
      },
    },
  ];

  return <TanStackTable data={productsWithCartData} columns={columns} />;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 21:23:18