vant 自定义多级联动组件

<template>

  <div class="addressWrapper">

    <van-field v-if="required && Tilname.value"

               readonly

               is-link

               clickable

               name="area"

               :value="Tilname.value"

               :label="Tilname.name"

               @click="getArea()" />

    <van-field v-if="!required && Tilname.value"

               readonly

               is-link

               clickable

               required

               name="area"

               :value="Tilname.value"

               :label="Tilname.name"

               @click="getArea()" />

    <van-field v-if="!Tilname.value && !required"

               readonly

               is-link

               clickable

               required

               name="area"

               :value="Tilname.value"

               :label="Tilname.name"

               @click="getArea()" />

    <van-field v-if="!Tilname.value && required"

               readonly

               is-link

               clickable

               name="area"

               :value="Tilname.value"

               :label="Tilname.name"

               @click="getArea()" />

    <van-field v-if="!Tilname.value && required"

               readonly

               is-link

               clickable

               name="area"

               :value="Tilname.value"

               :label="Tilname.name"

               @click="getArea()" />

    <van-popup v-model="cityVisable"

               position="bottom">

      <!--Picker一般结合遮罩层使用 -->

      <!--显示上方取消和完成按钮-->

      <!--//自定义标题栏内容-->

      <!--//自定义Picker滚动条中显示的文字(因为Picker中的每一项都是一个json)-->

      <!--//Picker的数据-->

      <!--//当Picker选中项改变时触发-->

      <!--//当点击取消按钮时触发-->

      <!--//当点击完成按钮时触发-->

      <van-steps direction="vertical"

                 v-for="(item,index) in livingList"

                 :key="index"

                 @click-step="opalits(index)">

        <van-step>

          <h3>{{item.name}}</h3>

        </van-step>

      </van-steps>

      <van-picker show-toolbar

                  title="请选择所在地区"

                  value-key="name"

                  :columns="areaList"

                  @cancel="onCancel"

                  @confirm="onAreaConfirm" />

    </van-popup>

  </div>

</template>

<script>

export default {

  components: {},

  props: {

    Tilname: {

      type: Object,

      default () {

        return

      }

    },

    required: {

      type: String,

      default: ''

    }

  },

  data () {

    return {

      livingList: [],

      cityVisable: false,  //遮罩层显示或隐藏

      areaList: [],        //自定义数据三级结构

      showliving: false,

      livingAddressCode: '',//编码

      livingAddressName: '',//名称 //Picker拿到的值

    }

  },

  created () {

  },

  watch () {

  },

  mounted () {

    this.livingAddressName = this.Tilname.value

    this.open()

    // if (this.livingList.length > 0) {

    //   console.log(this.livingList, 11111);

    // }

  },

  methods: {

    // 根

    async getArea () {

      if (this.livingList.length > 0) {

        console.log(this.livingList);

        this.cityVisable = true

        if (this.livingList.length === 5) {

          await this.getParentId(this.livingList[this.livingList.length - 2].code)

        } else {

          await this.getParentId(this.livingList[this.livingList.length - 1].code)

        }

        return;

      }

      this.cityVisable = true

      const params = {

        topType: true,

        addrCode: '000000000000'

      }

      initAddrTm(params).then(res => {

        if (res.code == 200) {

          let data = res.result

          console.log(data, 'data')

          this.areaList = []

          data.forEach((i, index) => {

            this.areaList.push({

              name: i.label,

              code: i.value

            })

          })

          // this.areaList = this.areaList

          // this.getParentId(this.areaList[0].values[0].code, 1)

        }

      })

    },

    opalits (value) {

      console.log(this.livingList[value].code, 'j2k2jkj')

      if (value == 0) {

        this.livingList = []

        this.getArea()

      } else {

        this.getParentId(this.livingList[value - 1].code)

        this.livingList.splice(value, 5 - value)

      }

    },

    // 子

    async getParentId (is) {

      const params = { upCode: is }

      loadAddrTm(params).then(res => {

        if (res.code == 200) {

          let data = res.result;

          let values = [];

          data.forEach((i, item) => {

            values.push({

              name: i.label,

              code: i.value

            })

          })

          console.log(values, '12121212')

          this.areaList = values

          console.log(this.areaList, '3232332')

        }

      })

    },

    //当地区选择变化时

    onAreaChange (picker, values, index) {

      if (index < 5) {

        this.getParentId(values[index].code, index + 1);                        //传参 参数为上层选择的地区的code

      }

    },

    //点击取消

    onCancel () {

      this.cityVisable = false;

    },

    // 回显

    open () {

      this.livingList.push({

        name: '湖南省',

        code: 430000000000

      })

    },

    //点击确定

    onAreaConfirm (value) {

      console.log(value, '11212')

      if (this.livingList.length < 5) {

        this.livingList.push({

          name: value.name,

          code: value.code

        })

        console.log(this.livingList, 'value.code')

        this.livingAddressCode = value.code

        this.Tilname.value = `${value.name}`

        this.getParentId(value.code)

        if (this.livingList.length === 5) {

          this.cityVisable = false;

        }

      } else {

        this.cityVisable = false;

      }

      // this.cityVisable = false;

    }

  }

};

</script>

<style lang="less" scoped>

.addressWrapper {

  background: #fff;

}

.close {

  display: flex;

  justify-content: space-between;

  line-height: 0.7rem;

  font-size: 0.4rem;

}

.addressWrapper h4 {

  text-align: center;

}

.addressWrapper .tabs {

  margin-top: 20px;

  padding: 15px;

  border: 1px solid;

}

.addressWrapper .content {

  margin-top: 20px;

  height: 200px;

  overflow: scroll;

}

.item {

  line-height: 40px;

  font-size: 14px;

}

.select {

  color: red;

}

/deep/ .van-field__control {

  text-align: right;

}

</style>

Vant picker级联操作是指在 Vant UI 组件库中的 picker 组件中,可以通过多个级别的选择器来联选择数据,从而达到更加准确的筛选和选择目的。这种多级联操作在实际应用中非常常见,可以用于地区选择、商品分类、日期选择等场景。 Vant picker级联操作的实现步骤一般是:首先需要在 HTML 代码中添加 picker 组件并设置相应的属性,如 picker-options、columns 等。然后在 JS 代码中编写数据源和联的逻辑,一般采用数组或 JSON 格式的数据存储,通过监听选择器的 change 事件来实现级联选择效果。最后,还需要根据选择结果来进行相应操作,如显示选择结果、修改相关数据等。 与传统的单一选择器相比,Vant picker级联操作具有以下优点:首先,可以通过多个级别的选择器来筛选需要的数据,精度更高。其次,多级联操作可以让用户更加方便快捷地选择数据,提升用户体验。同时,多级联操作可以应用到很多不同的场景中,如地区、时间、分类等,具有很广泛的应用价值。 在实际开发中,如何灵活合理地应用 Vant picker级联操作也变得十分关键。需要根据实际业务需求和用户体验来进行设置,防止出现数据选择错误或操作繁琐的问题。因此,需要在开发前进行需求分析和用户调研,结合 Vant picker级联操作的实现原理和技巧,使得应用的多级联效果更加出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值