关于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); }
这样不就关了么
012021-12-06
相似问题