Skip to content

Commit 3975cde

Browse files
authored
feat: update timeline (#2364)
* feat: update timeline * style: lower import path
1 parent 19e999a commit 3975cde

File tree

4 files changed

+28
-25
lines changed

4 files changed

+28
-25
lines changed

components/timeline/Timeline.jsx

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1+
import { inject, cloneVNode } from 'vue';
12
import classNames from 'classnames';
23
import PropTypes from '../_util/vue-types';
34
import {
45
getOptionProps,
56
getPropsData,
67
initDefaultProps,
78
filterEmpty,
8-
getComponentFromProp,
9-
getListeners,
9+
getComponent,
1010
} from '../_util/props-util';
11-
import { cloneElement } from '../_util/vnode';
1211
import TimelineItem from './TimelineItem';
1312
import LoadingOutlined from '@ant-design/icons-vue/LoadingOutlined';
1413
import { ConfigConsumerProps } from '../config-provider';
@@ -28,23 +27,26 @@ export default {
2827
reverse: false,
2928
mode: '',
3029
}),
31-
inject: {
32-
configProvider: { default: () => ConfigConsumerProps },
30+
setup() {
31+
const configProvider = inject('configProvider', ConfigConsumerProps);
32+
return {
33+
configProvider,
34+
};
3335
},
3436
render() {
3537
const { prefixCls: customizePrefixCls, reverse, mode, ...restProps } = getOptionProps(this);
3638
const getPrefixCls = this.configProvider.getPrefixCls;
3739
const prefixCls = getPrefixCls('timeline', customizePrefixCls);
3840

39-
const pendingDot = getComponentFromProp(this, 'pendingDot');
40-
const pending = getComponentFromProp(this, 'pending');
41+
const pendingDot = getComponent(this, 'pendingDot');
42+
const pending = getComponent(this, 'pending');
4143
const pendingNode = typeof pending === 'boolean' ? null : pending;
4244
const classString = classNames(prefixCls, {
4345
[`${prefixCls}-pending`]: !!pending,
4446
[`${prefixCls}-reverse`]: !!reverse,
4547
[`${prefixCls}-${mode}`]: !!mode,
4648
});
47-
const children = filterEmpty(this.$slots.default);
49+
const children = filterEmpty(this.$slots.default && this.$slots.default());
4850
// // Remove falsy items
4951
// const falsylessItems = filterEmpty(this.$slots.default)
5052
// const items = falsylessItems.map((item, idx) => {
@@ -85,7 +87,7 @@ export default {
8587
const items = truthyItems.map((ele, idx) => {
8688
const pendingClass = idx === itemsCount - 2 ? lastCls : '';
8789
const readyClass = idx === itemsCount - 1 ? lastCls : '';
88-
return cloneElement(ele, {
90+
return cloneVNode(ele, {
8991
class: classNames([
9092
!reverse && !!pending ? pendingClass : readyClass,
9193
getPositionCls(ele, idx),
@@ -98,7 +100,6 @@ export default {
98100
...restProps,
99101
},
100102
class: classString,
101-
on: getListeners(this),
102103
};
103104
return <ul {...timelineProps}>{items}</ul>;
104105
},

components/timeline/TimelineItem.jsx

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1+
import { inject } from 'vue';
12
import classNames from 'classnames';
23
import PropTypes from '../_util/vue-types';
3-
import {
4-
getOptionProps,
5-
initDefaultProps,
6-
getComponentFromProp,
7-
getListeners,
8-
} from '../_util/props-util';
4+
import { getOptionProps, initDefaultProps, getComponent } from '../_util/props-util';
95
import { ConfigConsumerProps } from '../config-provider';
106

117
export const TimeLineItemProps = {
@@ -22,15 +18,18 @@ export default {
2218
color: 'blue',
2319
pending: false,
2420
}),
25-
inject: {
26-
configProvider: { default: () => ConfigConsumerProps },
21+
setup() {
22+
const configProvider = inject('configProvider', ConfigConsumerProps);
23+
return {
24+
configProvider,
25+
};
2726
},
2827
render() {
2928
const { prefixCls: customizePrefixCls, color = '', pending } = getOptionProps(this);
3029
const getPrefixCls = this.configProvider.getPrefixCls;
3130
const prefixCls = getPrefixCls('timeline', customizePrefixCls);
3231

33-
const dot = getComponentFromProp(this, 'dot');
32+
const dot = getComponent(this, 'dot');
3433
const itemClassName = classNames({
3534
[`${prefixCls}-item`]: true,
3635
[`${prefixCls}-item-pending`]: pending,
@@ -43,7 +42,6 @@ export default {
4342
});
4443
const liProps = {
4544
class: itemClassName,
46-
on: getListeners(this),
4745
};
4846
return (
4947
<li {...liProps}>
@@ -54,7 +52,9 @@ export default {
5452
>
5553
{dot}
5654
</div>
57-
<div class={`${prefixCls}-item-content`}>{this.$slots.default}</div>
55+
<div class={`${prefixCls}-item-content`}>
56+
{this.$slots.default && this.$slots.default()}
57+
</div>
5858
</li>
5959
);
6060
},

components/timeline/index.jsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ export { TimeLineItemProps } from './TimelineItem';
88
Timeline.Item = TimelineItem;
99

1010
/* istanbul ignore next */
11-
Timeline.install = function(Vue) {
12-
Vue.use(Base);
13-
Vue.component(Timeline.name, Timeline);
14-
Vue.component(TimelineItem.name, TimelineItem);
11+
Timeline.install = function(app) {
12+
app.use(Base);
13+
app.component(Timeline.name, Timeline);
14+
app.component(TimelineItem.name, TimelineItem);
1515
};
1616

1717
export default Timeline;

examples/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import ConfigProvider from 'ant-design-vue/config-provider';
1010
import Result from 'ant-design-vue/result';
1111
import Spin from 'ant-design-vue/spin';
1212
import Empty from 'ant-design-vue/empty';
13+
import Timeline from 'ant-design-vue/timeline';
1314
import 'ant-design-vue/style.js';
1415

1516
createApp(App)
@@ -22,4 +23,5 @@ createApp(App)
2223
.use(Result)
2324
.use(Spin)
2425
.use(Empty)
26+
.use(Timeline)
2527
.mount('#app');

0 commit comments

Comments
 (0)