fix: page-header onBack not work

pull/2682/head
tanjinzhou 2020-08-03 11:41:42 +08:00
parent c758d88aba
commit bb39dc31f5
6 changed files with 34 additions and 28 deletions

@ -1 +1 @@
Subproject commit a66b25f72f00c17b976c30b6cb92db4d8c8bf993 Subproject commit 14ab398a9ab7db3507776aa9905afe5b4811be21

View File

@ -54,7 +54,7 @@ const TransButton = {
}, },
render() { render() {
const { noStyle } = this.$props; const { noStyle, onClick } = this.$props;
return ( return (
<div <div
@ -62,6 +62,7 @@ const TransButton = {
tabindex={0} tabindex={0}
ref="div" ref="div"
{...this.$attrs} {...this.$attrs}
onClick={onClick}
onKeydown={this.onKeyDown} onKeydown={this.onKeyDown}
onKeyup={this.onKeyUp} onKeyup={this.onKeyUp}
style={{ ...(!noStyle ? inlineStyle : null) }} style={{ ...(!noStyle ? inlineStyle : null) }}

View File

@ -3,21 +3,34 @@
exports[`PageHeader pageHeader should not render blank dom 1`] = ` exports[`PageHeader pageHeader should not render blank dom 1`] = `
<div <div
class="ant-page-header ant-page-header-ghost" class="ant-page-header ant-page-header-ghost"
/> >
<!---->
<!---->
<!---->
<!---->
</div>
`; `;
exports[`PageHeader pageHeader should support class 1`] = ` exports[`PageHeader pageHeader should support class 1`] = `
<div <div
class="ant-page-header ant-page-header-ghost not-works" class="ant-page-header ant-page-header-ghost not-works"
> >
<!---->
<div <div
class="ant-page-header-heading" class="ant-page-header-heading"
> >
<!---->
<!---->
<span <span
class="ant-page-header-heading-title" class="ant-page-header-heading-title"
> >
Page Title Page Title
</span> </span>
<!---->
<!---->
<!---->
</div> </div>
<!---->
<!---->
</div> </div>
`; `;

View File

@ -1,8 +1,5 @@
import { createLocalVue, mount } from '@vue/test-utils'; import { mount } from '@vue/test-utils';
import PageHeader from '..'; import PageHeader from '..';
import ref from 'vue-ref';
const localVue = createLocalVue();
localVue.use(ref, { name: 'ant-ref' });
describe('PageHeader', () => { describe('PageHeader', () => {
it('pageHeader should not contain back it back', () => { it('pageHeader should not contain back it back', () => {
@ -22,7 +19,7 @@ describe('PageHeader', () => {
]; ];
const wrapper = mount({ const wrapper = mount({
render() { render() {
return <PageHeader title="Page Title" breadcrumb={{ props: { routes } }} />; return <PageHeader title="Page Title" breadcrumb={{ routes }} />;
}, },
}); });
expect(wrapper.findAll('.ant-page-header-back')).toHaveLength(0); expect(wrapper.findAll('.ant-page-header-back')).toHaveLength(0);
@ -37,7 +34,7 @@ describe('PageHeader', () => {
]; ];
const wrapper = mount({ const wrapper = mount({
render() { render() {
return <PageHeader title="Page Title" breadcrumb={{ props: { routes } }} />; return <PageHeader title="Page Title" breadcrumb={{ routes }} />;
}, },
}); });
expect(wrapper.findAll('.ant-breadcrumb')).toHaveLength(1); expect(wrapper.findAll('.ant-breadcrumb')).toHaveLength(1);
@ -61,7 +58,7 @@ describe('PageHeader', () => {
return <PageHeader title="Page Title" onBack={callback} />; return <PageHeader title="Page Title" onBack={callback} />;
}, },
}, },
{ localVue }, { sync: false },
); );
expect(wrapper.findAll('.ant-page-header-back')).toHaveLength(1); expect(wrapper.findAll('.ant-page-header-back')).toHaveLength(1);
}); });
@ -74,7 +71,7 @@ describe('PageHeader', () => {
return <PageHeader title="Page Title" onBack={callback} />; return <PageHeader title="Page Title" onBack={callback} />;
}, },
}, },
{ localVue }, { sync: false },
); );
wrapper.find('div.ant-page-header-back-button').trigger('click'); wrapper.find('div.ant-page-header-back-button').trigger('click');
expect(callback).toHaveBeenCalled(); expect(callback).toHaveBeenCalled();
@ -115,19 +112,16 @@ describe('PageHeader', () => {
]; ];
const wrapper = mount({ const wrapper = mount({
render() { render() {
return <PageHeader title="Title" breadcrumb={{ props: { routes } }} />; return <PageHeader title="Title" breadcrumb={{ routes }} />;
}, },
}); });
expect(wrapper.findAll('.ant-breadcrumb')).toHaveLength(1); expect(wrapper.findAll('.ant-breadcrumb')).toHaveLength(1);
const wrapperBack = mount( const wrapperBack = mount({
{ render() {
render() { return <PageHeader title="Title" breadcrumb={{ routes }} onBack={() => {}} />;
return <PageHeader title="Title" breadcrumb={{ props: { routes } }} onBack={() => {}} />;
},
}, },
{ localVue }, });
);
expect(wrapperBack.findAll('.ant-breadcrumb')).toHaveLength(1); expect(wrapperBack.findAll('.ant-breadcrumb')).toHaveLength(1);
}); });
}); });

View File

@ -1,6 +1,6 @@
import { inject } from 'vue'; import { inject } from 'vue';
import PropTypes from '../_util/vue-types'; import PropTypes from '../_util/vue-types';
import { getComponent, getOptionProps } from '../_util/props-util'; import { getComponent, getOptionProps, getSlot } from '../_util/props-util';
import { ConfigConsumerProps } from '../config-provider'; import { ConfigConsumerProps } from '../config-provider';
import ArrowLeftOutlined from '@ant-design/icons-vue/ArrowLeftOutlined'; import ArrowLeftOutlined from '@ant-design/icons-vue/ArrowLeftOutlined';
import Breadcrumb from '../breadcrumb'; import Breadcrumb from '../breadcrumb';
@ -19,6 +19,7 @@ export const PageHeaderProps = {
extra: PropTypes.any, extra: PropTypes.any,
avatar: PropTypes.object, avatar: PropTypes.object,
ghost: PropTypes.bool, ghost: PropTypes.bool,
onBack: PropTypes.func,
}; };
const renderBack = (instance, prefixCls, backIcon, onBack) => { const renderBack = (instance, prefixCls, backIcon, onBack) => {
@ -61,7 +62,7 @@ const renderTitle = (prefixCls, instance) => {
) : ( ) : (
<ArrowLeftOutlined /> <ArrowLeftOutlined />
); );
const onBack = instance.$attrs.onBack; const onBack = instance.onBack;
const headingPrefixCls = `${prefixCls}-heading`; const headingPrefixCls = `${prefixCls}-heading`;
if (title || subTitle || tags || extra) { if (title || subTitle || tags || extra) {
const backIconDom = renderBack(instance, prefixCls, backIcon, onBack); const backIconDom = renderBack(instance, prefixCls, backIcon, onBack);
@ -103,7 +104,7 @@ const PageHeader = {
const props = getOptionProps(this); const props = getOptionProps(this);
const { prefixCls: customizePrefixCls, breadcrumb } = props; const { prefixCls: customizePrefixCls, breadcrumb } = props;
const footer = getComponent(this, 'footer'); const footer = getComponent(this, 'footer');
const children = this.$slots.default && this.$slots.default(); const children = getSlot(this);
let ghost = true; let ghost = true;
// Use `ghost` from `props` or from `ConfigProvider` instead. // Use `ghost` from `props` or from `ConfigProvider` instead.
@ -113,10 +114,7 @@ const PageHeader = {
ghost = pageHeader.ghost; ghost = pageHeader.ghost;
} }
const prefixCls = getPrefixCls('page-header', customizePrefixCls); const prefixCls = getPrefixCls('page-header', customizePrefixCls);
const breadcrumbDom = const breadcrumbDom = breadcrumb && breadcrumb.routes ? renderBreadcrumb(breadcrumb) : null;
breadcrumb && breadcrumb.props && breadcrumb.props.routes
? renderBreadcrumb(breadcrumb)
: null;
const className = [ const className = [
prefixCls, prefixCls,
{ {
@ -130,7 +128,7 @@ const PageHeader = {
<div class={className}> <div class={className}>
{breadcrumbDom} {breadcrumbDom}
{renderTitle(prefixCls, this)} {renderTitle(prefixCls, this)}
{children && children.length && renderChildren(prefixCls, children)} {children.length ? renderChildren(prefixCls, children) : null}
{renderFooter(prefixCls, footer)} {renderFooter(prefixCls, footer)}
</div> </div>
); );

View File

@ -4,7 +4,7 @@
</div> </div>
</template> </template>
<script> <script>
import demo from '../antdv-demo/docs/notification/demo/index'; import demo from '../antdv-demo/docs/page-header/demo/index';
export default { export default {
components: { components: {