diff --git a/packages/vant/src/empty/Empty.tsx b/packages/vant/src/empty/Empty.tsx index e61fb69df..695cdf1df 100644 --- a/packages/vant/src/empty/Empty.tsx +++ b/packages/vant/src/empty/Empty.tsx @@ -1,26 +1,14 @@ -import { defineComponent, PropType, type ExtractPropTypes } from 'vue'; +import { defineComponent, type PropType, type ExtractPropTypes } from 'vue'; +import { useId } from '../composables/use-id'; import { Numeric, getSizeStyle, makeStringProp, createNamespace, } from '../utils'; -import { - renderError, - renderSearch, - renderNetwork, - renderMaterial, -} from './Images'; const [name, bem] = createNamespace('empty'); -const PRESET_IMAGES: Record JSX.Element> = { - error: renderError, - search: renderSearch, - network: renderNetwork, - default: renderMaterial, -}; - const emptyProps = { image: makeStringProp('default'), imageSize: [Number, String, Array] as PropType, @@ -35,13 +23,6 @@ export default defineComponent({ props: emptyProps, setup(props, { slots }) { - const renderImage = () => { - if (slots.image) { - return slots.image(); - } - return PRESET_IMAGES[props.image]?.() || ; - }; - const renderDescription = () => { const description = slots.description ? slots.description() @@ -58,6 +39,259 @@ export default defineComponent({ } }; + const baseId = useId(); + const getId = (num: number | string) => `${baseId}-${num}`; + const getUrlById = (num: number | string) => `url(#${getId(num)})`; + + const renderStop = (color: string, offset: number, opacity?: number) => ( + + ); + + const renderStops = (fromColor: string, toColor: string) => [ + renderStop(fromColor, 0), + renderStop(toColor, 100), + ]; + + const renderShadow = (id: string) => [ + + + {renderStop('#EBEDF0', 0)} + {renderStop('#F2F3F5', 100, 0.3)} + + , + , + ]; + + const renderBuilding = () => [ + + + {renderStop('#FFF', 0, 0.5)} + {renderStop('#F2F3F5', 100)} + + , + + + + , + ]; + + const renderCloud = () => [ + + + {renderStop('#F2F3F5', 0, 0.3)} + {renderStop('#F2F3F5', 100)} + + , + + + + , + ]; + + const renderNetwork = () => ( + + + + {renderStop('#FFF', 0, 0.5)} + {renderStop('#F2F3F5', 100)} + + + {renderStop('#EBEDF0', 0)} + {renderStop('#DCDEE0', 100, 0)} + + + {renderStops('#EAEDF0', '#DCDEE0')} + + + {renderStop('#EBEDF0', 0)} + {renderStop('#FFF', 100, 0)} + + + + {renderBuilding()} + + + + + + + + + + + + + + + + ); + + const renderMaterial = () => ( + + + + {renderStops('#F2F3F5', '#DCDEE0')} + + + {renderStops('#EAEDF1', '#DCDEE0')} + + + {renderStops('#EAEDF1', '#DCDEE0')} + + + {renderBuilding()} + {renderCloud()} + + + + + + + + + + + + + + + + ); + + const renderError = () => ( + + + + {renderStops('#EAEDF1', '#DCDEE0')} + + + {renderBuilding()} + {renderCloud()} + {renderShadow('c')} + + + ); + + const renderSearch = () => ( + + + + {renderStops('#EEE', '#D8D8D8')} + + + {renderStops('#F2F3F5', '#DCDEE0')} + + + {renderStops('#F2F3F5', '#DCDEE0')} + + + {renderStops('#FFF', '#F7F8FA')} + + + {renderBuilding()} + {renderCloud()} + {renderShadow('d')} + + + + + + + + + ); + + const renderImage = () => { + if (slots.image) { + return slots.image(); + } + + const PRESET_IMAGES: Record JSX.Element> = { + error: renderError, + search: renderSearch, + network: renderNetwork, + default: renderMaterial, + }; + + return PRESET_IMAGES[props.image]?.() || ; + }; + return () => (
diff --git a/packages/vant/src/empty/Images.tsx b/packages/vant/src/empty/Images.tsx deleted file mode 100644 index 8b360e060..000000000 --- a/packages/vant/src/empty/Images.tsx +++ /dev/null @@ -1,203 +0,0 @@ -const getId = (num: number | string) => `van-empty-${num}`; -const useId = (num: number | string) => `url(#${getId(num)})`; - -const renderStop = (color: string, offset: number, opacity?: number) => ( - -); - -const renderStops = (fromColor: string, toColor: string) => [ - renderStop(fromColor, 0), - renderStop(toColor, 100), -]; - -const renderShadow = (id: string) => [ - - - {renderStop('#EBEDF0', 0)} - {renderStop('#F2F3F5', 100, 0.3)} - - , - , -]; - -const renderBuilding = () => [ - - - {renderStop('#FFF', 0, 0.5)} - {renderStop('#F2F3F5', 100)} - - , - - - - , -]; - -const renderCloud = () => [ - - - {renderStop('#F2F3F5', 0, 0.3)} - {renderStop('#F2F3F5', 100)} - - , - - - - , -]; - -export const renderNetwork = () => ( - - - - {renderStop('#FFF', 0, 0.5)} - {renderStop('#F2F3F5', 100)} - - - {renderStop('#EBEDF0', 0)} - {renderStop('#DCDEE0', 100, 0)} - - - {renderStops('#EAEDF0', '#DCDEE0')} - - - {renderStop('#EBEDF0', 0)} - {renderStop('#FFF', 100, 0)} - - - - {renderBuilding()} - - - - - - - - - - - - - - - -); - -export const renderMaterial = () => ( - - - - {renderStops('#F2F3F5', '#DCDEE0')} - - - {renderStops('#EAEDF1', '#DCDEE0')} - - - {renderStops('#EAEDF1', '#DCDEE0')} - - - {renderBuilding()} - {renderCloud()} - - - - - - - - - - - - - - - -); - -export const renderError = () => ( - - - - {renderStops('#EAEDF1', '#DCDEE0')} - - - {renderBuilding()} - {renderCloud()} - {renderShadow('c')} - - -); - -export const renderSearch = () => ( - - - - {renderStops('#EEE', '#D8D8D8')} - - - {renderStops('#F2F3F5', '#DCDEE0')} - - - {renderStops('#F2F3F5', '#DCDEE0')} - - - {renderStops('#FFF', '#F7F8FA')} - - - {renderBuilding()} - {renderCloud()} - {renderShadow('d')} - - - - - - - - -);