GrowthBook useFeature()偶返回defaultValue而非experiment问题求助
问题原因分析
以下是导致feature.source返回defaultValue而非预期experiment的常见原因:
1. 特性加载与组件渲染的时序问题
fetch(FEATURES_ENDPOINT)是异步操作,页面的page.js组件可能在远程特性数据返回前就完成了初始渲染,此时useFeature还未获取到配置的实验规则,只能返回默认值。
2. 用户属性设置时机错误
当前代码中,growthbook.setAttributes()在fetch请求外部同步执行,而growthbook.setFeatures()是在fetch回调中异步执行的。这意味着特性设置完成时,用户属性可能还未生效,GrowthBook无法根据属性匹配实验规则,最终 fallback 到默认值。
3. 实验规则的受众条件不匹配
检查GrowthBook后台配置的stroke-care_page实验规则:
- 确认规则中的受众条件(如用户属性、设备信息等)是否和代码中
setAttributes传入的参数完全匹配 - 如果当前用户的属性不符合实验规则设置的分组条件,就会返回默认值
4. DevMode的干扰
你开启了enableDevMode: true,开发模式下GrowthBook可能会保留本地缓存的特性值,或允许手动强制切换特性状态,这可能导致实验规则未被正确应用。
5. 实验未发布或配置有误
- 确认GrowthBook后台的
stroke-care_page特性实验是否已正式发布 - 检查实验的两条规则是否配置了正确的50%-50%流量占比,且没有优先级更高的规则覆盖当前实验
代码优化建议
针对时序和属性设置问题,调整fetchData逻辑,确保属性先设置完成再加载特性:
const fetchData = async () => { const machine_id = getMachineId() // 先设置用户属性 growthbook.setAttributes({ id: "user", loggedIn: true, deviceId: machine_id, employee: true, company: "ABC", browser: navigator.userAgent }); // 再加载特性数据 const res = await fetch(FEATURES_ENDPOINT); const json = await res.json(); growthbook.setFeatures(json.features); }
同时在page.js中增加加载状态判断,避免过早处理默认值:
const feature = useFeature("stroke-care_page"); useEffect(() => { // 特性加载完成且来自实验时再更新内容 if (feature.loaded && feature.source === "experiment") { setGrowthbookContent(feature.value) } }, [feature.loaded, feature.source])
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

