Бывают случаи, когда вам приходится повторно использовать шаблон внутри компонента. Вы не можете повторить их, потому что они не отображаются последовательно. Рассмотрим следующий пример:
<template>
<div>
<template>
<span>{{yearly.text}}</span>
<span :class="spanClassName(yearly.increase)"><i :class="iconClassName"></i>{{yearly.increase}}%</span>
</template>
<YearlyChart/>
<template>
<span>{{monthly.text}}</span>
<span :class="spanClassName(monthly.increase)"><i :class="iconClassName"></i>{{monthly.increase}}%</span>
</template>
<MonthlyTable/>
<template>
<span>{{weekly.text}}</span>
<span :class="spanClassName(weekly.increase)"><i :class="iconClassName"></i>{{weekly.increase}}%</span>
</template>
</div>
</template>
<script>
data() {
return {
yearly: {
text: "Yearly Sales",
increase: 5
},
monthly: {
text: "Monthly Sales Dropping",
increase: -7.2
},
weekly: {
text: "Awesome Weekly Sales!",
increase: 0.2
}
}
},
methods: {
spanClassName: function(increase) {
increase >= 0 ? 'text-success' : 'text-danger'
},
iconClassName: function(increase) {
increase >= 0 ? 'fa fa-arrow-up' : 'fa fa-arrow-down'
}
}
</script>
Я не хочу экспортировать этот крошечный шаблон (состоящий из двух span
тегов) как другой компонент, потому что я считаю, что он не очень эффективен. В React это можно сделать очень просто:
const renderIncrease = (stat) => (
<span>{stat.text}</span>
<span className={this.spanClassName(stat)}><i className={this.iconClassName(stat)}>{stat.increase}</i></span>
)
render() {
return (
<>
{renderIncrease(this.state.yearly)}
// .. some other elements
{renderIncrease(this.state.monthly)}
</>
)
}
Angular может сделать это тоже, потому что у него есть переменная ссылки на шаблон (#).
Имеет ли Vue. js похожую функцию?