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

React组件无法通过Firestore数据动态渲染选项求助

问题原因及修复方案

1. 异步逻辑顺序错误

你的setList(data)写在了Promise的then方法外面,而getDocs是异步操作,then里的代码还没执行完(还没把Firestore的数据塞进data数组),就先调用了setList,这时候data还是空数组,组件自然不会渲染任何选项。

修复:把setList(data)移到then方法内部,确保数据准备好后再更新状态:

const fetchData = () => {
    let data = []; 
    const response = getDocs(collection(db, 'listing'));

    response.then((results) => {
        let id = 1;
        results.forEach(function(doc) {
            const tempData = {id:id, name: doc.id, active: doc.data().active}
            id+=1;
            data.push(tempData);
        });
        // 移到这里,确保数据填充完成后再更新状态
        setList(data)
    })
}

2. State初始值类型不匹配

你初始化list为对象{},但fetchData里要存的是数组data,后续用Object.values(list)处理数组完全没必要,直接用数组操作更直观。

修复:把state初始值改成数组:

const [list, setList] = useState([])

渲染时直接遍历数组,去掉多余的Object.values:

{list.map((item) => <option key={item.id} value={item.name}>{item.name}</option> )} 

3. JSX中误用forEach

你在JSX里写的{Object.values(list).forEach((item) => console.log(item) )}存在问题:forEach没有返回值,会在JSX里渲染undefined,属于冗余代码。建议移除,或者改成在useEffect里打印数据:

useEffect(() => {
  console.log(list);
}, [list]);

4. 启用useEffect执行初始化请求

把注释掉的useEffect打开,确保组件挂载时自动触发数据请求,不用依赖点击事件:

useEffect(() => {
  fetchData()
}, []);  

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:07:09