elementui的动态加载级联选择器,异步设置默认值

el-cascader组件

最开始我直接在data中给selectCity设置了默认值
相关的值、设置

selectCity: ["ABJ","54511"],	// 第一个是省份code,第二个是citycode都是后台定义的。代表 北京市/北京
props: {
        lazy: true,
        lazyLoad(node, resolve) {
          const { level } = node
          if (level === 0) {  // 第一级加载省份
            queryProvinceList().then(res => {
              if (res.code === 200) {
                const nodes = res.data.map(item => {
                  return {
                    label: item.name,
                    value: item.code,
                    leaf: false
                  }
                })
                resolve(nodes)
              }
            })
          } else {  //  第二级加载城市
            queryCityList({
              provinceCode: node.data.value
            }).then(res => {
              if (res.code === 200) {
                const nodes = res.data.map(item => {
                  return {
                    label: item.name,
                    value: item.code,
                    leaf: true
                  }
                })
                resolve(nodes)
              }
            })
          }
        }
      }

然后页面上也能直接显示
elementui的动态加载级联选择器,异步设置默认值_第1张图片

后来需求改动,需要获取当前的地理位置,然后显示当前的省份和城市。
我首先从百度地图获取当前位置,然后在赋值给selectCity,本以为这样就行了,没想到居然无法显示
默认值设置失败
即使是使用vue Devtools直接修改selectCity,选择框也完全没有变化,但是在点击下拉,并且获取了当前省份的二级列表后,再去修改selectCity,就能显示正确的城市,我的猜测是直接修改并不能触发级联的动态加载,也就是没有值,所以是上图的效果。而data中给定默认值,在后续的渲染中,级联的动态获取会根据默认值去选择。
通过百度找到了解决方法 https://my.oschina.net/xfan/blog/3168543

 // 地图加载完处理
    handler ({BMap, map}) {
      const _this = this
      this.weatherLoading = true
      var geolocation = new BMap.Geolocation()
      geolocation.getCurrentPosition(function(r) {
        const geocoder = new BMap.Geocoder()
        queryCity({
          cityName: r.address.city
        })
        .then(res => {
          if(res.code === 200) {
            _this.weatherLoading = false
            let data = res.data
            _this.selectedCity = [data.provinceCode, data.code]	// 根据当前位置设置默认值
            _this.setValue(_this.selectedCity)	// 通过这步可以使级联选择正常显示 省份/城市
            _this.getWeather()
          } else {
            _this.$message.error('获取当前位置失败')
            _this.weatherLoading = false
          }
        })
      })
    },
    // 异步设置cascader的值
    setValue(arr){
      this.nodes=arr
      let cs=this.$refs['cs']  
      cs.panel.activePath=[]  
      cs.panel.loadCount=0  
      cs.panel.lazyLoad()
    }

不过原理我还是没有弄明白,是重新触发级联的动态渲染的意思?

尝试看了下源码
elementui的动态加载级联选择器,异步设置默认值_第2张图片
虽然没怎么看懂,大概明白解决方法是初始化了设置,然后强制调用lazyLoad去触发prop中定义的lazyLoad,此时会从selectCity中获取值去加载,最后正常显示。

前端小白,如果有不对的地方请指正。如果有更好的理解希望能够留下言。

你可能感兴趣的:(elementui的动态加载级联选择器,异步设置默认值)