本篇文章解决的问题:
1,绑定事件@active-item-change点击后无反应
2,需要动态加载到第三级,官网例子只给了第二级,比如(省、市、区)(顶级分类、二级分类、三级分类)
3,已经加载过的数据防止重复加载
下面是代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
<template> <el-cascader :options="platOptions" @active-item-change="handleItemChange" :props="props"></el-cascader> </template> <script> export default { data () { return { platOptions: [], props: { label: 'name', value: 'id', children: 'child' } } }, methods: { getPlatCategory () { // 请求顶级分类 this.$axios.get('/api/getCategory') .then(res => { if (res.status === 200) { this.platOptions = res.data.data this.platOptions.map((item, index, array) => { // 因为数组和对象更新后不会更新视图,这里必须用$set方法 this.$set(array[index], 'child', []) }) } }).catch(error => { let langmsg = this.$i18n.locale === 'zh' ? error.data.zhmsg : error.data.enmsg this.$message.error(langmsg) }) }, handleItemChange (value) { // 动态/异步加载分类数据 let parentId if (value.length === 1) { // 如果点击的是一级分类 parentId = value[0] this.platOptions.map((item, index) => { if (item.id === parentId && item.child.length === 0) { // 当顶级分类的的child为空时才请求数据 this.$axios.get('/api/getCategorySon', { params: { parent_id: parentId } }).then(res => { if (res.status === 200) { this.$set(this.platOptions[index], 'child', res.data.data) item.child.map((innerItem, innerIndex) => { // 二级分类下必须要设置一个空的child数组,不然点击@active-item-change没反应 this.$set(item.child[innerIndex], 'child', []) }) } }) } }) } else { // 如果点击的是二级分类,则直接将三级分类绑定到platOptions parentId = value[1] this.platOptions.map((item, index) => { item.child.map((innerItem, innerIndex) => { if (innerItem.id === parentId && innerItem.child.length === 0) { // 当二级分类的的child为空时才请求一次数据 this.$axios.get('/api/getCategorySon', { params: { parent_id: parentId } }).then(res => { if (res.status === 200) { this.$set(item.child[innerIndex], 'child', res.data.data) } }) } }) }) } } } } </script> |
欢迎留言,1小时内回复。
我已经用vue+element做过好几个大型项目,遇到过不少坑,希望能帮到有需要的人。
另外,这些博客上的视频教程真的对开发有不小的帮助,发出来的大部分我都已经看了,良心推荐
您好,为啥我的按照你这个区处理,在获取二级分类的时候报错;额 vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in callback for watcher “options”: “TypeError: options.forEach is not a function”
found in
检查一下你的options是什么,如果你要遍历它,它必须是一个数组
您好!我正在用这个级联选择器做动态加载,但是遇到的问题是层级很多不知道多少级。我该怎么去做,想请教一下
那你可以依照代码中的思路做一下判断,判断目录是否有子目录的存在。
正好需要这个,get
请问每次更新数据会导致下拉菜单收回是为什么啊
请问在获取二三级数据的时候会导致下拉列表收回是什么原因啊
看下控制台报的什么错
没有报错啊
我感觉像是因为数据更新导致了 , 下拉菜单回收 , 因为第二次点相同地区 , 就不会出现这个问题
我感觉像是因为数据更新导致的 , 下拉菜单回收 , 因为第二次点相同地区 , 就不会出现这个问题
你看下你的数据结构,如果你点击的项下面没有子分类,是会直接结束选择的,就是你说的菜单回收
[
{child: Array(0)
code: 110000
name: “北京市”
},
{child: Array(0)
code: 120000
name: “天津市”
}
]
这是一级的数据结构,有子类但是长度为0
长度为0 就是没有子分类,element这个组件施这样的,必须大于0
那这不是一级一级请求的么 , 不点击一级菜单 , 就不会有二级菜单啊
但是你请求一级分类,响应的数据下面二级分类都会显示子分类个数的
不太明白 ,getPlatCategory这个函数是初始化的一级菜单的吧 , 我能知道你的一级菜单初始化的之后数据结构是什么样子的么
handleItemChange 这个函数里面的判断item.child.length === 0,如果子分类的长度不是0的话是不会请求数据的
谢谢楼主的回答啊 , 虽然我还是不理解 , 但是我用您的函数加上官网的例子给解决了 ,很感谢楼主的耐心回答。
解决了就好
我也遇到这种情况,请问下怎么解决的呢
不知道你有没有解决,我最近刚好遇到了这问题,需要在页面加载时,就获得完整的options,具体数据结构参考element官网
我也是获取完整的options 异步没解决,不过官方例子是可以
问题出在哪里?
大神你好,element出了新版,cascader有了lazyload,能不能把这个代码改成新版的呢?现在这个似乎在新版运行有问题了。
是更新了,等后面项目更新的时候我再整理下
使用lazyload,三级数据三个API完全没头绪,el的lazyload样例太简单了,大神能提供下思路吗
那在做编辑的时候,怎么回显展示呀,大佬指点一下
一级分类和二级分类value值相同,会回收是什么原因啊
你好。关于级联器有个问题想问一下。
我现在使用懒加载的方式加载了中国各个省市县区的数据。省一级的我是在json文件写死的然后加载;市、县区的是查询的数据库进行懒加载。
需求:我想点击清空按钮后,他的目录只显示省一级的。或者直接干脆点,能不能把级联器销毁了重新创建一个。
这样做按我的思路来讲,是没有意义的啊
我的懒加载是这样做的:
1,请求过的数据放在缓存里面localstorage,没有请求到的没有数据, 每次点开一个新的二级,再往缓存里面塞数据
如果要清空,你直接删除掉缓存的诗句,请求一级接口就可以
很有用,感谢分享