taro-ui-vue3
Version:
Taro UI Rewritten in Vue 3.0
81 lines (80 loc) • 2.49 kB
JavaScript
import {h, defineComponent, computed, mergeProps} from "vue";
import {Text, View} from "@tarojs/components";
const AtSteps = defineComponent({
name: "AtSteps",
props: {
current: {
type: Number,
default: 0
},
items: {
type: Array,
default: []
},
onChange: {
type: Function,
default: () => (current, event) => {
}
}
},
setup(props, {attrs, slots}) {
const stepItemClass = computed(() => (i) => ({
"at-steps__item": true,
"at-steps__item--active": i === props.current,
"at-steps__item--inactive": i !== props.current
}));
const itemStatusClass = computed(() => (item) => ({
"at-icon": true,
"at-steps__single-icon": true,
"at-icon-check-circle": item.status === "success",
"at-icon-close-circle": item.status === "error",
"at-steps__single-icon--success": item.status === "success",
"at-steps__single-icon--error": item.status === "error"
}));
const itemIconClass = computed(() => (item) => ({
"at-icon": true,
[`at-icon-${item.icon.value}`]: item.icon.value,
"at-steps__circle-icon": true
}));
function handleClick(current, event) {
props.onChange(current, event);
}
return () => h(View, mergeProps(attrs, {
class: "at-steps"
}), {
default: () => !!props.items && props.items.map((item, i) => h(View, {
key: item.title,
class: stepItemClass.value(i),
onTap: handleClick.bind(this, i)
}, {
default: () => [
h(View, {
class: "at-steps__circular-wrap"
}, {
default: () => [
i !== 0 && h(View, {class: "at-steps__left-line"}),
item.status ? h(View, {class: itemStatusClass.value(item)}) : h(View, {
class: "at-steps__circular"
}, {
default: () => [
item.icon ? h(Text, {class: itemIconClass.value(item)}) : h(Text, {class: "at-steps__num"}, {default: () => i + 1})
]
}),
i !== props.items.length - 1 && h(View, {class: "at-steps__right-line"})
]
}),
h(View, {
class: "at-steps__title"
}, {default: () => item.title}),
h(View, {
class: "at-steps__desc"
}, {default: () => item.desc})
]
}))
});
}
});
var steps_default = AtSteps;
export {
steps_default as default
};