taro-ui-vue3
Version:
Taro UI Rewritten in Vue 3.0
163 lines (162 loc) • 5.38 kB
JavaScript
import {h, defineComponent, mergeProps, computed} from "vue";
import {View, Image, Switch} from "@tarojs/components";
import {mergeStyle} from "../../utils/common";
const AtListItem = defineComponent({
props: {
note: {type: String, default: ""},
title: {type: String, default: ""},
thumb: {type: String, default: ""},
extraText: {type: String, default: ""},
extraThumb: {type: String, default: ""},
switchColor: {type: String, default: "#6190E8"},
disabled: {type: Boolean, default: false},
isSwitch: {type: Boolean, default: false},
switchIsCheck: {type: Boolean, default: false},
hasBorder: {type: Boolean, default: false},
iconInfo: {
type: Object,
default: () => ({value: ""})
},
arrow: {
type: String,
default: "",
validator: (prop) => ["up", "down", "right", ""].includes(prop)
},
onClick: Function,
onSwitchChange: Function
},
setup(props, {attrs}) {
const rootClasses = computed(() => ({
"at-list__item": true,
"at-list__item--thumb": props.thumb,
"at-list__item--multiple": props.note,
"at-list__item--disabled": props.disabled,
"at-list__item--no-border": !props.hasBorder
}));
const iconClasses = computed(() => ({
[`${props.iconInfo.prefixClass || "at-icon"}`]: true,
[`${props.iconInfo.prefixClass || "at-icon"}-${props.iconInfo.value}`]: Boolean(props.iconInfo.value),
[`${props.iconInfo.class}`]: Boolean(props.iconInfo.class)
}));
const iconStyle = computed(() => mergeStyle({
color: props.iconInfo.color || "",
fontSize: `${props.iconInfo.size || 24}px`
}, props.iconInfo.style));
const arrowClasses = computed(() => ({
"at-icon": Boolean(props.arrow),
"item-extra__icon-arrow": Boolean(props.arrow),
[`at-icon-chevron-${props.arrow}`]: Boolean(props.arrow)
}));
function handleClick(e) {
if (typeof props.onClick === "function" && !props.disabled) {
props.onClick(e);
}
}
function handleSwitchClick(e) {
e.stopPropagation();
}
function handleSwitchChange(e) {
if (typeof props.onSwitchChange === "function" && !props.disabled) {
props.onSwitchChange(e);
}
}
return () => h(View, mergeProps(attrs, {
class: rootClasses.value,
onTap: handleClick
}), {
default: () => [
h(View, {
class: "at-list__item-container"
}, {
default: () => [
props.thumb && h(View, {
class: "at-list__item-thumb item-thumb"
}, {
default: () => [
h(Image, {
class: "item-thumb__info",
mode: "scaleToFill",
src: props.thumb
})
]
}),
props.iconInfo.value && h(View, {
class: "at-list__item-icon item-icon"
}, {
default: () => [
h(View, {
class: iconClasses.value,
style: iconStyle.value
})
]
}),
h(View, {
class: "at-list__item-content item-content"
}, {
default: () => [
h(View, {
class: "item-content__info"
}, {
default: () => [
h(View, {
class: "item-content__info-title"
}, {default: () => props.title}),
props.note && h(View, {
class: "item-content__info-note"
}, {default: () => props.note})
]
})
]
}),
h(View, {
class: "at-list__item-extra item-extra"
}, {
default: () => [
props.extraText && h(View, {
class: "item-extra__info"
}, {default: () => props.extraText}),
props.extraThumb && !props.extraText && h(View, {
class: "item-extra__image"
}, {
default: () => [
h(Image, {
class: "item-extra__image-info",
mode: "aspectFit",
src: props.extraThumb
})
]
}),
props.isSwitch && !props.extraThumb && !props.extraText && h(View, {
class: "item-extra__switch",
onTap: handleSwitchClick
}, {
default: () => [
h(Switch, {
color: props.switchColor,
disabled: props.disabled,
checked: props.switchIsCheck,
onChange: handleSwitchChange
})
]
}),
props.arrow && h(View, {
class: "item-extra__icon"
}, {
default: () => [
h(View, {
class: arrowClasses.value
})
]
})
]
})
]
})
]
});
}
});
var item_default = AtListItem;
export {
item_default as default
};