使用 Fetch 加载 json 数据以将其作为 prop 传递给 React Component
Loading json data with Fetch to pass it to React Component as prop
所以我在这个任务上苦苦挣扎了一段时间,我真的不知道该怎么做。
问题是当我尝试从“/menu/items”获取数据,然后将其作为 prop 传递给 Card.js 时,我得到的信息是“无法读取未定义的属性(读取 'name')”在 Card.js.
所以我必须组件:
Menu.js
const Menu = (props) => {
const [orders, onAddOrder] = useState([]);
const [menuItems, setMenuItems] = useState([]);
useEffect(() => {
getItems();
});
const getItems = async () => {
const response = await fetch("/menu/items");
const data = await response.json();
setMenuItems(data);
};
return (
<div className="menu">
<div className="menu-main__container">
<article>
<Card order={menuItems[0]} />
<Card order={menuItems[1]} />
<Card order={menuItems[2]} />
</article>
<article>
<Card order={menuItems[3]} />
<Card order={menuItems[4]} />
<Card order={menuItems[5]} />
</article>
<article>
<Card order={menuItems[6]} />
<Card order={menuItems[7]} />
<Card order={menuItems[8]} />
</article>
</div>
</div>
);
};
这是卡片组件的父组件
Card.js
const Card = (props) => {
const [order, onAdd] = useState(props.order);
const onAddOrderHandler = () => {
console.log(order);
};
return (
<div className="container__order">
<div className="order__details">
<img src={KebapImg} className="details__img" />
<h3>{props.order.name}</h3>
<p>{props.order.desc}</p>
<div className="details__price-buy">
<h1>{props.order.price}zł</h1>
<input
type="submit"
value="Take it!"
className="price-buy__btn"
/>
</div>
</div>
</div>
);
};
/menu/items 作为 json 文件:
{
id: 1,
name: "iKebap Pro Max Super",
price: 22,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 2,
name: "iKebap Pro Max",
price: 21,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 3,
name: "iKebap Classic",
price: 15,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 4,
name: "iKebap California Reaper",
price: 18,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 5,
name: "iKebap Overpriced",
price: 37,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 6,
name: "iKebap Small",
price: 10,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 7,
name: "iKebap Wege",
price: 17,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 8,
name: "iKebap American",
price: 16,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 9,
name: "iKebap Góralski",
price: 17,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
}
我只想将获取的项目传递给 prop 并将其渲染为新组件。
首先你需要做的是导出 json 并将其导入父级并将 json 作为道具传递给卡片。
之后您可以映射道具 json 并将其分发到任何您想要的地方。
使用fetch你需要在fetch后使用UseEffect将它存储在useState中并传递给Card组件。
首先,在 useEffect 中添加一个空的依赖数组,因为你不想 运行 它在每个 re-render.
useEffect(() => {
getItems();
}, []);
其次,您确实在尝试访问未定义的 属性。在第一次渲染时,您仍在解析提取。所以你的 menuItems
数组仍然是空的,你正在传递未定义的值 menuItems[0]
.
您只需等待下一次渲染即可。
const Menu = (props) => {
const [orders, onAddOrder] = useState([]);
const [menuItems, setMenuItems] = useState([]);
useEffect(() => {
getItems();
}, []);
const getItems = async () => {
const response = await fetch("/menu/items");
const data = await response.json();
setMenuItems(data);
};
// ADD THIS LINE
if (!menuItems.length) return <div>Loading...</div>
return (
<div className="menu">
<div className="menu-main__container">
<article>
<Card order={menuItems[0]} />
<Card order={menuItems[1]} />
<Card order={menuItems[2]} />
</article>
<article>
<Card order={menuItems[3]} />
<Card order={menuItems[4]} />
<Card order={menuItems[5]} />
</article>
<article>
<Card order={menuItems[6]} />
<Card order={menuItems[7]} />
<Card order={menuItems[8]} />
</article>
</div>
</div>
);
};
所以我在这个任务上苦苦挣扎了一段时间,我真的不知道该怎么做。 问题是当我尝试从“/menu/items”获取数据,然后将其作为 prop 传递给 Card.js 时,我得到的信息是“无法读取未定义的属性(读取 'name')”在 Card.js.
所以我必须组件:
Menu.js
const Menu = (props) => {
const [orders, onAddOrder] = useState([]);
const [menuItems, setMenuItems] = useState([]);
useEffect(() => {
getItems();
});
const getItems = async () => {
const response = await fetch("/menu/items");
const data = await response.json();
setMenuItems(data);
};
return (
<div className="menu">
<div className="menu-main__container">
<article>
<Card order={menuItems[0]} />
<Card order={menuItems[1]} />
<Card order={menuItems[2]} />
</article>
<article>
<Card order={menuItems[3]} />
<Card order={menuItems[4]} />
<Card order={menuItems[5]} />
</article>
<article>
<Card order={menuItems[6]} />
<Card order={menuItems[7]} />
<Card order={menuItems[8]} />
</article>
</div>
</div>
);
};
这是卡片组件的父组件
Card.js
const Card = (props) => {
const [order, onAdd] = useState(props.order);
const onAddOrderHandler = () => {
console.log(order);
};
return (
<div className="container__order">
<div className="order__details">
<img src={KebapImg} className="details__img" />
<h3>{props.order.name}</h3>
<p>{props.order.desc}</p>
<div className="details__price-buy">
<h1>{props.order.price}zł</h1>
<input
type="submit"
value="Take it!"
className="price-buy__btn"
/>
</div>
</div>
</div>
);
};
/menu/items 作为 json 文件:
{
id: 1,
name: "iKebap Pro Max Super",
price: 22,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 2,
name: "iKebap Pro Max",
price: 21,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 3,
name: "iKebap Classic",
price: 15,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 4,
name: "iKebap California Reaper",
price: 18,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 5,
name: "iKebap Overpriced",
price: 37,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 6,
name: "iKebap Small",
price: 10,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 7,
name: "iKebap Wege",
price: 17,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 8,
name: "iKebap American",
price: 16,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
},
{
id: 9,
name: "iKebap Góralski",
price: 17,
desc: "Lorem Ipsum dolor sit amet, consectetur adipsicing elit",
}
我只想将获取的项目传递给 prop 并将其渲染为新组件。
首先你需要做的是导出 json 并将其导入父级并将 json 作为道具传递给卡片。
之后您可以映射道具 json 并将其分发到任何您想要的地方。
使用fetch你需要在fetch后使用UseEffect将它存储在useState中并传递给Card组件。
首先,在 useEffect 中添加一个空的依赖数组,因为你不想 运行 它在每个 re-render.
useEffect(() => {
getItems();
}, []);
其次,您确实在尝试访问未定义的 属性。在第一次渲染时,您仍在解析提取。所以你的 menuItems
数组仍然是空的,你正在传递未定义的值 menuItems[0]
.
您只需等待下一次渲染即可。
const Menu = (props) => {
const [orders, onAddOrder] = useState([]);
const [menuItems, setMenuItems] = useState([]);
useEffect(() => {
getItems();
}, []);
const getItems = async () => {
const response = await fetch("/menu/items");
const data = await response.json();
setMenuItems(data);
};
// ADD THIS LINE
if (!menuItems.length) return <div>Loading...</div>
return (
<div className="menu">
<div className="menu-main__container">
<article>
<Card order={menuItems[0]} />
<Card order={menuItems[1]} />
<Card order={menuItems[2]} />
</article>
<article>
<Card order={menuItems[3]} />
<Card order={menuItems[4]} />
<Card order={menuItems[5]} />
</article>
<article>
<Card order={menuItems[6]} />
<Card order={menuItems[7]} />
<Card order={menuItems[8]} />
</article>
</div>
</div>
);
};