fix: tree-select not update slots
parent
5643bfef88
commit
4dbed130e2
|
@ -12,8 +12,9 @@ import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined';
|
|||
import CaretDownOutlined from '@ant-design/icons-vue/CaretDownOutlined';
|
||||
import DownOutlined from '@ant-design/icons-vue/DownOutlined';
|
||||
import CloseOutlined from '@ant-design/icons-vue/CloseOutlined';
|
||||
import CloseCircleOutlined from '@ant-design/icons-vue/CloseCircleOutlined';
|
||||
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
||||
import omit from 'omit.js';
|
||||
import { convertChildrenToData } from './utils';
|
||||
|
||||
const TreeSelect = defineComponent({
|
||||
TreeNode,
|
||||
|
@ -41,7 +42,7 @@ const TreeSelect = defineComponent({
|
|||
);
|
||||
},
|
||||
methods: {
|
||||
saveTreeSelect(node) {
|
||||
saveTreeSelect(node: any) {
|
||||
this.vcTreeSelect = node;
|
||||
},
|
||||
focus() {
|
||||
|
@ -51,7 +52,7 @@ const TreeSelect = defineComponent({
|
|||
blur() {
|
||||
this.vcTreeSelect.blur();
|
||||
},
|
||||
renderSwitcherIcon(prefixCls, { isLeaf, loading }) {
|
||||
renderSwitcherIcon(prefixCls: string, { isLeaf, loading }) {
|
||||
if (loading) {
|
||||
return <LoadingOutlined class={`${prefixCls}-switcher-loading-icon`} />;
|
||||
}
|
||||
|
@ -60,19 +61,19 @@ const TreeSelect = defineComponent({
|
|||
}
|
||||
return <CaretDownOutlined class={`${prefixCls}-switcher-icon`} />;
|
||||
},
|
||||
handleChange(...args) {
|
||||
handleChange(...args: any[]) {
|
||||
this.$emit('update:value', args[0]);
|
||||
this.$emit('change', ...args);
|
||||
},
|
||||
handleTreeExpand(...args) {
|
||||
handleTreeExpand(...args: any[]) {
|
||||
this.$emit('update:treeExpandedKeys', args[0]);
|
||||
this.$emit('treeExpand', ...args);
|
||||
},
|
||||
handleSearch(...args) {
|
||||
handleSearch(...args: any[]) {
|
||||
this.$emit('update:searchValue', args[0]);
|
||||
this.$emit('search', ...args);
|
||||
},
|
||||
updateTreeData(treeData) {
|
||||
updateTreeData(treeData: any[]) {
|
||||
const { $slots } = this;
|
||||
const defaultFields = {
|
||||
children: 'children',
|
||||
|
@ -164,9 +165,7 @@ const TreeSelect = defineComponent({
|
|||
|
||||
const finalRemoveIcon = removeIcon || <CloseOutlined class={`${prefixCls}-remove-icon`} />;
|
||||
|
||||
const finalClearIcon = clearIcon || (
|
||||
<CloseCircleOutlined class={`${prefixCls}-clear-icon`} theme="filled" />
|
||||
);
|
||||
const finalClearIcon = clearIcon || <CloseCircleFilled class={`${prefixCls}-clear-icon`} />;
|
||||
const VcTreeSelectProps = {
|
||||
...this.$attrs,
|
||||
switcherIcon: nodeProps => this.renderSwitcherIcon(prefixCls, nodeProps),
|
||||
|
@ -181,13 +180,12 @@ const TreeSelect = defineComponent({
|
|||
dropdownStyle: { maxHeight: '100vh', overflow: 'auto', ...dropdownStyle },
|
||||
treeCheckable: checkable,
|
||||
notFoundContent: notFoundContent || renderEmpty('Select'),
|
||||
...(treeData ? { treeData } : {}),
|
||||
class: cls,
|
||||
onChange: this.handleChange,
|
||||
onSearch: this.handleSearch,
|
||||
onTreeExpand: this.handleTreeExpand,
|
||||
ref: this.saveTreeSelect,
|
||||
children: getSlot(this),
|
||||
treeData: treeData ? treeData : convertChildrenToData(getSlot(this)),
|
||||
};
|
||||
return (
|
||||
<VcTreeSelect
|
||||
|
@ -206,4 +204,12 @@ TreeSelect.install = function(app: App) {
|
|||
return app;
|
||||
};
|
||||
|
||||
export default TreeSelect;
|
||||
export default TreeSelect as typeof TreeSelect & {
|
||||
readonly TreeNode: typeof TreeNode;
|
||||
|
||||
readonly SHOW_ALL: typeof SHOW_ALL;
|
||||
|
||||
readonly SHOW_PARENT: typeof SHOW_PARENT;
|
||||
|
||||
readonly SHOW_CHILD: typeof SHOW_CHILD;
|
||||
};
|
||||
|
|
|
@ -5,8 +5,8 @@ import { tuple } from '../_util/type';
|
|||
export const TreeData = PropTypes.shape({
|
||||
key: PropTypes.string,
|
||||
value: PropTypes.string,
|
||||
label: PropTypes.any,
|
||||
scopedSlots: PropTypes.object,
|
||||
label: PropTypes.VNodeChild,
|
||||
slots: PropTypes.object,
|
||||
children: PropTypes.array,
|
||||
}).loose;
|
||||
|
||||
|
@ -19,7 +19,7 @@ export const TreeSelectProps = () => ({
|
|||
labelInValue: PropTypes.looseBool,
|
||||
loadData: PropTypes.func,
|
||||
maxTagCount: PropTypes.number,
|
||||
maxTagPlaceholder: PropTypes.any,
|
||||
maxTagPlaceholder: PropTypes.VNodeChild,
|
||||
value: PropTypes.oneOfType([
|
||||
PropTypes.string,
|
||||
PropTypes.object,
|
||||
|
@ -33,11 +33,11 @@ export const TreeSelectProps = () => ({
|
|||
PropTypes.number,
|
||||
]),
|
||||
multiple: PropTypes.looseBool,
|
||||
notFoundContent: PropTypes.any,
|
||||
notFoundContent: PropTypes.VNodeChild,
|
||||
searchPlaceholder: PropTypes.string,
|
||||
searchValue: PropTypes.string,
|
||||
showCheckedStrategy: PropTypes.oneOf(tuple('SHOW_ALL', 'SHOW_PARENT', 'SHOW_CHILD')),
|
||||
suffixIcon: PropTypes.any,
|
||||
suffixIcon: PropTypes.VNodeChild,
|
||||
treeCheckable: PropTypes.looseBool,
|
||||
treeCheckStrictly: PropTypes.looseBool,
|
||||
treeData: PropTypes.arrayOf(Object),
|
||||
|
@ -52,8 +52,8 @@ export const TreeSelectProps = () => ({
|
|||
treeNodeFilterProp: PropTypes.string,
|
||||
treeNodeLabelProp: PropTypes.string,
|
||||
replaceFields: PropTypes.object.def({}),
|
||||
clearIcon: PropTypes.any,
|
||||
removeIcon: PropTypes.any,
|
||||
clearIcon: PropTypes.VNodeChild,
|
||||
removeIcon: PropTypes.VNodeChild,
|
||||
|
||||
onSelect: PropTypes.func,
|
||||
onChange: PropTypes.func,
|
|
@ -0,0 +1,34 @@
|
|||
import { flattenChildren, isValidElement } from '../_util/props-util';
|
||||
|
||||
export function convertChildrenToData(nodes: any[]): any[] {
|
||||
return flattenChildren(nodes)
|
||||
.map(node => {
|
||||
if (!isValidElement(node) || !node.type) {
|
||||
return null;
|
||||
}
|
||||
const { default: d, ...restSlot } = node.children || {};
|
||||
const children = d ? d() : [];
|
||||
const {
|
||||
key,
|
||||
props: { value, ...restProps },
|
||||
} = node;
|
||||
|
||||
const data = {
|
||||
key,
|
||||
value,
|
||||
...restProps,
|
||||
};
|
||||
Object.keys(restSlot).forEach(p => {
|
||||
if (typeof restSlot[p] === 'function') {
|
||||
data[p] = restSlot[p]();
|
||||
}
|
||||
});
|
||||
const childData = convertChildrenToData(children);
|
||||
if (childData.length) {
|
||||
data.children = childData;
|
||||
}
|
||||
|
||||
return data;
|
||||
})
|
||||
.filter(data => data);
|
||||
}
|
|
@ -245,12 +245,11 @@ const Select = defineComponent({
|
|||
raf(() => {
|
||||
const popupNode = findDOMNode(this.popup);
|
||||
const triggerContainer = findPopupContainer(popupNode, `${prefixCls}-dropdown`);
|
||||
const searchNode = this.popup.searchRef.current;
|
||||
|
||||
if (domNode && triggerContainer && searchNode) {
|
||||
if (domNode && triggerContainer) {
|
||||
scrollIntoView(domNode, triggerContainer, {
|
||||
onlyScrollIfNeeded: true,
|
||||
offsetTop: searchNode.offsetHeight,
|
||||
offsetTop: 0,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue