vant v2 版本 van-cascader实现部分选项禁用

4 篇文章 0 订阅
1 篇文章 0 订阅

效果图效果图

思路:

存储一个不可选择的id数组,自定义van-cascader的option,判断当前option的id属于不可选择的时候,设置禁用样式,同时在@finish拦截关闭和选择赋值事件。

数据源:

const list = [
   {
       id: 1,
       name: "耗材",
       children: [
           { id: 14, name: "公牛电线2芯1平方", stock: 0 },
           { id: 15, name: "公牛电线2芯2.5平方", stock: 1 },
           { id: 16, name: "国标珠江电线3芯2.5平方", stock: 0 },
       ],
   },
   {
       id: 2,
       name: "工具",
       children: [
           { id: 17, name: "2公牛电线2芯1平方", stock: 0 },
       ],
   },
   {
       id: 3,
       name: "其他",
       children: [
           { id: 20, name: "3公牛电线2芯1平方", stock: 0 },
       ],
   },
];

html代码

	<style>
   	.option_name{}
   	.option_name.optdisabled{ color:#999;}
   	.option_name.optdisabled ~ .van-icon{ opacity:0;} /*隐藏选择的 √ */
   	.option_stock{ display:inline-block; color:#999; font-size:12px; margin-left:6px;}
   </style>
   <div @click="addPicker">添加</div>
   <div v-for="(item, key) in apply_arr" @click="onShowPicker(key)">选择第{{ key + 1 }}项,结果:{{ item.name }}</div>
   <van-popup v-model="picker.show" position="bottom">
       <van-cascader v-model="cascaderValue" title="请选择类型" :options="list" :field-names="{ text: 'name', value: 'id' }" @close="onClose" @finish="onFinish">
           <template slot="option" slot-scope="scope">
               <div class="option_name" :class="{ optdisabled: scope.option.stock !== undefined && checkTypeList.includes(scope.option.id) }">
                   <span>{{ scope.option.name }}</span>
                   <div class="option_stock">{{ scope.option.stock !== undefined ? "库存:" + scope.option.stock : "" }}</div>
                   <div class="option_stock">{{ scope.option.stock !== undefined && checkTypeList.includes(scope.option.id) ? "已添加" : "" }}</div>
               </div>
           </template>
       </van-cascader>
   </van-popup>
...
   data() {
       return {
           apply_arr: [],
           cascaderValue: "",
           checkTypeList: [],
           list,
           picker: {
               show: false,
               index: 0,
           },
       };
   },
   methods: {
       addPicker() {
           this.apply_arr.push({
               type_id: "",
               name: "",
               stock: "",
           });
       },
       onShowPicker(index) {
           this.picker.index = index;
           this.picker.show = true;
       },
       onFinish(e) {
           let { key, index } = this.picker,
               { value, selectedOptions } = e;
           if (this.checkTypeList.includes(value)) {
               return false;
           }
           //在此储存选择结果
           this.apply_arr[index].type_id = value;
           this.apply_arr[index].stock = selectedOptions[selectedOptions.value].stock;
           this.apply_arr[index].name = selectedOptions[selectedOptions.value].name;
           this.picker.show = false;
           this.cascaderValue = "";
           this.checkTypeList = this.apply_arr.map((item) => item.type_id);
       },
       onClose() {
           //自己的关闭逻辑
       },
   },
...

有问题可评论或私信。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天外来鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值