冗余的一行代码——不建议使用,因为很难测试、输入、扩展、重复和理解。
<button onClick={() => setList(list.slice(item.id - 1))}
没有导出的版本:
const handleDeleteItem = id => {
const remainingItems = list.slice(id - 1)
setList(remainingItems);
}
然而,我建议您通过在另一个文件中使用辅助函数来不同地扩展您的逻辑结构。
考虑到这一点,我为过滤器和切片分别制作了一个示例。在这种特定的用例中,我个人喜欢使用切片选项,因为它使得推理变得更加容易。显然,如果需要扩展(请参见引用),在更大的列表上,它也略微更具性能优势。
如果使用切片,请始终使用切片,而不是splice,除非您有充分的理由不这样做,因为它符合函数式风格(纯函数没有副作用)。
// use slice instead of splice (slice creates a shallow copy, i.e., 'mutates' )
export const excludeItemFromArray = (idx, array) => array.slice(idx-1)
// alternatively, you could use filter (also a shallow copy)
export const filterItemFromArray = (idx, array) => array.filter(item => item.idx !== idx)
示例(导入选项过滤器和切片选项)
import {excludeItemFromArray, filterItemFromArray} from 'utils/arrayHelpers.js'
const exampleList = [
{ id: 1, name: "ItemOne" },
{ id: 2, name: "ItemTwo" },
{ id: 3, name: "ItemThree" }
]
const [list, setList] = useState(exampleList);
const handleDeleteItem = id => {
const remainingItems = excludeItemFromArray(id, list)
const remainingItems = filterItemFromArray(id, list)
setList(remainingItems);
}
return (
{list.map((item) => (
<div key={item.id}>
<button onClick={() => handleDeleteItem(item.id)}>x</button>
<span>{item.name}</span>
</div>
))}
)
参考文献:
span
标签上没有name
属性。做一些基本的调试,看看e.target.name
是什么。接着... 阅读关于slice()
和indexOf()
工作原理的文档。该方法存在多个问题。 - charlietflonClick={handleRemoveItem}
的上下文中它并不起作用。您是否在函数内部进行了检查? - charlietfl