style: refactor vnode.js to ts

cssinjs
tangjinzhou 3 years ago
parent 414e7a1c56
commit 96f508104c

@ -1,8 +1,16 @@
import { filterEmpty } from './props-util'; import { filterEmpty } from './props-util';
import type { VNode, VNodeProps } from 'vue';
import { cloneVNode } from 'vue'; import { cloneVNode } from 'vue';
import warning from './warning'; import warning from './warning';
import type { RefObject } from './createRef';
export function cloneElement(vnode, nodeProps = {}, override = true, mergeRef = false) { export function cloneElement<T, U>(
vnode: VNode<T, U> | VNode<T, U>[],
nodeProps: Record<string, any> &
Omit<VNodeProps, 'ref'> & { ref?: VNodeProps['ref'] | RefObject } = {},
override = true,
mergeRef = false,
): VNode<T, U> {
let ele = vnode; let ele = vnode;
if (Array.isArray(vnode)) { if (Array.isArray(vnode)) {
ele = filterEmpty(vnode)[0]; ele = filterEmpty(vnode)[0];
@ -10,10 +18,10 @@ export function cloneElement(vnode, nodeProps = {}, override = true, mergeRef =
if (!ele) { if (!ele) {
return null; return null;
} }
const node = cloneVNode(ele, nodeProps, mergeRef); const node = cloneVNode(ele as VNode<T, U>, nodeProps as any, mergeRef);
// cloneVNode内部是合并属性这里改成覆盖属性 // cloneVNode内部是合并属性这里改成覆盖属性
node.props = override ? { ...node.props, ...nodeProps } : node.props; node.props = (override ? { ...node.props, ...nodeProps } : node.props) as any;
warning(typeof node.props.class !== 'object', 'class must be string'); warning(typeof node.props.class !== 'object', 'class must be string');
return node; return node;
} }

@ -1,5 +1,5 @@
import type { Key } from '../../_util/type'; import type { Key } from '../../_util/type';
import type { ExtractPropTypes, PropType } from 'vue'; import type { ExtractPropTypes, PropType, VNode } from 'vue';
import { computed, defineComponent, ref, inject, watchEffect, watch, onMounted, unref } from 'vue'; import { computed, defineComponent, ref, inject, watchEffect, watch, onMounted, unref } from 'vue';
import shallowEqual from '../../_util/shallowequal'; import shallowEqual from '../../_util/shallowequal';
import type { StoreMenuInfo } from './hooks/useMenuContext'; import type { StoreMenuInfo } from './hooks/useMenuContext';
@ -357,7 +357,7 @@ export default defineComponent({
let icon = props.expandIcon || slots.expandIcon; let icon = props.expandIcon || slots.expandIcon;
icon = typeof icon === 'function' ? icon(opt) : icon; icon = typeof icon === 'function' ? icon(opt) : icon;
return cloneElement( return cloneElement(
icon, icon as unknown as VNode,
{ {
class: `${prefixCls.value}-submenu-expand-icon`, class: `${prefixCls.value}-submenu-expand-icon`,
}, },

@ -6,7 +6,7 @@ import type {
InternalFieldNames, InternalFieldNames,
} from '../Cascader'; } from '../Cascader';
import { toPathKey } from '../utils/commonUtil'; import { toPathKey } from '../utils/commonUtil';
import type { Ref } from 'vue'; import type { Ref, VNode } from 'vue';
import { computed } from 'vue'; import { computed } from 'vue';
import { isValidElement } from '../../_util/props-util'; import { isValidElement } from '../../_util/props-util';
import { cloneElement } from '../../_util/vnode'; import { cloneElement } from '../../_util/vnode';
@ -32,7 +32,9 @@ export default (
// If exist non-string value, use VueNode instead // If exist non-string value, use VueNode instead
return mergedLabels.reduce((list, label, index) => { return mergedLabels.reduce((list, label, index) => {
const keyedLabel = isValidElement(label) ? cloneElement(label, { key: index }) : label; const keyedLabel = isValidElement(label)
? cloneElement(label as unknown as VNode, { key: index })
: label;
if (index === 0) { if (index === 0) {
return [keyedLabel]; return [keyedLabel];

@ -7,7 +7,7 @@ import type { SharedTimeProps } from '.';
import { setTime as utilSetTime } from '../../utils/timeUtil'; import { setTime as utilSetTime } from '../../utils/timeUtil';
import { cloneElement } from '../../../_util/vnode'; import { cloneElement } from '../../../_util/vnode';
import type { VueNode } from '../../../_util/type'; import type { VueNode } from '../../../_util/type';
import type { Ref } from 'vue'; import type { Ref, VNode } from 'vue';
import { onBeforeUpdate, ref, watchEffect, computed, defineComponent } from 'vue'; import { onBeforeUpdate, ref, watchEffect, computed, defineComponent } from 'vue';
function generateUnits( function generateUnits(
@ -245,7 +245,7 @@ const TimeBody = defineComponent({
) { ) {
if (condition !== false) { if (condition !== false) {
columns.push({ columns.push({
node: cloneElement(node, { node: cloneElement(node as unknown as VNode, {
prefixCls: columnPrefixCls, prefixCls: columnPrefixCls,
value: columnValue, value: columnValue,
active: activeColumnIndex === columns.length, active: activeColumnIndex === columns.length,

@ -175,29 +175,4 @@ const Input = defineComponent({
}, },
}); });
// Input.props = {
// inputRef: PropTypes.any,
// prefixCls: PropTypes.string,
// id: PropTypes.string,
// inputElement: PropTypes.any,
// disabled: PropTypes.looseBool,
// autofocus: PropTypes.looseBool,
// autocomplete: PropTypes.string,
// editable: PropTypes.looseBool,
// accessibilityIndex: PropTypes.number,
// value: PropTypes.string,
// open: PropTypes.looseBool,
// tabindex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
// /** Pass accessibility props to input */
// attrs: PropTypes.object,
// onKeydown: PropTypes.func,
// onMousedown: PropTypes.func,
// onChange: PropTypes.func,
// onPaste: PropTypes.func,
// onCompositionstart: PropTypes.func,
// onCompositionend: PropTypes.func,
// onFocus: PropTypes.func,
// onBlur: PropTypes.func,
// };
export default Input; export default Input;

Loading…
Cancel
Save