uni-app picker-view组件多列选择时数据发生改变视图不更新

uni-app picker-view组件多列选择时数据发生改变视图不更新

类别 信息
产品分类 uniapp/小程序/阿里
操作系统 Mac
操作系统版本 12.0.1
开发工具 HBuilderX
工具版本 4.26
第三方工具 3.9.7
基础库 2.9.30
项目创建方式 HBuilderX

示例代码:

<picker-view class="h-[30vh]" :value="modelValue" @change="bindChange">
<picker-view-column>
<view v-for="(option, i) in columnDay" :key="i" class="flex items-center justify-center">
<slot name="default" :option="option" :index="i">
{{ option }}
</slot>
</view>
</picker-view-column>
<picker-view-column>
<view v-for="(option, i) in columnHour" :key="i" class="flex items-center justify-center">
<slot name="default" :option="option" :index="i">
{{ option }}
</slot>
</view>
</picker-view-column>
</picker-view>

操作步骤:

多列选择器,当第一列选中的值发生变化的时候,修改第二列的数据。

预期结果:

数据发生变化 更新视图。

实际结果:

无。

bug描述:

《picker-view》组件多列选择。当设置联动时,第二列的数据已经发生了改变,但是picker-view第二列视图没有发生变化。下方的columnHour已经监听到数据变化,但是视图不更新。


更多关于uni-app picker-view组件多列选择时数据发生改变视图不更新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

把key换一个其他不重复的变量 试试 不要用索引 i

更多关于uni-app picker-view组件多列选择时数据发生改变视图不更新的实战教程也可以访问 https://www.itying.com/category-93-b0.html


好的,感谢。试了一下确实是这个问题导致的,但是在微信和头条小程序里边是没这个问题的

在uni-app中使用picker-view组件进行多列选择时,如果遇到数据发生改变但视图不更新的问题,通常是因为数据绑定或状态管理没有正确处理。这里,我将提供一个简单的代码示例,展示如何在数据改变后正确更新picker-view的视图。

首先,确保你的picker-view组件的value属性和range属性正确绑定到组件的数据上。value属性表示当前选中的值,range属性表示每一列的可选项。

<template>
  <view>
    <picker-view :value="pickerValue" :range="pickerRanges" @change="onPickerChange">
      <view v-for="(column, columnIndex) in pickerRanges" :key="columnIndex" class="picker-column">
        <view v-for="(item, rowIndex) in column" :key="rowIndex" class="picker-item">{{ item }}</view>
      </view>
    </picker-view>
    <button @click="updatePickerData">更新数据</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      pickerValue: [0, 0], // 初始选中值
      pickerRanges: [
        ['选项1-1', '选项1-2'], // 第一列选项
        ['选项2-1', '选项2-2', '选项2-3'] // 第二列选项
      ]
    };
  },
  methods: {
    onPickerChange(e) {
      this.pickerValue = e.mp.detail.value;
      console.log('选中的值:', this.pickerValue);
    },
    updatePickerData() {
      // 模拟数据更新
      this.pickerRanges = [
        ['新选项1-1', '新选项1-2'], // 更新后的第一列选项
        ['新选项2-1', '新选项2-2', '新选项2-3', '新选项2-4'] // 更新后的第二列选项
      ];
      // 如果更新后需要重置选中值,可以重新设置pickerValue
      // this.pickerValue = [0, 0]; // 重置为第一行第一列
    }
  }
};
</script>

<style>
.picker-column {
  display: flex;
  flex-direction: column;
}
.picker-item {
  text-align: center;
  padding: 10px;
}
</style>

在这个示例中,pickerValue保存了当前选中的值,pickerRanges是一个二维数组,表示每列的可选项。当点击“更新数据”按钮时,updatePickerData方法会更新pickerRanges的值,从而触发picker-view的重新渲染。

注意,如果更新数据后需要重置选中的值,可以在updatePickerData方法中重新设置pickerValue。如果不重置,pickerValue将保持更新前的索引,这可能会导致视图显示不一致。

通过这种方式,你可以确保在数据发生改变时,picker-view的视图能够正确更新。

回到顶部