diff --git a/packages/cascader/src/menu.vue b/packages/cascader/src/menu.vue index 2341f0b10..2a60d73e2 100644 --- a/packages/cascader/src/menu.vue +++ b/packages/cascader/src/menu.vue @@ -2,6 +2,26 @@ import { isDef } from 'element-ui/src/utils/shared'; import scrollIntoView from 'element-ui/src/utils/scroll-into-view'; + const copyArray = (arr, props) => { + if (!arr || !Array.isArray(arr) || !props) return arr; + const result = []; + const configurableProps = ['__IS__FLAT__OPTIONS', 'label', 'value', 'disabled']; + const childrenProp = props.children || 'children'; + arr.forEach(item => { + const itemCopy = {}; + configurableProps.forEach(prop => { + const propName = props[prop] || prop; + const value = item[propName]; + if (value !== undefined) itemCopy[propName] = value; + }); + if (Array.isArray(item[childrenProp])) { + itemCopy[childrenProp] = copyArray(item[childrenProp], props); + } + result.push(itemCopy); + }); + return result; + }; + export default { name: 'ElCascaderMenu', @@ -45,7 +65,7 @@ if (option.__IS__FLAT__OPTIONS) return; configurableProps.forEach(prop => { const value = option[this.props[prop] || prop]; - if (value) option[prop] = value; + if (value !== undefined) option[prop] = value; }); if (Array.isArray(option.children)) { formatOptions(option.children); @@ -66,8 +86,9 @@ return activeOptions; }; - formatOptions(this.options); - return loadActiveOptions(this.options); + const optionsCopy = copyArray(this.options, this.props); + formatOptions(optionsCopy); + return loadActiveOptions(optionsCopy); } } },