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

如何在Solid-JS中每次信号更新时创建新组件实例?

在Solid.js中实现静态props变化时自动重建组件实例

核心解决方案:利用key属性

Solid.js提供了key属性来控制组件的实例生命周期——当key的值发生变化时,框架会自动销毁旧的组件实例,并创建一个全新的实例,这正好满足你需要在静态props变化时重建组件的需求。

针对示例B的修改

你只需要给Foo组件添加key属性,将需要触发重建的依赖值(比如day())作为key的值即可:

const Foo = ({ day, time }) => {
  // day: "mon", "tue", etc.
  // time: "day-time", "night-time"

  const weather = fetch_weather(day);
  
  return <>
    <Show when={time() === "day-time"}>
      {weather.dayTimeResults}
    </Show>
    <Show when={time() === "night-time"}>
      {weather.nightTimeResults}
    </Show>
  </>;
};

export const Weather = () => {
  const [day, setDay] = createSignal();
  const [time, setTime] = createSignal();

  // 现在写法有效:day变化时,Foo会重建
  return <Foo key={day()} day={day()} time={time}/>;
};

每次day的signal更新时,key={day()}的值会变化,Solid就会销毁旧的Foo实例,创建新的,从而重新执行fetch_weather(day)获取对应日期的天气数据。

多依赖场景的优化

如果有多个静态props需要触发组件重建,你可以把多个依赖值组合成一个key:

// 用模板字符串组合多个值
return <Foo key={`${day()}-${anotherStaticProp()}`} day={day()} another={anotherStaticProp()} time={time}/>;

// 或者直接传数组(Solid会自动比较数组内容)
return <Foo key={[day(), anotherStaticProp()]} day={day()} another={anotherStaticProp()} time={time}/>;

示例A的实现

对于你想每次foo变化时生成新input元素的场景,同样给input加上key:

export default () => {
  const [foo, setFoo] = createSignal();

  return <input key={foo()} .../>;
};

当foo的值变化时,key更新,Solid会移除旧的input元素并创建新的。

注意事项

  • key的值需要能唯一标识组件的状态,确保只有当你需要重建组件时才会变化;
  • 不要使用随机值或不稳定的标识作为key,否则会导致组件频繁无意义重建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:22:33