关于element-ui源码中el-cascader级联组件的疑问

来源:2-6 【讨论题】Virtual DOM

我要学习去了

2021-12-02

黄老师,你好,最近在研究element-ui组件库的源码,但是这几天再看el-cascader的源码的时候遇到一个问题,希望黄老师帮忙指点一下
我的问题如下:
在非multiple的情况下,我没有找到为什么级联选择器选择最后一个item时,点击之后他会自动收起的逻辑,或者说是没有看懂这块的逻辑,
初次点击执行toggleDropDownVisible(readonly ? undefined : true)"方法不是会把dropDownVisible该为true让其显示吗?
然后点击后面的子集应该是会watch这么一段逻辑,然后我发现这里面去执行 this.toggleDropDownVisible(false);的时候,dropDownVisible的值变成了false,但是整个el-cascader-pane却还是显示的状态,按道理不是双向绑定了,如果为false应该会收起啊,而且还有一点,就是当我点击isLeaf节点的时候,dropDownVisible又为true了,然后 进入if (visible !== dropDownVisible),dropDownVisible 为visible的false值,然后收起,这块点击叶子节点自动收起的逻辑真的看了几遍没看懂,希望黄老师给点提示

    checkedValue(val) {
      const { value, dropDownVisible } = this;
      const { checkStrictly, multiple } = this.config;

      if (!isEqual(val, value) || isUndefined(value)) {
        this.computePresentContent();
        // hide dropdown when single mode
        if (!multiple && !checkStrictly && dropDownVisible) {
          this.toggleDropDownVisible(false);
        }

        this.$emit('input', val);
        this.$emit('change', val);
        this.dispatch('ElFormItem', 'el.form.change', [val]);
      }
    },
    toggleDropDownVisible(visible) {
      console.log(visible, this.dropDownVisible);
      debugger;
      if (this.isDisabled) return;

      const { dropDownVisible } = this;
      const { input } = this.$refs;
      visible = isDef(visible) ? visible : !dropDownVisible;
      if (visible !== dropDownVisible) {
        this.dropDownVisible = visible;
        console.log(this.dropDownVisible);
        if (visible) {
          this.$nextTick(() => {
            this.updatePopper();
            this.panel.scrollIntoView();
          });
        }
        input.$refs.input.setAttribute('aria-expanded', visible);
        this.$emit('visible-change', visible);
      }
    },
写回答

1回答

ustbhuangyi

2021-12-05

选择叶子节点,说明选中的值变了,就会触发 checkedValue watcher 的回调函数,然后执行

if (!multiple && !checkStrictly && dropDownVisible) {   this.toggleDropDownVisible(false); }

这样不就关了么

0
1
我要学习去了
多谢黄老师,我发现是我debugger的时候把自己debugger懵了,尴尬
2021-12-06
共1条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4986 学习 · 1038 问题

查看课程