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是稳定引用的对象,内部属性变化不会触发更新。
正确的写法示例
如果需要基于对象内部属性变化触发请求,推荐以下两种方式:
- 提取关键属性作为依赖数组:
// 提取对象中影响请求的关键属性,组成数组作为依赖 const [val] = createResource([props.id, props.status], ([id, status]) => { return req(id, status); });
- 创建稳定的深度比较依赖(以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
相关产品推荐
相关产品推荐

