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

VanJS中如何添加动态类?状态更新后类未同步问题

问题原因

你遇到的核心问题是没有建立VanJS状态与DOM属性的响应式绑定:

  • 你直接读取了divider.val的静态值计算class,VanJS无法追踪这个依赖关系
  • 组件初始化时仅计算一次class值,后续divider状态更新时,不会触发class的重新计算
解决办法

在VanJS中,要让DOM属性随状态动态更新,需要将属性值定义为函数,VanJS会自动追踪函数内用到的状态,当状态变化时重新执行函数并更新DOM属性。

修改后的DividerList组件代码:

const DividerList = ({ N, divider }) => {
  return Array.from({ length: N.val }, (_, i) => i + 1).map((i) =>
    div(
      {
        onclick: () => (divider.val = i),
        // 将class设为函数,动态计算类名
        class: () => `divider-item ${i % divider.val === 0 ? "green" : "red"}`,
      },
      i
    )
  );
};

TypeScript版本修改方式一致:

import van, { State } from "vanjs-core";

const { div } = van.tags;

export const DividerList = ({
  N,
  divider,
}: {
  N: State<number>;
  divider: State<number>;
}) => {
  return Array.from({ length: N.val }, (_, i) => i + 1).map((i) =>
    div(
      {
        onclick: () => (divider.val = i),
        class: () => `divider-item ${i % divider.val === 0 ? "green" : "red"}`,
      },
      i
    )
  );
};
原理说明

VanJS的响应式系统基于依赖追踪:

  • 当你将DOM属性设为函数时,VanJS会在首次执行函数时,记录函数内用到的所有状态对象
  • 当状态对象的.val更新时,VanJS会自动重新执行函数,并将返回值更新到对应的DOM属性上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:35:08