Watch
响应式渲染组件,基于监听的数据源响应式渲染内容
API 参考
语法
<Watch watch={watchSource} deep={boolean?}>
{(value) => ReactNode}
</Watch>属性
watch: 要监听的数据源(store、函数或任何值)deep(可选): 启用深度相等检查以处理嵌套对象children: 接收监听值的渲染函数
示例
监听 Store 变化
import { createStore, Watch } from "zenbox";
const counterStore = createStore({ count: 0 });
function CounterDisplay() {
  return (
    <div>
      <Watch watch={counterStore}>
        {(state) => (
          <div>
            <h1>计数: {state.count}</h1>
            <p>偶数: {state.count % 2 === 0 ? "是" : "否"}</p>
          </div>
        )}
      </Watch>
      <button
        onClick={() =>
          counterStore.setState((s) => {
            s.count++;
          })
        }
      >
        增加
      </button>
    </div>
  );
}监听计算值
const userStore = createStore({
  firstName: "张",
  lastName: "三",
  age: 30,
});
function UserInfo() {
  return (
    <div>
      <Watch
        watch={() => `${userStore.value.firstName}${userStore.value.lastName}`}
      >
        {(fullName) => <h1>欢迎,{fullName}!</h1>}
      </Watch>
      <Watch watch={() => userStore.value.age >= 18}>
        {(isAdult) => <p>{isAdult ? "成年人" : "未成年"}</p>}
      </Watch>
    </div>
  );
}多 Store 监听
const cartStore = createStore({
  items: [
    { id: 1, name: "笔记本电脑", price: 999, quantity: 1 },
    { id: 2, name: "鼠标", price: 25, quantity: 2 },
  ],
});
const settingsStore = createStore({
  currency: "¥",
  taxRate: 0.08,
});
function CartSummary() {
  return (
    <Watch
      watch={() => ({
        items: cartStore.value.items,
        currency: settingsStore.value.currency,
        taxRate: settingsStore.value.taxRate,
      })}
    >
      {({ items, currency, taxRate }) => {
        const subtotal = items.reduce(
          (sum, item) => sum + item.price * item.quantity,
          0
        );
        const tax = subtotal * taxRate;
        const total = subtotal + tax;
        return (
          <div>
            <h3>购物车摘要</h3>
            <p>商品数量: {items.length}</p>
            <p>
              小计: {subtotal.toFixed(2)} {currency}
            </p>
            <p>
              税费: {tax.toFixed(2)} {currency}
            </p>
            <p>
              总计: {total.toFixed(2)} {currency}
            </p>
          </div>
        );
      }}
    </Watch>
  );
}条件渲染
const appStore = createStore({
  user: null,
  isLoading: false,
  error: null,
});
function UserProfile() {
  return (
    <Watch watch={() => appStore.value}>
      {({ user, isLoading, error }) => {
        if (isLoading) return <div>正在加载用户资料...</div>;
        if (error) return <div>错误: {error.message}</div>;
        if (!user) return <div>请登录</div>;
        return (
          <div>
            <h1>欢迎,{user.name}!</h1>
            <p>邮箱: {user.email}</p>
          </div>
        );
      }}
    </Watch>
  );
}最佳实践
- 用于复杂渲染逻辑 - 适合基于多个条件的条件渲染
 - 保持监听函数纯净 - 不要在监听函数中执行副作用
 - 明确依赖项 - 只访问实际需要的数据
 
相关文档
<Memo>- 缓存渲染组件useComputed- 响应式更新的计算值useStore- 同步 store 最新状态