Merge remote-tracking branch 'origin/master' into feat-vue3
# Conflicts: # antdv-demo # components/_util/store/connect.jsx # components/locale-provider/__tests__/__snapshots__/index.test.js.snap # package.jsonpull/2502/head
parent
19e4e27814
commit
0c851369e0
|
@ -127,7 +127,7 @@ const getOptionProps = instance => {
|
|||
}
|
||||
return res;
|
||||
};
|
||||
const getComponent = (instance, prop, options = instance, execute = true) => {
|
||||
const getComponent = (instance, prop = 'default', options = instance, execute = true) => {
|
||||
if (instance.$) {
|
||||
const temp = instance[prop];
|
||||
if (temp !== undefined) {
|
||||
|
@ -231,9 +231,6 @@ const getAttrs = ele => {
|
|||
|
||||
const getKey = ele => {
|
||||
let key = ele.key;
|
||||
if (ele.$vnode) {
|
||||
key = ele.$vnode.key;
|
||||
}
|
||||
return key;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { reactive, provide } from 'vue';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import { getComponentFromProp } from '../_util/props-util';
|
||||
import { getComponent } from '../_util/props-util';
|
||||
import defaultRenderEmpty from './renderEmpty';
|
||||
import LocaleProvider, { ANT_MARK } from '../locale-provider';
|
||||
import LocaleReceiver from '../locale-provider/LocaleReceiver';
|
||||
|
@ -51,10 +51,9 @@ const ConfigProvider = {
|
|||
]),
|
||||
},
|
||||
methods: {
|
||||
renderEmptyComponent(h, name) {
|
||||
const renderEmpty =
|
||||
getComponentFromProp(this, 'renderEmpty', {}, false) || defaultRenderEmpty;
|
||||
return renderEmpty(h, name);
|
||||
renderEmptyComponent(name) {
|
||||
const renderEmpty = getComponent(this, 'renderEmpty', {}, false) || defaultRenderEmpty;
|
||||
return renderEmpty(name);
|
||||
},
|
||||
getPrefixCls(suffixCls, customizePrefixCls) {
|
||||
const { prefixCls = 'ant' } = this.$props;
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
import { provide, inject } from 'vue';
|
||||
import warning from '../_util/warning';
|
||||
import omit from 'omit.js';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import { Select as VcSelect, Option, OptGroup } from '../vc-select';
|
||||
import { ConfigConsumerProps } from '../config-provider';
|
||||
import {
|
||||
getComponentFromProp,
|
||||
getComponent,
|
||||
getOptionProps,
|
||||
filterEmpty,
|
||||
isValidElement,
|
||||
getListeners,
|
||||
getSlot,
|
||||
} from '../_util/props-util';
|
||||
import CloseOutlined from '@ant-design/icons-vue/CloseOutlined';
|
||||
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
||||
|
@ -16,7 +17,6 @@ import CheckOutlined from '@ant-design/icons-vue/CheckOutlined';
|
|||
import DownOutlined from '@ant-design/icons-vue/DownOutlined';
|
||||
import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined';
|
||||
import { cloneElement } from '../_util/vnode';
|
||||
import Base from '../base';
|
||||
|
||||
const AbstractSelectProps = () => ({
|
||||
prefixCls: PropTypes.string,
|
||||
|
@ -107,19 +107,17 @@ const Select = {
|
|||
choiceTransitionName: PropTypes.string.def('zoom'),
|
||||
},
|
||||
propTypes: SelectPropTypes,
|
||||
model: {
|
||||
prop: 'value',
|
||||
event: 'change',
|
||||
},
|
||||
provide() {
|
||||
// model: {
|
||||
// prop: 'value',
|
||||
// event: 'change',
|
||||
// },
|
||||
setup() {
|
||||
return {
|
||||
savePopupRef: this.savePopupRef,
|
||||
configProvider: inject('configProvider', ConfigConsumerProps),
|
||||
};
|
||||
},
|
||||
inject: {
|
||||
configProvider: { default: () => ConfigConsumerProps },
|
||||
},
|
||||
created() {
|
||||
provide('savePopupRef', this.savePopupRef);
|
||||
warning(
|
||||
this.$props.mode !== 'combobox',
|
||||
'Select',
|
||||
|
@ -130,15 +128,14 @@ const Select = {
|
|||
},
|
||||
methods: {
|
||||
getNotFoundContent(renderEmpty) {
|
||||
const h = this.$createElement;
|
||||
const notFoundContent = getComponentFromProp(this, 'notFoundContent');
|
||||
const notFoundContent = getComponent(this, 'notFoundContent');
|
||||
if (notFoundContent !== undefined) {
|
||||
return notFoundContent;
|
||||
}
|
||||
if (this.isCombobox()) {
|
||||
return null;
|
||||
}
|
||||
return renderEmpty(h, 'Select');
|
||||
return renderEmpty('Select');
|
||||
},
|
||||
savePopupRef(ref) {
|
||||
this.popupRef = ref;
|
||||
|
@ -157,7 +154,7 @@ const Select = {
|
|||
|
||||
renderSuffixIcon(prefixCls) {
|
||||
const { loading } = this.$props;
|
||||
let suffixIcon = getComponentFromProp(this, 'suffixIcon');
|
||||
let suffixIcon = getComponent(this, 'suffixIcon');
|
||||
suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon;
|
||||
if (suffixIcon) {
|
||||
return isValidElement(suffixIcon)
|
||||
|
@ -180,17 +177,18 @@ const Select = {
|
|||
showArrow,
|
||||
...restProps
|
||||
} = getOptionProps(this);
|
||||
const { class: className } = this.$attrs;
|
||||
|
||||
const getPrefixCls = this.configProvider.getPrefixCls;
|
||||
const renderEmpty = this.configProvider.renderEmpty;
|
||||
const prefixCls = getPrefixCls('select', customizePrefixCls);
|
||||
|
||||
const { getPopupContainer: getContextPopupContainer } = this.configProvider;
|
||||
let removeIcon = getComponentFromProp(this, 'removeIcon');
|
||||
let removeIcon = getComponent(this, 'removeIcon');
|
||||
removeIcon = Array.isArray(removeIcon) ? removeIcon[0] : removeIcon;
|
||||
let clearIcon = getComponentFromProp(this, 'clearIcon');
|
||||
let clearIcon = getComponent(this, 'clearIcon');
|
||||
clearIcon = Array.isArray(clearIcon) ? clearIcon[0] : clearIcon;
|
||||
let menuItemSelectedIcon = getComponentFromProp(this, 'menuItemSelectedIcon');
|
||||
let menuItemSelectedIcon = getComponent(this, 'menuItemSelectedIcon');
|
||||
menuItemSelectedIcon = Array.isArray(menuItemSelectedIcon)
|
||||
? menuItemSelectedIcon[0]
|
||||
: menuItemSelectedIcon;
|
||||
|
@ -203,6 +201,7 @@ const Select = {
|
|||
]);
|
||||
|
||||
const cls = {
|
||||
[className]: className,
|
||||
[`${prefixCls}-lg`]: size === 'large',
|
||||
[`${prefixCls}-sm`]: size === 'small',
|
||||
[`${prefixCls}-show-arrow`]: showArrow,
|
||||
|
@ -235,34 +234,32 @@ const Select = {
|
|||
: menuItemSelectedIcon)) || <CheckOutlined class={`${prefixCls}-selected-icon`} />;
|
||||
|
||||
const selectProps = {
|
||||
props: {
|
||||
inputIcon: this.renderSuffixIcon(prefixCls),
|
||||
removeIcon: finalRemoveIcon,
|
||||
clearIcon: finalClearIcon,
|
||||
menuItemSelectedIcon: finalMenuItemSelectedIcon,
|
||||
showArrow,
|
||||
...rest,
|
||||
...modeConfig,
|
||||
prefixCls,
|
||||
optionLabelProp: optionLabelProp || 'children',
|
||||
notFoundContent: this.getNotFoundContent(renderEmpty),
|
||||
maxTagPlaceholder: getComponentFromProp(this, 'maxTagPlaceholder'),
|
||||
placeholder: getComponentFromProp(this, 'placeholder'),
|
||||
children: options
|
||||
? options.map(option => {
|
||||
const { key, label = option.title, on, class: cls, style, ...restOption } = option;
|
||||
return (
|
||||
<Option key={key} {...{ props: restOption, on, class: cls, style }}>
|
||||
{label}
|
||||
</Option>
|
||||
);
|
||||
})
|
||||
: filterEmpty(this.$slots.default),
|
||||
__propsSymbol__: Symbol(),
|
||||
dropdownRender: getComponentFromProp(this, 'dropdownRender', {}, false),
|
||||
getPopupContainer: getPopupContainer || getContextPopupContainer,
|
||||
},
|
||||
on: getListeners(this),
|
||||
inputIcon: this.renderSuffixIcon(prefixCls),
|
||||
removeIcon: finalRemoveIcon,
|
||||
clearIcon: finalClearIcon,
|
||||
menuItemSelectedIcon: finalMenuItemSelectedIcon,
|
||||
showArrow,
|
||||
...rest,
|
||||
...modeConfig,
|
||||
prefixCls,
|
||||
optionLabelProp: optionLabelProp || 'children',
|
||||
notFoundContent: this.getNotFoundContent(renderEmpty),
|
||||
maxTagPlaceholder: getComponent(this, 'maxTagPlaceholder'),
|
||||
placeholder: getComponent(this, 'placeholder'),
|
||||
children: options
|
||||
? options.map(option => {
|
||||
const { key, label = option.title, on, class: cls, style, ...restOption } = option;
|
||||
return (
|
||||
<Option key={key} {...{ on, class: cls, style, ...restOption }}>
|
||||
{label}
|
||||
</Option>
|
||||
);
|
||||
})
|
||||
: filterEmpty(getSlot(this)),
|
||||
__propsSymbol__: Symbol(),
|
||||
dropdownRender: getComponent(this, 'dropdownRender', {}, false),
|
||||
getPopupContainer: getPopupContainer || getContextPopupContainer,
|
||||
...this.$attrs,
|
||||
class: cls,
|
||||
ref: 'vcSelect',
|
||||
};
|
||||
|
@ -271,11 +268,9 @@ const Select = {
|
|||
};
|
||||
|
||||
/* istanbul ignore next */
|
||||
Select.install = function(Vue) {
|
||||
Vue.use(Base);
|
||||
Vue.component(Select.name, Select);
|
||||
Vue.component(Select.Option.name, Select.Option);
|
||||
Vue.component(Select.OptGroup.name, Select.OptGroup);
|
||||
Select.install = function(app) {
|
||||
app.component(Select.name, Select);
|
||||
app.component(Select.Option.name, Select.Option);
|
||||
app.component(Select.OptGroup.name, Select.OptGroup);
|
||||
};
|
||||
|
||||
export default Select;
|
||||
|
|
|
@ -56,4 +56,6 @@ export const SelectPropTypes = {
|
|||
dropdownMenuStyle: PropTypes.object,
|
||||
notFoundContent: PropTypes.oneOfType([String, Number]),
|
||||
tabIndex: PropTypes.oneOfType([String, Number]),
|
||||
__propsSymbol__: PropTypes.any,
|
||||
children: PropTypes.array,
|
||||
};
|
||||
|
|
|
@ -4,7 +4,6 @@ import classnames from 'classnames';
|
|||
import classes from 'component-classes';
|
||||
import { Item as MenuItem, ItemGroup as MenuItemGroup } from '../vc-menu';
|
||||
import warning from 'warning';
|
||||
import Vue from 'vue';
|
||||
import Option from './Option';
|
||||
import OptGroup from './OptGroup';
|
||||
import {
|
||||
|
@ -12,20 +11,15 @@ import {
|
|||
getSlotOptions,
|
||||
getPropsData,
|
||||
getValueByProp as getValue,
|
||||
getComponentFromProp,
|
||||
getComponent,
|
||||
getEvents,
|
||||
getClass,
|
||||
getStyle,
|
||||
getAttrs,
|
||||
getOptionProps,
|
||||
getSlots,
|
||||
getListeners,
|
||||
} from '../_util/props-util';
|
||||
import getTransitionProps from '../_util/getTransitionProps';
|
||||
import { cloneElement } from '../_util/vnode';
|
||||
import BaseMixin from '../_util/BaseMixin';
|
||||
import proxyComponent from '../_util/proxyComponent';
|
||||
import ref from 'vue-ref';
|
||||
import SelectTrigger from './SelectTrigger';
|
||||
import {
|
||||
defaultFilterFn,
|
||||
|
@ -54,7 +48,6 @@ import { SelectPropTypes } from './PropTypes';
|
|||
import contains from '../vc-util/Dom/contains';
|
||||
import { isIE, isEdge } from '../_util/env';
|
||||
|
||||
Vue.use(ref, { name: 'ant-ref' });
|
||||
const SELECT_EMPTY_VALUE_KEY = 'RC_SELECT_EMPTY_VALUE_KEY';
|
||||
|
||||
const noop = () => null;
|
||||
|
@ -670,11 +663,9 @@ const Select = {
|
|||
const placeholder = props.placeholder;
|
||||
if (placeholder) {
|
||||
const p = {
|
||||
on: {
|
||||
mousedown: preventDefaultEvent,
|
||||
click: this.onPlaceholderClick,
|
||||
},
|
||||
attrs: UNSELECTABLE_ATTRIBUTE,
|
||||
onMousedown: preventDefaultEvent,
|
||||
onClick: this.onPlaceholderClick,
|
||||
...UNSELECTABLE_ATTRIBUTE,
|
||||
style: {
|
||||
display: hidden ? 'none' : 'block',
|
||||
...UNSELECTABLE_STYLE,
|
||||
|
@ -810,51 +801,28 @@ const Select = {
|
|||
return (
|
||||
<div class={`${props.prefixCls}-search__field__wrap`} onClick={this.inputClick}>
|
||||
{cloneElement(inputElement, {
|
||||
props: {
|
||||
disabled: props.disabled,
|
||||
value: inputValue,
|
||||
},
|
||||
attrs: {
|
||||
...(inputElement.data.attrs || {}),
|
||||
disabled: props.disabled,
|
||||
value: inputValue,
|
||||
},
|
||||
domProps: {
|
||||
value: inputValue,
|
||||
},
|
||||
disabled: props.disabled,
|
||||
value: inputValue,
|
||||
...(inputElement.data.attrs || {}),
|
||||
disabled: props.disabled,
|
||||
value: inputValue,
|
||||
class: inputCls,
|
||||
ref: this.saveInputRef,
|
||||
directives: [
|
||||
{
|
||||
name: 'ant-ref',
|
||||
value: this.saveInputRef,
|
||||
},
|
||||
{
|
||||
name: 'ant-input',
|
||||
},
|
||||
],
|
||||
on: {
|
||||
input: this.onInputChange,
|
||||
keydown: chaining(
|
||||
this.onInputKeydown,
|
||||
inputEvents.keydown,
|
||||
getListeners(this).inputKeydown,
|
||||
),
|
||||
focus: chaining(this.inputFocus, inputEvents.focus),
|
||||
blur: chaining(this.inputBlur, inputEvents.blur),
|
||||
},
|
||||
onInput: this.onInputChange,
|
||||
onKeydown: chaining(
|
||||
this.onInputKeydown,
|
||||
inputEvents.onKeydown,
|
||||
this.$attrs.onInputKeydown,
|
||||
),
|
||||
onFocus: chaining(this.inputFocus, inputEvents.onFocus),
|
||||
onBlur: chaining(this.inputBlur, inputEvents.onBlur),
|
||||
})}
|
||||
<span
|
||||
{...{
|
||||
directives: [
|
||||
{
|
||||
name: 'ant-ref',
|
||||
value: this.saveInputMirrorRef,
|
||||
},
|
||||
],
|
||||
}}
|
||||
// ref='inputMirrorRef'
|
||||
class={`${props.prefixCls}-search__field__mirror`}
|
||||
>
|
||||
<span ref={this.saveInputMirrorRef} class={`${props.prefixCls}-search__field__mirror`}>
|
||||
{_mirrorInputValue}
|
||||
</span>
|
||||
</div>
|
||||
|
@ -1177,7 +1145,7 @@ const Select = {
|
|||
role: 'option',
|
||||
};
|
||||
const menuItem = (
|
||||
<MenuItem style={UNSELECTABLE_STYLE} {...{ attrs }} value={key} key={key}>
|
||||
<MenuItem style={UNSELECTABLE_STYLE} {...attrs} value={key} key={key}>
|
||||
{key}
|
||||
</MenuItem>
|
||||
);
|
||||
|
@ -1187,12 +1155,10 @@ const Select = {
|
|||
// ref: https://github.com/ant-design/ant-design/issues/14090
|
||||
if (inputValue && menuItems.every(option => getValuePropValue(option) !== inputValue)) {
|
||||
const p = {
|
||||
attrs: UNSELECTABLE_ATTRIBUTE,
|
||||
...UNSELECTABLE_ATTRIBUTE,
|
||||
key: inputValue,
|
||||
props: {
|
||||
value: inputValue,
|
||||
role: 'option',
|
||||
},
|
||||
value: inputValue,
|
||||
role: 'option',
|
||||
style: UNSELECTABLE_STYLE,
|
||||
};
|
||||
options.unshift(<MenuItem {...p}>{inputValue}</MenuItem>);
|
||||
|
@ -1202,13 +1168,11 @@ const Select = {
|
|||
if (!options.length && notFoundContent) {
|
||||
empty = true;
|
||||
const p = {
|
||||
attrs: UNSELECTABLE_ATTRIBUTE,
|
||||
...UNSELECTABLE_ATTRIBUTE,
|
||||
key: 'NOT_FOUND',
|
||||
props: {
|
||||
value: 'NOT_FOUND',
|
||||
disabled: true,
|
||||
role: 'option',
|
||||
},
|
||||
value: 'NOT_FOUND',
|
||||
disabled: true,
|
||||
role: 'option',
|
||||
style: UNSELECTABLE_STYLE,
|
||||
};
|
||||
options = [<MenuItem {...p}>{notFoundContent}</MenuItem>];
|
||||
|
@ -1222,32 +1186,38 @@ const Select = {
|
|||
const { _inputValue: inputValue } = this.$data;
|
||||
const tags = props.tags;
|
||||
children.forEach(child => {
|
||||
if (!child.data || child.data.slot !== undefined) {
|
||||
const type = child.type;
|
||||
warning(
|
||||
typeof type === 'object' && type.isSelectOption,
|
||||
'the children of `Select` should be `Select.Option` or `Select.OptGroup`, ' +
|
||||
`instead of \`${getSlotOptions(child).name || getSlotOptions(child)}\`.`,
|
||||
);
|
||||
if (typeof type !== 'object' || !type.isSelectOption) {
|
||||
return;
|
||||
}
|
||||
if (getSlotOptions(child).isSelectOptGroup) {
|
||||
let label = getComponentFromProp(child, 'label');
|
||||
if (type.isSelectOptGroup) {
|
||||
let label = getComponent(child, 'label');
|
||||
let key = child.key;
|
||||
if (!key && typeof label === 'string') {
|
||||
key = label;
|
||||
} else if (!label && key) {
|
||||
label = key;
|
||||
}
|
||||
let childChildren = getSlots(child).default;
|
||||
childChildren = typeof childChildren === 'function' ? childChildren() : childChildren;
|
||||
let childChildren = getComponent(child);
|
||||
childChildren = Array.isArray(childChildren) ? childChildren : [childChildren];
|
||||
// Match option group label
|
||||
if (inputValue && this._filterOption(inputValue, child)) {
|
||||
const innerItems = childChildren.map(subChild => {
|
||||
const childValueSub = getValuePropValue(subChild) || subChild.key;
|
||||
return (
|
||||
<MenuItem key={childValueSub} value={childValueSub} {...subChild.data}>
|
||||
{subChild.componentOptions.children}
|
||||
<MenuItem key={childValueSub} value={childValueSub} {...subChild.props}>
|
||||
{subChild.children?.default()}
|
||||
</MenuItem>
|
||||
);
|
||||
});
|
||||
|
||||
sel.push(
|
||||
<MenuItemGroup key={key} title={label} class={getClass(child)}>
|
||||
<MenuItemGroup key={key} title={label} class={child.props?.class}>
|
||||
{innerItems}
|
||||
</MenuItemGroup>,
|
||||
);
|
||||
|
@ -1261,7 +1231,7 @@ const Select = {
|
|||
);
|
||||
if (innerItems.length) {
|
||||
sel.push(
|
||||
<MenuItemGroup key={key} title={label} {...child.data}>
|
||||
<MenuItemGroup key={key} title={label} {...child.props}>
|
||||
{innerItems}
|
||||
</MenuItemGroup>,
|
||||
);
|
||||
|
@ -1270,32 +1240,21 @@ const Select = {
|
|||
|
||||
return;
|
||||
}
|
||||
warning(
|
||||
getSlotOptions(child).isSelectOption,
|
||||
'the children of `Select` should be `Select.Option` or `Select.OptGroup`, ' +
|
||||
`instead of \`${getSlotOptions(child).name || getSlotOptions(child)}\`.`,
|
||||
);
|
||||
|
||||
const childValue = getValuePropValue(child);
|
||||
|
||||
validateOptionValue(childValue, this.$props);
|
||||
if (this._filterOption(inputValue, child)) {
|
||||
const p = {
|
||||
attrs: {
|
||||
...UNSELECTABLE_ATTRIBUTE,
|
||||
...getAttrs(child),
|
||||
},
|
||||
...UNSELECTABLE_ATTRIBUTE,
|
||||
key: childValue,
|
||||
props: {
|
||||
value: childValue,
|
||||
...getPropsData(child),
|
||||
role: 'option',
|
||||
},
|
||||
value: childValue,
|
||||
...getPropsData(child),
|
||||
role: 'option',
|
||||
style: UNSELECTABLE_STYLE,
|
||||
on: getEvents(child),
|
||||
class: getClass(child),
|
||||
class: child?.class,
|
||||
};
|
||||
const menuItem = <MenuItem {...p}>{child.componentOptions.children}</MenuItem>;
|
||||
const menuItem = <MenuItem {...p}>{child.children?.default()}</MenuItem>;
|
||||
sel.push(menuItem);
|
||||
menuItems.push(menuItem);
|
||||
}
|
||||
|
@ -1318,7 +1277,7 @@ const Select = {
|
|||
maxTagPlaceholder,
|
||||
showSearch,
|
||||
} = props;
|
||||
const removeIcon = getComponentFromProp(this, 'removeIcon');
|
||||
const removeIcon = getComponent(this, 'removeIcon');
|
||||
const className = `${prefixCls}-selection__rendered`;
|
||||
// search input is inside topControlNode in single, multiple & combobox. 2016/04/13
|
||||
let innerNode = null;
|
||||
|
@ -1391,7 +1350,7 @@ const Select = {
|
|||
maxTagPlaceholderEl = (
|
||||
<li
|
||||
style={UNSELECTABLE_STYLE}
|
||||
{...{ attrs }}
|
||||
{...attrs}
|
||||
onMousedown={preventDefaultEvent}
|
||||
class={`${prefixCls}-selection__choice ${prefixCls}-selection__choice__disabled`}
|
||||
key="maxTagPlaceholder"
|
||||
|
@ -1425,7 +1384,7 @@ const Select = {
|
|||
return (
|
||||
<li
|
||||
style={UNSELECTABLE_STYLE}
|
||||
{...{ attrs }}
|
||||
{...attrs}
|
||||
onMousedown={preventDefaultEvent}
|
||||
class={choiceClassName}
|
||||
key={singleValue || SELECT_EMPTY_VALUE_KEY}
|
||||
|
@ -1467,18 +1426,7 @@ const Select = {
|
|||
}
|
||||
}
|
||||
return (
|
||||
<div
|
||||
class={className}
|
||||
{...{
|
||||
directives: [
|
||||
{
|
||||
name: 'ant-ref',
|
||||
value: this.saveTopCtrlRef,
|
||||
},
|
||||
],
|
||||
}}
|
||||
onClick={this.topCtrlContainerClick}
|
||||
>
|
||||
<div class={className} ref={this.saveTopCtrlRef} onClick={this.topCtrlContainerClick}>
|
||||
{this.getPlaceholderElement()}
|
||||
{innerNode}
|
||||
</div>
|
||||
|
@ -1487,7 +1435,7 @@ const Select = {
|
|||
renderArrow(multiple) {
|
||||
// showArrow : Set to true if not multiple by default but keep set value.
|
||||
const { showArrow = !multiple, loading, prefixCls } = this.$props;
|
||||
const inputIcon = getComponentFromProp(this, 'inputIcon');
|
||||
const inputIcon = getComponent(this, 'inputIcon');
|
||||
if (!showArrow && !loading) {
|
||||
return null;
|
||||
}
|
||||
|
@ -1502,7 +1450,7 @@ const Select = {
|
|||
key="arrow"
|
||||
class={`${prefixCls}-arrow`}
|
||||
style={UNSELECTABLE_STYLE}
|
||||
{...{ attrs: UNSELECTABLE_ATTRIBUTE }}
|
||||
{...UNSELECTABLE_ATTRIBUTE}
|
||||
onClick={this.onArrowClick}
|
||||
ref="arrow"
|
||||
>
|
||||
|
@ -1518,14 +1466,14 @@ const Select = {
|
|||
renderClear() {
|
||||
const { prefixCls, allowClear } = this.$props;
|
||||
const { _value: value, _inputValue: inputValue } = this.$data;
|
||||
const clearIcon = getComponentFromProp(this, 'clearIcon');
|
||||
const clearIcon = getComponent(this, 'clearIcon');
|
||||
const clear = (
|
||||
<span
|
||||
key="clear"
|
||||
class={`${prefixCls}-selection__clear`}
|
||||
onMousedown={preventDefaultEvent}
|
||||
style={UNSELECTABLE_STYLE}
|
||||
{...{ attrs: UNSELECTABLE_ATTRIBUTE }}
|
||||
{...UNSELECTABLE_ATTRIBUTE}
|
||||
onClick={this.onClearSelection}
|
||||
>
|
||||
{clearIcon || <i class={`${prefixCls}-selection__clear-icon`}>×</i>}
|
||||
|
@ -1582,12 +1530,12 @@ const Select = {
|
|||
|
||||
render() {
|
||||
const props = this.$props;
|
||||
const { class: className, style } = this.$attrs;
|
||||
const multiple = isMultipleOrTags(props);
|
||||
// Default set showArrow to true if not set (not set directly in defaultProps to handle multiple case)
|
||||
const { showArrow = true } = props;
|
||||
const state = this.$data;
|
||||
const { disabled, prefixCls, loading } = props;
|
||||
const ctrlNode = this.renderTopControlNode();
|
||||
const { _open: open, _inputValue: inputValue, _value: value } = this.$data;
|
||||
if (open) {
|
||||
const filterOptions = this.renderFilterOptions();
|
||||
|
@ -1597,26 +1545,13 @@ const Select = {
|
|||
const realOpen = this.getRealOpenState();
|
||||
const empty = this._empty;
|
||||
const options = this._options || [];
|
||||
const { mouseenter = noop, mouseleave = noop, popupScroll = noop } = getListeners(this);
|
||||
const selectionProps = {
|
||||
props: {},
|
||||
attrs: {
|
||||
role: 'combobox',
|
||||
'aria-autocomplete': 'list',
|
||||
'aria-haspopup': 'true',
|
||||
'aria-expanded': realOpen,
|
||||
'aria-controls': this.$data._ariaId,
|
||||
},
|
||||
on: {
|
||||
// click: this.selectionRefClick,
|
||||
},
|
||||
role: 'combobox',
|
||||
'aria-autocomplete': 'list',
|
||||
'aria-haspopup': 'true',
|
||||
'aria-expanded': realOpen,
|
||||
'aria-controls': this.$data._ariaId,
|
||||
class: `${prefixCls}-selection ${prefixCls}-selection--${multiple ? 'multiple' : 'single'}`,
|
||||
// directives: [
|
||||
// {
|
||||
// name: 'ant-ref',
|
||||
// value: this.saveSelectionRef,
|
||||
// },
|
||||
// ],
|
||||
key: 'selection',
|
||||
};
|
||||
//if (!isMultipleOrTagsOrCombobox(props)) {
|
||||
|
@ -1626,6 +1561,7 @@ const Select = {
|
|||
// selectionProps.attrs.tabIndex = props.disabled ? -1 : props.tabIndex;
|
||||
//}
|
||||
const rootCls = {
|
||||
[className]: className,
|
||||
[prefixCls]: true,
|
||||
[`${prefixCls}-open`]: open,
|
||||
[`${prefixCls}-focused`]: open || !!this._focused,
|
||||
|
@ -1662,26 +1598,19 @@ const Select = {
|
|||
getPopupContainer={props.getPopupContainer}
|
||||
onMenuSelect={this.onMenuSelect}
|
||||
onMenuDeselect={this.onMenuDeselect}
|
||||
onPopupScroll={popupScroll}
|
||||
onPopupScroll={this.$attrs.onPopupScroll}
|
||||
onPopupFocus={this.onPopupFocus}
|
||||
onMouseenter={mouseenter}
|
||||
onMouseleave={mouseleave}
|
||||
onMouseenter={this.$attrs.onMouseenter}
|
||||
onMouseleave={this.$attrs.onMouseleave}
|
||||
showAction={props.showAction}
|
||||
menuItemSelectedIcon={getComponentFromProp(this, 'menuItemSelectedIcon')}
|
||||
menuItemSelectedIcon={getComponent(this, 'menuItemSelectedIcon')}
|
||||
ref={this.saveSelectTriggerRef}
|
||||
dropdownRender={props.dropdownRender}
|
||||
ariaId={this.$data._ariaId}
|
||||
>
|
||||
<div
|
||||
{...{
|
||||
directives: [
|
||||
{
|
||||
name: 'ant-ref',
|
||||
value: chaining(this.saveRootRef, this.saveSelectionRef),
|
||||
},
|
||||
],
|
||||
}}
|
||||
style={getStyle(this)}
|
||||
ref={chaining(this.saveRootRef, this.saveSelectionRef)}
|
||||
style={style}
|
||||
class={classnames(rootCls)}
|
||||
onMousedown={this.markMouseDown}
|
||||
onMouseup={this.markMouseLeave}
|
||||
|
@ -1693,7 +1622,7 @@ const Select = {
|
|||
onKeydown={isMultipleOrTagsOrCombobox(props) ? noop : this.onKeyDown}
|
||||
>
|
||||
<div {...selectionProps}>
|
||||
{ctrlNode}
|
||||
{this.renderTopControlNode()}
|
||||
{this.renderClear()}
|
||||
{this.renderArrow(!!multiple)}
|
||||
</div>
|
||||
|
@ -1703,4 +1632,4 @@ const Select = {
|
|||
},
|
||||
};
|
||||
export { Select };
|
||||
export default proxyComponent(Select);
|
||||
export default Select;
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
import {
|
||||
getPropsData,
|
||||
getSlotOptions,
|
||||
getKey,
|
||||
getAttrs,
|
||||
getComponentFromProp,
|
||||
} from '../_util/props-util';
|
||||
import { cloneVNodes } from '../_util/vnode';
|
||||
import { getPropsData, getSlotOptions, getKey, getComponent } from '../_util/props-util';
|
||||
import { cloneElement } from '../_util/vnode';
|
||||
|
||||
export function toTitle(title) {
|
||||
if (typeof title === 'string') {
|
||||
|
@ -24,8 +18,8 @@ export function getValuePropValue(child) {
|
|||
if (getKey(child) !== undefined) {
|
||||
return getKey(child);
|
||||
}
|
||||
if (getSlotOptions(child).isSelectOptGroup) {
|
||||
const label = getComponentFromProp(child, 'label');
|
||||
if (typeof child.type === 'object' && child.type.isSelectOptGroup) {
|
||||
const label = getComponent(child, 'label');
|
||||
if (label) {
|
||||
return label;
|
||||
}
|
||||
|
@ -39,8 +33,8 @@ export function getPropValue(child, prop) {
|
|||
}
|
||||
if (prop === 'children') {
|
||||
const newChild = child.$slots
|
||||
? cloneVNodes(child.$slots.default, true)
|
||||
: cloneVNodes(child.componentOptions.children, true);
|
||||
? cloneElement(child.$slots.default)
|
||||
: cloneElement(child.componentOptions.children);
|
||||
if (newChild.length === 1 && !newChild[0].tag) {
|
||||
return newChild[0].text;
|
||||
}
|
||||
|
@ -50,7 +44,7 @@ export function getPropValue(child, prop) {
|
|||
if (prop in data) {
|
||||
return data[prop];
|
||||
} else {
|
||||
return getAttrs(child)[prop];
|
||||
return child.props && child.props[prop];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,14 @@ import { inject, provide } from 'vue';
|
|||
import antRef from '../_util/ant-ref';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import contains from '../vc-util/Dom/contains';
|
||||
import { hasProp, getComponent, getEvents, filterEmpty, getSlot } from '../_util/props-util';
|
||||
import {
|
||||
hasProp,
|
||||
getComponent,
|
||||
getEvents,
|
||||
filterEmpty,
|
||||
getSlot,
|
||||
findDOMNode,
|
||||
} from '../_util/props-util';
|
||||
import { requestAnimationTimeout, cancelAnimationTimeout } from '../_util/requestAnimationTimeout';
|
||||
import addEventListener from '../vc-util/Dom/addEventListener';
|
||||
import warning from '../_util/warning';
|
||||
|
@ -324,7 +331,7 @@ export default {
|
|||
},
|
||||
|
||||
getRootDomNode() {
|
||||
return this.$refs.trigger.$el || this.$refs.trigger;
|
||||
return findDOMNode(this);
|
||||
},
|
||||
|
||||
handleGetPopupClassFromAlign(align) {
|
||||
|
@ -583,7 +590,6 @@ export default {
|
|||
this.childOriginEvents = getEvents(child);
|
||||
const newChildProps = {
|
||||
key: 'trigger',
|
||||
ref: 'trigger',
|
||||
};
|
||||
|
||||
if (this.isContextmenuToShow()) {
|
||||
|
|
Loading…
Reference in New Issue