前端小程序开发问题汇总

273 阅读1分钟

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 层会整体重绘。