diff --git a/components/timeline/Timeline.jsx b/components/timeline/Timeline.jsx index 42912f73a..5337f4cfb 100644 --- a/components/timeline/Timeline.jsx +++ b/components/timeline/Timeline.jsx @@ -1,3 +1,4 @@ +import { inject, cloneVNode } from 'vue'; import classNames from 'classnames'; import PropTypes from '../_util/vue-types'; import { @@ -5,10 +6,8 @@ import { getPropsData, initDefaultProps, filterEmpty, - getComponentFromProp, - getListeners, + getComponent, } from '../_util/props-util'; -import { cloneElement } from '../_util/vnode'; import TimelineItem from './TimelineItem'; import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined'; import { ConfigConsumerProps } from '../config-provider'; @@ -28,23 +27,26 @@ export default { reverse: false, mode: '', }), - inject: { - configProvider: { default: () => ConfigConsumerProps }, + setup() { + const configProvider = inject('configProvider', ConfigConsumerProps); + return { + configProvider, + }; }, render() { const { prefixCls: customizePrefixCls, reverse, mode, ...restProps } = getOptionProps(this); const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls('timeline', customizePrefixCls); - const pendingDot = getComponentFromProp(this, 'pendingDot'); - const pending = getComponentFromProp(this, 'pending'); + const pendingDot = getComponent(this, 'pendingDot'); + const pending = getComponent(this, 'pending'); const pendingNode = typeof pending === 'boolean' ? null : pending; const classString = classNames(prefixCls, { [`${prefixCls}-pending`]: !!pending, [`${prefixCls}-reverse`]: !!reverse, [`${prefixCls}-${mode}`]: !!mode, }); - const children = filterEmpty(this.$slots.default); + const children = filterEmpty(this.$slots.default && this.$slots.default()); // // Remove falsy items // const falsylessItems = filterEmpty(this.$slots.default) // const items = falsylessItems.map((item, idx) => { @@ -85,7 +87,7 @@ export default { const items = truthyItems.map((ele, idx) => { const pendingClass = idx === itemsCount - 2 ? lastCls : ''; const readyClass = idx === itemsCount - 1 ? lastCls : ''; - return cloneElement(ele, { + return cloneVNode(ele, { class: classNames([ !reverse && !!pending ? pendingClass : readyClass, getPositionCls(ele, idx), @@ -98,7 +100,6 @@ export default { ...restProps, }, class: classString, - on: getListeners(this), }; return ; }, diff --git a/components/timeline/TimelineItem.jsx b/components/timeline/TimelineItem.jsx index ed7f2006f..6bbba60c8 100644 --- a/components/timeline/TimelineItem.jsx +++ b/components/timeline/TimelineItem.jsx @@ -1,11 +1,7 @@ +import { inject } from 'vue'; import classNames from 'classnames'; import PropTypes from '../_util/vue-types'; -import { - getOptionProps, - initDefaultProps, - getComponentFromProp, - getListeners, -} from '../_util/props-util'; +import { getOptionProps, initDefaultProps, getComponent } from '../_util/props-util'; import { ConfigConsumerProps } from '../config-provider'; export const TimeLineItemProps = { @@ -22,15 +18,18 @@ export default { color: 'blue', pending: false, }), - inject: { - configProvider: { default: () => ConfigConsumerProps }, + setup() { + const configProvider = inject('configProvider', ConfigConsumerProps); + return { + configProvider, + }; }, render() { const { prefixCls: customizePrefixCls, color = '', pending } = getOptionProps(this); const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls('timeline', customizePrefixCls); - const dot = getComponentFromProp(this, 'dot'); + const dot = getComponent(this, 'dot'); const itemClassName = classNames({ [`${prefixCls}-item`]: true, [`${prefixCls}-item-pending`]: pending, @@ -43,7 +42,6 @@ export default { }); const liProps = { class: itemClassName, - on: getListeners(this), }; return (
  • @@ -54,7 +52,9 @@ export default { > {dot} -
    {this.$slots.default}
    +
    + {this.$slots.default && this.$slots.default()} +
  • ); }, diff --git a/components/timeline/index.jsx b/components/timeline/index.jsx index e65b3f3a5..5729d2fa1 100644 --- a/components/timeline/index.jsx +++ b/components/timeline/index.jsx @@ -8,10 +8,10 @@ export { TimeLineItemProps } from './TimelineItem'; Timeline.Item = TimelineItem; /* istanbul ignore next */ -Timeline.install = function(Vue) { - Vue.use(Base); - Vue.component(Timeline.name, Timeline); - Vue.component(TimelineItem.name, TimelineItem); +Timeline.install = function(app) { + app.use(Base); + app.component(Timeline.name, Timeline); + app.component(TimelineItem.name, TimelineItem); }; export default Timeline; diff --git a/examples/index.js b/examples/index.js index 91c12fc99..7673c2910 100644 --- a/examples/index.js +++ b/examples/index.js @@ -10,6 +10,7 @@ import ConfigProvider from 'ant-design-vue/config-provider'; import Result from 'ant-design-vue/result'; import Spin from 'ant-design-vue/spin'; import Empty from 'ant-design-vue/empty'; +import Timeline from 'ant-design-vue/timeline'; import 'ant-design-vue/style.js'; createApp(App) @@ -22,4 +23,5 @@ createApp(App) .use(Result) .use(Spin) .use(Empty) + .use(Timeline) .mount('#app');