1+
2+ <script lang="tsx">
3+ import { ref , defineComponent , computed , PropType , reactive , h , Slot } from ' vue'
4+ import { AvatarSize , AvatarShape , AvatarFit } from ' ./type'
5+ export default defineComponent ({
6+ name: ' ElAvatar' ,
7+
8+ props: {
9+ size: {
10+ type: [Number , String ] as PropType <AvatarSize >,
11+ validator : (val : number | string ): boolean => {
12+ if (typeof val === ' string' ) {
13+ return [' large' , ' medium' , ' small' ].includes (val )
14+ }
15+ return typeof val === ' number'
16+ }
17+ },
18+ shape: {
19+ type: String as PropType <AvatarShape >,
20+ default: ' circle' ,
21+ validator : (val : string ): boolean => {
22+ return [' circle' , ' square' ].includes (val )
23+ },
24+ },
25+ icon: String ,
26+ src: String ,
27+ alt: String ,
28+ srcSet: String ,
29+ error: Function ,
30+ fit: {
31+ type: String ,
32+ default: ' cover'
33+ }
34+ },
35+
36+ setup(props , cxt ) {
37+ const isImageExist = ref (true )
38+
39+ const avatarClass = computed (() => {
40+ const { size, icon, shape } = props
41+ let classList = [' el-avatar' ]
42+
43+ if (size && typeof size === ' string' ) {
44+ classList .push (` el-avatar--${size } ` )
45+ }
46+
47+ if (icon ) {
48+ classList .push (' el-avatar--icon' )
49+ }
50+
51+ if (shape ) {
52+ classList .push (` el-avatar--${shape } ` )
53+ }
54+ console .log (classList )
55+ return classList .join (' ' )
56+ })
57+
58+ const handleError = () => {
59+ const { error } = props
60+ const errorFlag = error ? error () : undefined
61+ if (errorFlag !== false ) {
62+ isImageExist .value = false
63+ }
64+ }
65+
66+ const renderAvatar = () => {
67+ const { icon, src, alt, srcSet, fit } = props
68+ if (isImageExist .value && src ) {
69+ return h (' img' , {
70+ src ,
71+ alt ,
72+ style: {
73+ ' object-fit' : fit ,
74+ },
75+ srcSet ,
76+ onError: handleError ,
77+ })
78+ }
79+
80+ if (icon ) {
81+ return h (' i' , { class: icon })
82+ }
83+ const slot = cxt .slots .default as Slot
84+ return slot ? slot () : ' '
85+ }
86+
87+ return () => {
88+ const { size } = props
89+ const sizeStyle =
90+ typeof size === ' number'
91+ ? {
92+ height: ` ${size }px ` ,
93+ width: ` ${size }px ` ,
94+ lineHeight: ` ${size }px ` ,
95+ }
96+ : {}
97+ return (
98+ <span class = { avatarClass .value } style = { sizeStyle } >
99+ {
100+ renderAvatar ()
101+ }
102+ </span >
103+ )
104+ }
105+ }
106+ })
107+ </script >
108+ <style lang="scss">
109+ @import ' theme/avatar.scss' ;
110+ </style >
0 commit comments