diff --git a/components/breadcrumb/Breadcrumb.jsx b/components/breadcrumb/Breadcrumb.jsx index 9cdd6dd46..ce4ada19f 100644 --- a/components/breadcrumb/Breadcrumb.jsx +++ b/components/breadcrumb/Breadcrumb.jsx @@ -1,6 +1,6 @@ +import { inject, cloneVNode } from 'vue'; import PropTypes from '../_util/vue-types'; -import { cloneElement } from '../_util/vnode'; -import { filterEmpty, getComponentFromProp, getSlotOptions } from '../_util/props-util'; +import { filterEmpty, getComponent, getSlotOptions, getSlot } from '../_util/props-util'; import warning from '../_util/warning'; import { ConfigConsumerProps } from '../config-provider'; import BreadcrumbItem from './BreadcrumbItem'; @@ -35,8 +35,10 @@ function getBreadcrumbName(route, params) { export default { name: 'ABreadcrumb', props: BreadcrumbProps, - inject: { - configProvider: { default: () => ConfigConsumerProps }, + setup() { + return { + configProvider: inject('configProvider', ConfigConsumerProps), + }; }, methods: { defaultItemRender({ route, params, routes, paths }) { @@ -103,13 +105,13 @@ export default { }, render() { let crumbs; - const { prefixCls: customizePrefixCls, routes, params = {}, $slots, $scopedSlots } = this; + const { prefixCls: customizePrefixCls, routes, params = {}, $slots } = this; const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); - const children = filterEmpty($slots.default); - const separator = getComponentFromProp(this, 'separator'); - const itemRender = this.itemRender || $scopedSlots.itemRender || this.defaultItemRender; + const children = filterEmpty(getSlot(this)); + const separator = getComponent(this, 'separator'); + const itemRender = this.itemRender || $slots.itemRender || this.defaultItemRender; if (routes && routes.length > 0) { // generated by route crumbs = this.genForRoutes({ @@ -126,10 +128,7 @@ export default { 'Breadcrumb', "Only accepts Breadcrumb.Item and Breadcrumb.Separator as it's children", ); - return cloneElement(element, { - props: { separator }, - key: index, - }); + return cloneVNode(element, { separator, key: index }); }); } return
{crumbs}
; diff --git a/components/breadcrumb/BreadcrumbItem.jsx b/components/breadcrumb/BreadcrumbItem.jsx index e8f91fa19..7e9887beb 100644 --- a/components/breadcrumb/BreadcrumbItem.jsx +++ b/components/breadcrumb/BreadcrumbItem.jsx @@ -1,5 +1,6 @@ +import { inject } from 'vue'; import PropTypes from '../_util/vue-types'; -import { hasProp, getComponentFromProp } from '../_util/props-util'; +import { hasProp, getComponent } from '../_util/props-util'; import { ConfigConsumerProps } from '../config-provider'; import DropDown from '../dropdown/dropdown'; import DownOutlined from '@ant-design/icons-vue/DownOutlined'; @@ -13,8 +14,10 @@ export default { separator: PropTypes.any.def('/'), overlay: PropTypes.any, }, - inject: { - configProvider: { default: () => ConfigConsumerProps }, + setup() { + return { + configProvider: inject('configProvider', ConfigConsumerProps), + }; }, methods: { /** @@ -22,7 +25,7 @@ export default { * Wrap a DropDown */ renderBreadcrumbNode(breadcrumbItem, prefixCls) { - const overlay = getComponentFromProp(this, 'overlay'); + const overlay = getComponent(this, 'overlay'); if (overlay) { return ( @@ -40,8 +43,8 @@ export default { const { prefixCls: customizePrefixCls, $slots } = this; const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); - const separator = getComponentFromProp(this, 'separator'); - const children = $slots.default; + const separator = getComponent(this, 'separator'); + const children = $slots.default && $slots.default(); let link; if (hasProp(this, 'href')) { link = {children}; diff --git a/components/breadcrumb/BreadcrumbSeparator.jsx b/components/breadcrumb/BreadcrumbSeparator.jsx index 09f0b2c6f..681a7f5e0 100644 --- a/components/breadcrumb/BreadcrumbSeparator.jsx +++ b/components/breadcrumb/BreadcrumbSeparator.jsx @@ -1,3 +1,4 @@ +import { inject } from 'vue'; import { ConfigConsumerProps } from '../config-provider'; import PropTypes from '../_util/vue-types'; @@ -7,15 +8,17 @@ export default { props: { prefixCls: PropTypes.string, }, - inject: { - configProvider: { default: () => ConfigConsumerProps }, + setup() { + return { + configProvider: inject('configProvider', ConfigConsumerProps), + }; }, render() { const { prefixCls: customizePrefixCls, $slots } = this; const getPrefixCls = this.configProvider.getPrefixCls; const prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); - const children = $slots.default; + const children = $slots.default && $slots.default(); return {children || '/'}; }, }; diff --git a/components/breadcrumb/index.js b/components/breadcrumb/index.js index f740b2def..e6cbb7beb 100644 --- a/components/breadcrumb/index.js +++ b/components/breadcrumb/index.js @@ -1,17 +1,15 @@ import Breadcrumb from './Breadcrumb'; import BreadcrumbItem from './BreadcrumbItem'; import BreadcrumbSeparator from './BreadcrumbSeparator'; -import Base from '../base'; Breadcrumb.Item = BreadcrumbItem; Breadcrumb.Separator = BreadcrumbSeparator; /* istanbul ignore next */ -Breadcrumb.install = function(Vue) { - Vue.use(Base); - Vue.component(Breadcrumb.name, Breadcrumb); - Vue.component(BreadcrumbItem.name, BreadcrumbItem); - Vue.component(BreadcrumbSeparator.name, BreadcrumbSeparator); +Breadcrumb.install = function(app) { + app.component(Breadcrumb.name, Breadcrumb); + app.component(BreadcrumbItem.name, BreadcrumbItem); + app.component(BreadcrumbSeparator.name, BreadcrumbSeparator); }; export default Breadcrumb; diff --git a/examples/index.js b/examples/index.js index c52b52116..411e1b710 100644 --- a/examples/index.js +++ b/examples/index.js @@ -2,6 +2,7 @@ import '@babel/polyfill'; import { createApp } from 'vue'; import App from './App.vue'; import Avatar from 'ant-design-vue/avatar'; +import Breadcrumb from 'ant-design-vue/breadcrumb'; import Button from 'ant-design-vue/button'; import Comment from 'ant-design-vue/comment'; import Drawer from 'ant-design-vue/drawer'; @@ -20,6 +21,7 @@ import 'ant-design-vue/style.js'; createApp(App) .use(Avatar) + .use(Breadcrumb) .use(Button) .use(Comment) .use(ConfigProvider)