import { computed } from 'vue'; // Utils import { createNamespace } from '../utils'; import { BORDER } from '../utils/constant'; import { STEPS_KEY, StepsProvide } from '../steps'; // Composition import { useParent } from '@vant/use'; // Components import Icon from '../icon'; const [createComponent, bem] = createNamespace('step'); export default createComponent({ setup(props, { slots }) { const { parent, index } = useParent(STEPS_KEY); if (!parent) { if (process.env.NODE_ENV !== 'production') { console.error('[Vant] must be a child component of .'); } return; } const parentProps = parent.props; const getStatus = () => { const active = +parentProps.active; if (index.value < active) { return 'finish'; } return index.value === active ? 'process' : 'waiting'; }; const isActive = () => getStatus() === 'process'; const lineStyle = computed(() => ({ background: getStatus() === 'finish' ? parentProps.activeColor : parentProps.inactiveColor, })); const titleStyle = computed(() => { if (isActive()) { return { color: parentProps.activeColor }; } if (!getStatus()) { return { color: parentProps.inactiveColor }; } }); const onClickStep = () => { parent.onClickStep(index.value); }; const renderCircle = () => { const { finishIcon, activeIcon, activeColor, inactiveIcon } = parentProps; if (isActive()) { if (slots['active-icon']) { return slots['active-icon'](); } return ( ); } if (getStatus() === 'finish' && finishIcon) { return ( ); } if (slots['inactive-icon']) { return slots['inactive-icon'](); } if (inactiveIcon) { return ; } return ; }; return () => { const status = getStatus(); return (
{slots.default?.()}
{renderCircle()}
); }; }, });