vant 级联选择器动态添加后的回显

vant 级联选择器动态添加的回显

需求:
动态级联不确定有多少层,需要根据上一层选择的id请求出下一层的数据
新增的时候,vant级联为动态添加,根据选择的id,发送请求添加子选项
编辑的时候,vant级联可以回显到所选择的每一项级联
页面不仅仅只有一个级联

<van-field
  v-model="fieldValue"
  is-link
  readonly
  label="地区"
  placeholder="请选择所在地区"
  @click="show = true"
/>
<van-popup v-model="show" round position="bottom">
  <van-cascader
    v-model="cascaderValue"
    title="请选择所在地区"
    :options="options"
    @close="show = false"
    @change="onChange"
    @finish="onFinish"
  />
</van-popup>

export default {
  data() {
    return {
      show: false,
      fieldValue: '',
      cascaderValue: '',
      options: [
        {
          text: '浙江省',
          value: '330000',
          children: [],
        },
      ],
      //拿到选择的每一项值所组成的数组
		ids:[]
    };
  },
  methods: {
    onChange({ value, selectedOptions, tabIndex }) {
  		//	其中value为选中的值,selectedOptions为当前选中的值所在的子项数组,tabIndex为第几级
  		//调用请求方法(把当前值和当前值所在的子项数组)
  		this.add(value, selectedOptions)
  		
    },
    //请求子项的方法
    add(value, selectedOptions){
    //接口请求
    list().then(res=>{
    selectedOptions[selectedOptions.length - 1].children = [];
    //需要后端返回某个字段以此来判断是否需要给子项创建children
    res.data.forEach(item=>{
    selectedOptions[selectedOptions.length - 1].children.push({
    id:'',
    children:[],//如果已经是最后一项,就不需要创建
    })
    })
    })
    }
    onFinish({ selectedOptions }) {
      this.show = false;
      this.ids = selectedOptions.map((option) => option.id)
      this.fieldValue = selectedOptions.map((option) => option.text).join('/')
    },
  },
};

回显问题

//由于vant绑定的值是点击的最后一项的值,由于动态加载子项,子项尚未加载出来,就无法回显
//拿到选择的每一项值所组成的数组
ids:[]
addTree(id,tree){
//先用id请求到子选项,然后在tree中找到id所在的位置,将子选项赋值给children
     let idx = tree.findIndex((item) => {
              return (item.value = id);
            });
//判断是都是ids是否是倒数第二项
//是,则reture出去
//否,则再调用addTree()
this.addTree(ids[index],tree[idx].children)
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vant的级选择可以通过`@change`事件来获取用户选择的值,然后将其赋值给一个变量,最后在页面上展示即可。 下面是一个示例代码: ```vue <template> <div> <van-cascader :options="options" :value="selectedValue" @change="handleChange" placeholder="请选择" /> <div v-if="selectedValue.length > 0"> 已选择:{{ selectedValue }} </div> </div> </template> <script> export default { data() { return { options: [ { value: "zhejiang", label: "浙江省", children: [ { value: "hangzhou", label: "杭州市", children: [ { value: "xihu", label: "西湖区" }, { value: "yuhang", label: "余杭区" } ] }, { value: "ningbo", label: "宁波市", children: [ { value: "haishu", label: "海曙区" }, { value: "jiangbei", label: "江北区" } ] } ] }, { value: "jiangsu", label: "江苏省", children: [ { value: "nanjing", label: "南京市", children: [ { value: "jianye", label: "建邺区" }, { value: "xuanwu", label: "玄武区" } ] }, { value: "suzhou", label: "苏州市", children: [ { value: "gusu", label: "姑苏区" }, { value: "wujiang", label: "吴江区" } ] } ] } ], selectedValue: [] }; }, methods: { handleChange(value) { this.selectedValue = value; } } }; </script> ``` 在上面的代码中,我们监听了`@change`事件,当用户选择了一个值时,我们将其赋值给`selectedValue`变量。在页面上,我们根据`selectedValue`的长度是否大于0来判断用户是否已经选择了一个值,如果已经选择了,我们就展示出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值