如何改写onSelectWallet实现钱包的选中切换(数组增删)功能?
实现多选钱包的切换选中功能
你可以通过函数式更新结合数组的过滤/拼接操作来实现这个切换逻辑,核心是利用setSelectedWallet的回调参数获取最新状态,同时通过钱包的唯一标识(比如id)判断是否已选中:
const onSelectWallet = useCallback((wallet: SyncedWalletData) => { setSelectedWallet(prevSelected => { // 检查当前钱包是否已在选中列表中(这里假设钱包有唯一的id属性,根据实际情况替换) const isAlreadySelected = prevSelected.some(item => item.id === wallet.id); if (isAlreadySelected) { // 已选中则移除,过滤掉当前钱包 return prevSelected.filter(item => item.id !== wallet.id); } else { // 未选中则添加,拼接新钱包到数组末尾 return [...prevSelected, wallet]; } }); }, []);
关键说明:
- 函数式更新:使用
prevSelected => newState的形式,确保每次操作都基于最新的状态值,避免闭包导致的旧状态问题。 - 唯一标识判断:直接比较对象引用可能不准确(即使内容相同,不同实例的引用也不同),所以必须用钱包的唯一属性(如
id、address等)来判断是否已选中,根据你的SyncedWalletData结构替换成对应的字段即可。 - useCallback依赖:因为我们用了函数式更新,没有直接依赖
selectedWallet,所以useCallback的依赖数组可以保持为空,避免不必要的重渲染。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

