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

React项目中如何从本地JSON文件加载数据替代Firebase链接

从本地JSON文件加载数据替代Firebase HTTP请求(React项目)

你原本通过Firebase的HTTP链接获取JSON数据渲染页面,现在想切换到本地JSON文件,但直接导入后用fetch的写法行不通,下面是两种可行的解决方法:

方法一:直接导入JSON文件使用(无需fetch)

React中导入JSON文件后,它会被自动解析为JavaScript对象,不需要再用fetch和response.json()处理,直接使用即可:

import React, { useState, useEffect } from 'react';
import style from './AvailableMeal.module.css';
import Card from '../UI/Card';
import MealItem from './MealItem/MealItem';
import Food from './food.json'; // 取消注释,导入本地JSON

const AvailableMeal = () => {
  const [Meals, setMeals] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
  // 直接处理已解析的JSON对象
  const loadedMeals = [];
  // 注意:如果food.json结构和Firebase返回的一致(带key的对象),用这个循环
  for(const key in Food) {
    loadedMeals.push({
      id: key,
      name: Food[key].name,
      description: Food[key].description,
      price: Food[key].price,
    });
  }
  // 如果food.json本身就是数组(比如[{id:1,...},...]),直接替换为:setMeals(Food)
  setMeals(loadedMeals);
  setIsLoading(false);
}, []);
 
const mealsList = Meals.map((val) => (
  <MealItem id={val.id}
          key={val.id}
          name={val.name}
          description={val.description}
          price={val.price}
  />
));

return (
  <>
   <section className={style.meals}>
   <Card>
   {isLoading ? <div className={style.loading}><p>Loading...</p> </div> : <ul>{mealsList}</ul>}
    </Card>
  </section>
  </>
)
};

export default AvailableMeal;

方法二:用fetch加载本地文件路径

如果后续可能切换回远程接口,想保留fetch的逻辑,直接传入JSON文件的相对路径字符串即可,不要传入导入的对象:

import React, { useState, useEffect } from 'react';
import style from './AvailableMeal.module.css';
import Card from '../UI/Card';
import MealItem from './MealItem/MealItem';
// 不需要导入Food

const AvailableMeal = () => {
  const [Meals, setMeals] = useState([]);
  const [isLoading, setIsLoading] = useState(true);

useEffect(() => {
const fetchMeals = async() => {
  // 传入本地JSON文件的相对路径字符串
  const response = await fetch('./food.json');
  const data = await response.json();
  const loadedMeals = [];
  for(const key in data) {
    loadedMeals.push({
      id: key,
      name: data[key].name,
      description: data[key].description,
      price: data[key].price,
    });
  }
  setMeals(loadedMeals);
  setIsLoading(false);
}
  fetchMeals();
}, []);
 
const mealsList = Meals.map((val) => (
  <MealItem id={val.id}
          key={val.id}
          name={val.name}
          description={val.description}
          price={val.price}
  />
));

return (
  <>
   <section className={style.meals}>
   <Card>
   {isLoading ? <div className={style.loading}><p>Loading...</p> </div> : <ul>{mealsList}</ul>}
    </Card>
  </section>
  </>
)
};

export default AvailableMeal;

错误原因说明

你之前的写法const response = await fetch(Food)之所以失败,是因为import Food from './food.json'已经把JSON文件解析成了JavaScript对象,而fetch()函数需要接收的是URL字符串,不是已解析的对象,因此导致请求报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:45:44