React/JavaScript 从 props.items 中删除一些内容
React/JavaScript remove something from props.items
嗨,我是 JavaScript/React 的新手,我目前正在做一个项目来更多地练习它。
我有一个费用清单,其中有些费用的唯一 ID 存储为 props.items
,但我正在尝试添加一个删除按钮,以便在 props.items 中删除费用点击。有没有一种方法可以使用唯一 ID 从 props.items
中删除项目?
目前我有这个,其中 idNumber
是从子组件发回的唯一 ID ExpenseItem
const onRemoveExpense = (idNumber) => {
console.log("remove clicked", idNumber)
console.log(props.items, "<- all items")
}
return (
<ul className='expenses-list'>
{props.items.map((expense) => (
<ExpenseItem
key={expense.id}
value={expense.id}
title={expense.title}
amount={expense.amount}
date={expense.date}
removeExpense={onRemoveExpense}
/>
))}
</ul>
);
}
感谢您的帮助!
我在这里看到的最大障碍是您的 items 数组不在有问题的组件的状态下——它作为 props 传入。因此,您需要定义删除脚本,其中组件将项目保持在其组件状态。您可以按照以下方式将其写在某处:
const onRemoveExpense = (idNumber) => {
this.setState((state, props) => {
// get items from current state
const { items } = state;
// get a new array with only those items that do *not* have the id number passed
const newItems = items.filter((item) => item.id !== idNumber);
// return it to set the new state
return newItems;
});
}
这显然需要根据您的具体状态和组件结构进行调整。然后,您将它作为道具与项目一起传递给有问题的组件,并调用它来触发删除。
对于“隐藏”功能而不是删除功能,您可以尝试添加一个 shown
布尔属性,然后在单击时更改它。
但要真正删除它,您需要将项目存储在状态中。
您可以尝试这样的操作:
const [items, setItems] = useState(props.items)
// set the initial state as `props.items`
// (I'm assuming the code snippet you shared exists inside a functional component)
const onRemoveExpense = (idNumber) => {
console.log("remove clicked", idNumber)
console.log(props.items, "<- all items")
const newItems = items.filter(({ id }) => id !== idToDelete)
setItems(newItems)
}
return (
<ul className='expenses-list'>
{items.map((expense) => (
<ExpenseItem
key={expense.id}
value={expense.id}
title={expense.title}
amount={expense.amount}
date={expense.date}
removeExpense={() => onRemoveExpense(expense.id)}
/>
))}
</ul>
);
}
不过我可能忘记了什么——我还没有测试过上面的代码。您可能需要 useEffect()
才能在状态更改时正确地重新呈现。
或者您可以管理正在为此组件定义 items
的组件中的状态。
嗨,我是 JavaScript/React 的新手,我目前正在做一个项目来更多地练习它。
我有一个费用清单,其中有些费用的唯一 ID 存储为 props.items
,但我正在尝试添加一个删除按钮,以便在 props.items 中删除费用点击。有没有一种方法可以使用唯一 ID 从 props.items
中删除项目?
目前我有这个,其中 idNumber
是从子组件发回的唯一 ID ExpenseItem
const onRemoveExpense = (idNumber) => {
console.log("remove clicked", idNumber)
console.log(props.items, "<- all items")
}
return (
<ul className='expenses-list'>
{props.items.map((expense) => (
<ExpenseItem
key={expense.id}
value={expense.id}
title={expense.title}
amount={expense.amount}
date={expense.date}
removeExpense={onRemoveExpense}
/>
))}
</ul>
);
}
感谢您的帮助!
我在这里看到的最大障碍是您的 items 数组不在有问题的组件的状态下——它作为 props 传入。因此,您需要定义删除脚本,其中组件将项目保持在其组件状态。您可以按照以下方式将其写在某处:
const onRemoveExpense = (idNumber) => {
this.setState((state, props) => {
// get items from current state
const { items } = state;
// get a new array with only those items that do *not* have the id number passed
const newItems = items.filter((item) => item.id !== idNumber);
// return it to set the new state
return newItems;
});
}
这显然需要根据您的具体状态和组件结构进行调整。然后,您将它作为道具与项目一起传递给有问题的组件,并调用它来触发删除。
对于“隐藏”功能而不是删除功能,您可以尝试添加一个 shown
布尔属性,然后在单击时更改它。
但要真正删除它,您需要将项目存储在状态中。
您可以尝试这样的操作:
const [items, setItems] = useState(props.items)
// set the initial state as `props.items`
// (I'm assuming the code snippet you shared exists inside a functional component)
const onRemoveExpense = (idNumber) => {
console.log("remove clicked", idNumber)
console.log(props.items, "<- all items")
const newItems = items.filter(({ id }) => id !== idToDelete)
setItems(newItems)
}
return (
<ul className='expenses-list'>
{items.map((expense) => (
<ExpenseItem
key={expense.id}
value={expense.id}
title={expense.title}
amount={expense.amount}
date={expense.date}
removeExpense={() => onRemoveExpense(expense.id)}
/>
))}
</ul>
);
}
不过我可能忘记了什么——我还没有测试过上面的代码。您可能需要 useEffect()
才能在状态更改时正确地重新呈现。
或者您可以管理正在为此组件定义 items
的组件中的状态。