1、PickerView 两个 PickerViewColumn,更新第二个 PickerViewColumn 内容时,第一个会闪一下
环境:Taro 3.5、tt
问题:使用 PickerView 和 PickerViewColumn 实现地址选择弹窗
实现逻辑如下:
const [value, setValue] = useState([0,0]);
const handleChange = (e) => {
setValue(e.detail.value);
}
return (
<PickerView onChange={handleChange}>
<PickerViewColumn>
{/* 省数据 */}
{provinces.map(v => <Text>{v.value}</Text>)}
</PickerViewColumn>
<PickerViewColumn>
{/* 市数据(省数据的二级数据) - 根据 value[0]- 省位置 更新 */}
{provinces[value[0]].citys.map(v => <Text>{v.value}</Text>)}
</PickerViewColumn>
</PickerView>
);
以上实现思路没什么问题,在实际测试中发现,在切换省时,省那列会闪一下,经测试与市数据更新有关。
- 仅省 或 市 一列数据切换时不会闪
- 市数据不随value变化更新时(即市取固定值)不会闪
- 省、市 分别用 memo 包一层也无效
基本可以确定与市数据变化有关,每次切换省时都会更新市数据。
解决方案:根据上面测试仅一列数据时不会存在闪问题,因此考虑省市分别使用 PickerView 实现
const [prov, setProv] = useState(0);
const [city, setCity] = useState(0);
const handleProvChange = (e) => {
setProv(e.detail.value[0]);
}
const handleCityChange = (e) => {
setCity(e.detail.value[0]);
}
return (
<View>
<PickerView onChange={handleProvChange}>
<PickerViewColumn>
{/* 省数据 */}
{provinces.map(v => <Text>{v.value}</Text>)}
</PickerViewColumn>
</PickerView>
<PickerView onChange={handleCityChange}>
<PickerViewColumn>
{/* 市数据(省数据的二级数据) - 根据 prov- 省位置 更新 */}
{provinces[prov].citys.map(v => <Text>{v.value}</Text>)}
</PickerViewColumn>
</PickerView>
</View>
);
遗留问题:闪的原因没有定位出来,猜测数据有变化时 Taro 层会整体重绘。