## 实例 ```jsx // ItemList.js // 给 每一个storeItems 列表中的数组值创建为 button import React from "react"; //它接受两个属性:`items`(一个项目数组)和 `onItemClick`(一个当项目被点击时调用的函数)。 export default function ItemList({ items, onItemClick }) { const handleClick = ({ target }) => { const item = target.value; //当 item被点击时调用onItemClick[[React Hooks useState 事件处理程序更新状态]] onItemClick(item); }; return ( // 遍历 items 数组,为每个 item 创建一个 button 按钮,按钮的值为 item,当按钮被点击时,调用onItemClick(item);函数,显示在GroceryCart.js的<ul></ul>位置 <div> {items.map((item, index) => ( <button value={item} onClick={handleClick} key={index}> {item} </button> ))} </div> ); } ``` ```jsx import React, { useState } from "react"; import ItemList from "./ItemList"; import { produce, pantryItems } from "./storeItems";//所有数组值 export default function GroceryCart() { // 声明并初始化状态 const [cart,setCart] = useState([]);//初始条件为空的数组 // setCart更新状态:添加新的 item 到之前的 prev 中 const addItem = (item) => { setCart((prev)=> {return [item,...prev]}) }; // setCart更新状态:筛选之前的 item,- 如果 `index` 不等于 `targetIndex`,这意味着这个元素不是我们想要移除的那个,所以条件为 `true`,这个元素会被保留在新的数组中。 - //如果 `index` 等于 `targetIndex`,这意味着这个元素就是我们想要移除的那个,所以条件为 `false`,这个元素会被排除出新的数组。 const removeItem = (targetIndex) => { setCart((prev) => { return prev.filter((item, index) => index !== targetIndex); }); }; // 渲染效果 return ( <div> //H1 标题 <h1>Grocery Cart</h1> // <ul> {cart.map((item, index) => ( //当我们需要传递一个手动参数时,jsx事件处理程序需要用到箭头函数 <li onClick={() => removeItem(index)} key={index}> //这里的 item 来自于const item = target.value; {item} </li> ))} </ul> // h2 标题 <h2>Produce</h2> // 调用ItemList.js,查看ItemList.js会发现有 2 个参数,items 和onItemClick, items负责将每个数组值渲染成按钮,onItemClick负责当一个按钮被点击时返回的函数,这里返回新添加物品。 <ItemList items={produce} onItemClick={addItem} /> <h2>Pantry Items</h2> <ItemList items={pantryItems} onItemClick={addItem} /> </div> ); } ``` ## 分析 ```jsx export default function ItemList({ items, onItemClick }) { const handleClick = ({ target }) => { const item = target.value; onItemClick(item); return ( <button value={item} onClick={handleClick} key={index}> {item} </button> ) }; ``` ```jsx export default function GroceryCart() { const [cart,setCart] = useState([]);//初始值要设定为空的数组 const addItem = (item) => { setCart((prev)=> {return [item,...prev]}) //新的状态,新的 item 加上以前的 item }; ``` ![](https://image.harryrou.wiki/2024-01-02-CleanShot%202024-01-03%20at%2007.37.09%402x.png) - [Object in state](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-function-components-and-hooks-a2dba9bf-fc64-4118-8656-dfdc35f9e5cc/lessons/the-state-hook/exercises/objects-in-state)