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

SolidJS:能否向createResource的第一个参数传入对象?

关于createResource第一个参数传入对象的问题

可以给createResource的第一个参数传入对象,但需要注意它的依赖更新逻辑——createResource通过浅比较判断依赖是否变化,从而决定是否重新执行请求函数。如果依赖的引用每次渲染都改变(比如每次都创建新对象/数组),会导致无限重复请求;如果依赖是稳定引用但内部属性变化,又不会触发更新,这是你之前写法失效的核心原因。

针对你尝试的几种写法,具体分析如下:

  • const [val] = createResource(props, req);:若props是父组件传入的临时对象(比如父组件直接传{key: value}),每次父组件渲染都会生成新的对象引用,导致请求反复触发;只有当props是稳定引用的对象时,才能正常工作。
  • const [val] = createResource(signal(), req);:signal跟踪的是引用变化,若signal内部的对象属性改变但引用未变,不会触发请求更新;只有当你给signal赋值新的对象引用时,才会触发请求。
  • const [val] = createResource(["foo","bar"], req);:数组属于引用类型,每次渲染都会创建新的数组实例,同样会导致请求无限重复,除非这个数组是通过缓存(比如useMemo)或signal保持稳定引用。
  • const [val] = createResource(merged, req);:merged如果是每次渲染都重新合并生成的对象/数组,引用不稳定,会重复触发请求;若merged是稳定引用的对象,内部属性变化不会触发更新。

正确的写法示例

如果需要基于对象内部属性变化触发请求,推荐以下两种方式:

  1. 提取关键属性作为依赖数组:
// 提取对象中影响请求的关键属性,组成数组作为依赖
const [val] = createResource([props.id, props.status], ([id, status]) => {
  return req(id, status);
});
  1. 创建稳定的深度比较依赖(以SolidJS为例):
import { createMemo } from "solid-js";

// 用createMemo缓存对象,通过深度比较判断是否更新
const stableDep = createMemo(() => props, {
  equals: (prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)
});
const [val] = createResource(stableDep, req);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:19:47