vant cascader级联选择器动态无限加载

vant 官网给出了cascader 级联选择器异步动态加载示例,示例比较简单,加载了2级,固定写法。

如下所示:

export default {
  data() {
    return {
      show: false,
      fieldValue: '',
      cascaderValue: '',
      options: [
        {
          text: '浙江省',
          value: '330000',
          children: [],
        },
      ],
    };
  },

 methods: {
    onChange({ value }) {
      if (value === this.options[0].value) {
        setTimeout(() => {
          this.options[0].children = [
            { text: '杭州市', value: '330100' },
            { text: '宁波市', value: '330200' },
          ];
        }, 500);
      }
    },
    onFinish({ selectedOptions }) {
      this.show = false;
      this.fieldValue = selectedOptions.map((option) => option.text).join('/');
    },
  },

直接取this.options[0]给children赋值。如果要求动态无限级加载怎么办?问题的关键是从options中定位到要加载的级别给children赋值。例如要加载3级,this.options[x].children[x].children = data。

完整代码如下:

    getSpaceList() {
      this.$http
        .get({
          urlKey: "space-getSpaceList",
          params: {
            level: 1,
          },
        })
        .then((res) => {
          console.log("deviceList getSpaceList res: ", res.data);
          if (
            res.success &&
            res.data &&
            res.data.records &&
            res.data.records.length
          ) {
            //第一次加载给options赋值
            res.data.records.forEach((item) => {
              this.options.push({
                text: item.name,
                value: item.id,
                children: item.hasChildren ? [] : null, //后端返回的数据要指明是否还有下一级
              });
            });
          }
        })
        .catch((err) => {
          console.error("deviceList getSpaceId err: ", err);
        });
    },
    setOptions(selectedOptions, data) {
      let _options = this.options;
      selectedOptions.forEach((item, index) => {
        if (index) {
          //不是第一个则取下一级children
          _options = _options.children;
        }
        _options =
          _options[_options.findIndex((_item) => _item.value === item.value)];
      });
      //找到最后一级
      _options.children = data.map((item) => {
        return {
          text: item.name,
          value: item.id,
          children: item.hasChildren ? [] : null,
        };
      });
    },
    getSpaceListAgain(selectedOptions, value) {
      //获取下一级数据
      this.$http
        .get({
          urlKey: "space-getSpaceList",
          params: {
            parentId: value,
          },
        })
        .then((res) => {
          if (res.data && res.data.records && res.data.records.length) {
            this.setOptions(selectedOptions, res.data.records);
          }
        })
        .catch((err) => {
          console.error("deviceList getSpaceId err: ", err);
        });
    },
    onCascaderChange(res) {
      //点击加载下一级回调
      this.getSpaceListAgain(res.selectedOptions, res.value);
    },

如有不明白的地方,或有更好的写法,可留言讨论。

令我惊讶的是,这个vant级联选择器组件动态加载,网络上几乎没有相关文章。 

如这篇文章对您有帮助,麻烦加个粉丝。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
vant级联选择器Cascader)组件提供了异步加载数据的功能,可以用于无限层级的地区选择。以下是一个示例代码: ``` <template> <van-cascader :options="options" :load-data="loadData" v-model="value" :placeholder="'请选择地区'" :columns="3" /> </template> <script> export default { data() { return { value: [], options: [ { text: '省份', value: 'province', children: [], }, { text: '城市', value: 'city', children: [], }, { text: '区县', value: 'district', children: [], }, ], }; }, methods: { async loadData(item) { const data = await this.getAreaData(item.value); item.children = data; }, async getAreaData(value) { // 根据 value 获取对应的数据 // 这里可以通过异步请求获取数据 // 返回一个 Promise }, }, }; </script> ``` 以上代码中,`options` 数组是级联选择器的选项列表,其中每个选项都有 `text`、`value` 和 `children` 三个属性。`text` 和 `value` 表示选项的显示文本和值,`children` 是一个空数组,用于存放子选项。 `loadData` 方法是级联选择器异步加载数据的回调函数,它接收一个 `item` 参数,表示当前选中的选项。在该方法中,可以根据当前选项的值通过异步请求获取子选项数据,并将数据赋值给 `item.children` 属性。这样,在用户选择当前选项时,就会自动触发加载子选项的操作。 在实际使用中,需要根据具体的业务需求调整代码,例如修改选项显示文本、修改异步请求的参数等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值