You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何禁用地址按钮的多选功能?

解决地址按钮多选问题,实现单选功能

问题根源在于每个AddressButton组件自己维护了独立的选中状态,和父组件Addresses的选中状态冲突,导致多个按钮可以同时被选中。要实现单选,需要把选中状态的控制权统一交给父组件,具体修改如下:

1. 改造AddressButton.tsx,移除内部选中状态

删除组件内部的selectedItem状态,将选中状态和点击事件完全交由父组件控制:

// Common > AddressButton.tsx
// 移除内部的useState定义
// const [selectedItem, setSelectedItem] = useState<boolean>(false);

// 修改handlePress,调用父组件传入的onPress回调
const handlePress = () => {
    setAddressData(addressData);
    if (ratesData) setRatesData(null);
    if (selectedRate) setSelectedRate(null);
    // 通知父组件处理选中逻辑
    onPress?.();
};

// 组件接收父组件传入的isSelected和onPress属性
return (
    <HomeAddressContainer isSelected={isSelected}>
        <Pressable onPress={handlePress}>
            <HomeAddressRow>
                <HomeAddressIcon>
                    <SVGCustomIcon name={isSelected ? "HomeAddressIcon" : "HomeIconWhite"} />
                </HomeAddressIcon>
                <HomeAddressTitle>{name}</HomeAddressTitle>
                <HomeAddressName>{company}</HomeAddressName>
                <HomeAddressStreet>{street1}</HomeAddressStreet>
                <HomeAddressStreet>{city}, {zip}, {country}</HomeAddressStreet>
            </HomeAddressRow>
        </Pressable>
    </HomeAddressContainer>
);

2. 确保父组件Addresses.tsx统一管理选中状态

父组件已经维护了selectedItem(选中索引),现在需要将点击事件和选中状态正确传递给子组件,同时移除子组件外层的多余Pressable(避免重复绑定点击事件):

// Components > Addresses.tsx
{addressesList.map((address: AddressData, index) => (
    <HomeAddress
        key={index}
        addressData={address}
        packageId={packageId}
        isSelected={index === selectedItem}
        // 将父组件的选中逻辑传递给子组件
        onPress={() => handlePress(address, index)}
    />
))}

原理说明

  • 父组件通过selectedItem记录当前唯一选中的按钮索引,所有子组件的isSelected都通过index === selectedItem判断,确保同一时间只有一个按钮处于选中状态。
  • 子组件不再维护自己的选中状态,点击时通知父组件更新选中索引,从根源上避免了多选问题。

内容的提问来源于stack exchange,提问作者Julia Schafer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:55:24