refactor: result

pull/4134/head
tanjinzhou 2021-05-26 18:55:32 +08:00
parent 42916f50f5
commit 3b89f59094
4 changed files with 74 additions and 37 deletions

View File

@ -1,8 +1,6 @@
import { App, defineComponent, inject, VNodeTypes, Plugin } from 'vue'; import { App, defineComponent, VNodeTypes, Plugin, ExtractPropTypes, computed } from 'vue';
import PropTypes from '../_util/vue-types'; import PropTypes from '../_util/vue-types';
import { tuple } from '../_util/type'; import { tuple } from '../_util/type';
import { getComponent } from '../_util/props-util';
import { defaultConfigProvider } from '../config-provider';
import CheckCircleFilled from '@ant-design/icons-vue/CheckCircleFilled'; import CheckCircleFilled from '@ant-design/icons-vue/CheckCircleFilled';
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled'; import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
import ExclamationCircleFilled from '@ant-design/icons-vue/ExclamationCircleFilled'; import ExclamationCircleFilled from '@ant-design/icons-vue/ExclamationCircleFilled';
@ -10,6 +8,8 @@ import WarningFilled from '@ant-design/icons-vue/WarningFilled';
import noFound from './noFound'; import noFound from './noFound';
import serverError from './serverError'; import serverError from './serverError';
import unauthorized from './unauthorized'; import unauthorized from './unauthorized';
import useConfigInject from '../_util/hooks/useConfigInject';
import classNames from '../_util/classNames';
export const IconMap = { export const IconMap = {
success: CheckCircleFilled, success: CheckCircleFilled,
@ -27,7 +27,7 @@ export const ExceptionMap = {
// ExceptionImageMap keys // ExceptionImageMap keys
const ExceptionStatus = Object.keys(ExceptionMap); const ExceptionStatus = Object.keys(ExceptionMap);
export const ResultProps = { export const resultProps = {
prefixCls: PropTypes.string, prefixCls: PropTypes.string,
icon: PropTypes.any, icon: PropTypes.any,
status: PropTypes.oneOf(tuple('success', 'error', 'info', 'warning', '404', '403', '500')).def( status: PropTypes.oneOf(tuple('success', 'error', 'info', 'warning', '404', '403', '500')).def(
@ -38,6 +38,8 @@ export const ResultProps = {
extra: PropTypes.any, extra: PropTypes.any,
}; };
export type ResultProps = Partial<ExtractPropTypes<typeof resultProps>>;
const renderIcon = (prefixCls: string, { status, icon }) => { const renderIcon = (prefixCls: string, { status, icon }) => {
if (ExceptionStatus.includes(`${status}`)) { if (ExceptionStatus.includes(`${status}`)) {
const SVGComponent = ExceptionMap[status]; const SVGComponent = ExceptionMap[status];
@ -57,31 +59,31 @@ const renderExtra = (prefixCls: string, extra: VNodeTypes) =>
const Result = defineComponent({ const Result = defineComponent({
name: 'AResult', name: 'AResult',
props: ResultProps, props: resultProps,
setup() { slots: ['title', 'subTitle', 'icon', 'extra'],
return { setup(props, { slots }) {
configProvider: inject('configProvider', defaultConfigProvider), const { prefixCls, direction } = useConfigInject('result', props);
}; const className = computed(() =>
}, classNames(prefixCls.value, `${prefixCls.value}-${props.status}`, {
render() { [`${prefixCls.value}-rtl`]: direction.value === 'rtl',
const { prefixCls: customizePrefixCls, status } = this; }),
const getPrefixCls = this.configProvider.getPrefixCls; );
const prefixCls = getPrefixCls('result', customizePrefixCls); return () => {
const title = props.title ?? slots.title?.();
const title = getComponent(this, 'title'); const subTitle = props.subTitle ?? slots.subTitle?.();
const subTitle = getComponent(this, 'subTitle'); const icon = props.icon ?? slots.icon?.();
const icon = getComponent(this, 'icon'); const extra = props.extra ?? slots.extra?.();
const extra = getComponent(this, 'extra'); const pre = prefixCls.value;
return ( return (
<div class={`${prefixCls} ${prefixCls}-${status}`}> <div class={className.value}>
{renderIcon(prefixCls, { status, icon })} {renderIcon(pre, { status: props.status, icon })}
<div class={`${prefixCls}-title`}>{title}</div> <div class={`${pre}-title`}>{title}</div>
{subTitle && <div class={`${prefixCls}-subtitle`}>{subTitle}</div>} {subTitle && <div class={`${pre}-subtitle`}>{subTitle}</div>}
{this.$slots.default && <div class={`${prefixCls}-content`}>{this.$slots.default()}</div>} {renderExtra(pre, extra)}
{renderExtra(prefixCls, extra)} {slots.default && <div class={`${pre}-content`}>{slots.default()}</div>}
</div> </div>
); );
};
}, },
}); });

View File

@ -6,19 +6,19 @@
.@{result-prefix-cls} { .@{result-prefix-cls} {
padding: 48px 32px; padding: 48px 32px;
// status color // status color
&-success &-icon > .anticon { &-success &-icon > .@{iconfont-css-prefix} {
color: @success-color; color: @success-color;
} }
&-error &-icon > .anticon { &-error &-icon > .@{iconfont-css-prefix} {
color: @error-color; color: @error-color;
} }
&-info &-icon > .anticon { &-info &-icon > .@{iconfont-css-prefix} {
color: @info-color; color: @info-color;
} }
&-warning &-icon > .anticon { &-warning &-icon > .@{iconfont-css-prefix} {
color: @warning-color; color: @warning-color;
} }
@ -33,30 +33,31 @@
margin-bottom: 24px; margin-bottom: 24px;
text-align: center; text-align: center;
> .anticon { > .@{iconfont-css-prefix} {
font-size: 72px; font-size: @result-icon-font-size;
} }
} }
&-title { &-title {
color: @heading-color; color: @heading-color;
font-size: 24px; font-size: @result-title-font-size;
line-height: 1.8; line-height: 1.8;
text-align: center; text-align: center;
} }
&-subtitle { &-subtitle {
color: @text-color-secondary; color: @text-color-secondary;
font-size: 14px; font-size: @result-subtitle-font-size;
line-height: 1.6; line-height: 1.6;
text-align: center; text-align: center;
} }
&-extra { &-extra {
margin-top: 32px; margin: @result-extra-margin;
text-align: center; text-align: center;
> * { > * {
margin-right: 8px; margin-right: 8px;
&:last-child { &:last-child {
margin-right: 0; margin-right: 0;
} }
@ -69,3 +70,5 @@
background-color: @background-color-light; background-color: @background-color-light;
} }
} }
@import './rtl';

View File

@ -0,0 +1,25 @@
@import '../../style/themes/default';
@import '../../style/mixins/index';
@result-prefix-cls: ~'@{ant-prefix}-result';
.@{result-prefix-cls} {
&-rtl {
direction: rtl;
}
&-extra {
> * {
.@{result-prefix-cls}-rtl & {
margin-right: 0;
margin-left: 8px;
}
&:last-child {
.@{result-prefix-cls}-rtl & {
margin-left: 0;
}
}
}
}
}

View File

@ -835,3 +835,10 @@
@notification-bg: @component-background; @notification-bg: @component-background;
@notification-padding-vertical: 16px; @notification-padding-vertical: 16px;
@notification-padding-horizontal: 24px; @notification-padding-horizontal: 24px;
// Result
// ---
@result-title-font-size: 24px;
@result-subtitle-font-size: @font-size-base;
@result-icon-font-size: 72px;
@result-extra-margin: 24px 0 0 0;