Vant picker选择器设置默认值导致选择器失效的解决

 更新时间:2023年01月18日 09:01:25   作者:未知原色  
这篇文章主要介绍了Vant picker选择器设置默认值导致选择器失效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Vant picker选择器设置默认值导致选择器失效

vant 版本 >=2.12.27

说下场景

自定义选择器数据结构是数组对象,picker默认显示第一个或上传选择的项,切换选择器失效。

html 代码:

<template>
  <div class="van-cell van-cell-padding0">
    <van-field
      readonly
      clickable
      :value="newValue"
      :label="data.label"
      :placeholder="data.placeholder"
      :required="data.required"
      is-link
      :disabled="disabled"
      @click="clickAction"
      :error-message="errorMessage"
    >
    </van-field>
    <van-popup v-model="showPicker" position="bottom">
      <van-picker
        :title="data.title"
        show-toolbar
        :columns="data.data"
        :defaultIndex="defaultIndex"
        @confirm="onConfirm"
        @cancel="showPicker = false"
        @change="onChange"
      />
    </van-popup>
  </div>
</template>

js代码:

<script>
export default {
  name: "VantPicker",
  model: {
    prop: "value",
    event: "changed",
  },
  props: {
    value: {
      type: [Number, String],
      default: function () {
        return "";
      },
    },
    data: {
      type: Object,
      default: function () {
        return {
          label: "下拉框",
          rules: "required",
          title: "下拉框",
          data: [],
        };
      },
    },
    "error-message": {
      type: String,
      default: function () {
        return "";
      },
    },
  },
  data() {
    return {
      defaultIndex: "",
      newValue: "",
      showPicker: false,
      disabled: false,
    };
  },
  mounted() {
    if (this.value) {
      this.defaultIndex = this.value;  // bug在这里
      this.setSelectedValue(this.value);
    }
    this.disabled = this.data.disabled;
  },
  methods: {
    clickAction() {
      if (!this.data.disabled && !this.disabled) {
        this.showPicker = true;
      }
    },
    onConfirm(values) {
      this.newValue = values.text;
      this.$emit("changed", values.id);
      this.showPicker = false;
    },
    onChange(picker, value) {
      console.info(picker, value);
    },
    getCheckedItemByid(id) {
      let lists = this.data.data ? this.data.data : [];
      let item = null;
      for (let i = 0; i < lists.length; i++) {
        if (id == lists[i].id) {
          item = lists[i];
          break;
        }
      }
      return item;
    },
    getCheckedIndex(id) {
      let lists = this.data.data ? this.data.data : [];
      let index = null;
      for (let i = 0; i < lists.length; i++) {
        if (id == lists[i].id) {
          index = i;
          break;
        }
      }
      return index;
    },
    setSelectedValue(newVal) {
      let checkedItem = this.getCheckedItemByid(newVal);
 
      if (checkedItem) {
        this.newValue = checkedItem.text;
      } else {
        this.$emit("changed", "");
        this.newValue = "";
        this.defaultIndex = "";
      }
    },
    setDisabled(disabled) {
      this.disabled = disabled;
    },
  },
  watch: {
    value(newVal) {
      if (!this.$utils.isEmpty(newVal)) {
        this.defaultIndex = this.getCheckedIndex(this.value);
        this.setSelectedValue(newVal);
      } else {
        this.newValue = "";
        this.defaultIndex = "";
      }
    },
  },
};
</script>

问题

选择器的在做选中,点击确认时,选中的值没有发生变化,还是未切换选择之前的值。

问题定为

js代码中行位置: this.defaultIndex = this.value;  // bug在这里。

问题分析:这里服务器使用的key值,导致服务器计算picker选择的索引index出错,用户选中picker值的某一项,然后点击右上角的“确认”按钮,picker选中的值没有发生变化。

再看官方API defaultIndex属性的描述:defaultIndex 初始选中项的索引(类型为number),默认为 0。

Column 数据结构

当传入多列数据时,columns 为一个对象数组,数组中的每一个对象配置每一列,每一列有以下 key:

键名说明类型
values列中对应的备选值Array<string | number>
defaultIndex初始选中项的索引,默认为 0number
className为对应列添加额外的类名string | Array | object
children级联选项Column

解决方案

this.defaultIndex = this.value修改如下:

this.defaultIndex = this.getCheckedIndex(this.value)  // 根据this.value循环数组找到key值选择器中的索引值,赋值给defaultIndex,问题得到解决。

选中器colums数据结构如下:

[
    {
        id: "101"
        text: "选项2"
    },{
        id: "102"
        text: "选项2"
    }
]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue3使用reactive包裹数组正确赋值问题

    vue3使用reactive包裹数组正确赋值问题

    这篇文章主要介绍了vue3使用reactive包裹数组正确赋值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Vue之绑定class样式与style样式方式

    Vue之绑定class样式与style样式方式

    这篇文章主要介绍了Vue之绑定class样式与style样式方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用vuex存储用户信息到localStorage的实例

    使用vuex存储用户信息到localStorage的实例

    今天小编就为大家分享一篇使用vuex存储用户信息到localStorage的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue环境如何实现div focus blur焦点事件

    vue环境如何实现div focus blur焦点事件

    这篇文章主要介绍了vue环境如何实现div focus blur焦点事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 手写 Vue3 响应式系统(核心就一个数据结构)

    手写 Vue3 响应式系统(核心就一个数据结构)

    这篇文章主要介绍了手写 Vue3 响应式系统(核心就一个数据结构),响应式就是被观察的数据变化的时候做一系列联动处理。就像一个社会热点事件,当它有消息更新的时候,各方媒体都会跟进做相关报道。这里社会热点事件就是被观察的目标
    2022-06-06
  • 前端Vue自定义地址展示地址选择地址管理组件的示例详解

    前端Vue自定义地址展示地址选择地址管理组件的示例详解

    这篇文章主要介绍了前端Vue自定义地址展示地址选择地址管理组件的示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • vuex与map映射实现方法梳理分析

    vuex与map映射实现方法梳理分析

    Vuex中的映射允许您将state中的任何属性(state、getter、mutation和action)绑定到组件中的计算属性,并直接使用state中的数据,下面我们来详细了解
    2022-09-09
  • 快速解决vue2+vue-cli3项目ie兼容的问题

    快速解决vue2+vue-cli3项目ie兼容的问题

    这篇文章主要介绍了快速解决vue2+vue-cli3项目ie兼容的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Vue发布订阅模式实现过程图解

    Vue发布订阅模式实现过程图解

    这篇文章主要介绍了Vue发布订阅模式实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Vue引入使用localforage改进本地离线存储方式(突破5M限制)

    Vue引入使用localforage改进本地离线存储方式(突破5M限制)

    这篇文章主要介绍了Vue引入使用localforage改进本地离线存储方式(突破5M限制),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论