在 Vue 中显示基于 prop 的条件文本的其他方法?
Other ways of showing prop-based conditonal text in Vue?
我有一个根据用户成员身份呈现文本的组件,我想根据该道具值更改内插文本。除了带有 v-if
或 v-show
的一堆 divs/p 标签之外,是否有更有效的方式根据道具显示不同的文本?
不断有一堆堆叠的 div 只是一大堆文字。
如有任何建议,我们将不胜感激!
干杯!
<script lang="ts" setup>
import { PropType } from 'vue'
const props = defineProps({
kind: {
type: String as PropType<'subscribed' | 'unsubscribed'>,
default: 'subscribed',
},
planId: {
type: String as PropType<'standard' | 'silver' | 'gold' | 'platinum' | 'diamond' | 'no plan'>,
default: 'standard',
},
})
</script>
<template>
<div class="c-promotion-plan-card" data-cy="component-promotion-plan-card">
<div class="flex items-baseline mb-sm">
<div v-if="planId === 'standard'" class="text-h6 text-dark">Standard Gang</div>
<div v-if="planId === 'silver'" class="text-h6 text-dark">Silver Foxes</div>
<div v-if="planId === 'gold'" class="text-h6 text-dark">Golden Girls</div>
<div v-if="planId === 'platinum'" class="text-h6 text-dark">Platinum Boys</div>
<div v-if="planId === 'diamond'" class="text-h6 text-dark">Diamond Dudes</div>
<div v-if="planId === 'no plan'" class="text-h6 text-dark">
No Plan Posse
</div>
</div>
</div>
</template>
是的,有更好的方法。
您可以定义一个计算 属性 之类的
Vue2 语法
computed: {
getLabel() {
// Assuming that 'planId' is the dependency prop
if(this.planId === 'standard') return 'Standard Gang';
else if(this.planId === 'silver') return 'Silver Foxes';
....
return 'No Plan Posse' // For 'no plan' condition
}
Vue3 语法
setup(props) {
// 1.getLabel depends on firstName,lastName.
const getLabel = computed(() => {
// Assuming that 'planId' is the dependency prop
if(props.planId === 'standard') return 'Standard Gang';
else if(props.planId === 'silver') return 'Silver Foxes';
....
return 'No Plan Posse' // For 'no plan' condition
});
return {
getLabel,
};
},
然后在你的模板中调用这个在插值内计算的方法,比如
<div class="text-h6 text-dark">{{getLabel}}</div>
可能类似于以下代码片段(映射您的计划并使用计算 属性 ):
const { ref, computed } = Vue
const app = Vue.createApp({
props: {
kind: {
type: String,
default: 'subscribed',
},
planId: {
type: String,
default: 'standard',
},
},
setup(props) {
const plans = ref([{plan:'standard', name: 'Standard Gang'}, {plan:'silver', name: 'Silver Foxes'}, {plan:'gold', name: 'Golden Girls'}, {plan:'platinum', name: 'Platinum Boys'}, {plan:'diamond', name: 'Diamond Dudes'}, {plan: 'no plan', name: 'No Plan Posse'}])
const handlePlan = computed(() => plans.value.find(p => p.plan === props.planId))
return { plans, handlePlan }
},
})
app.mount('#demo')
.style-class {
color: red;
font-size: 2em;
}
.other-style {
color: blue;
}
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="demo">
<div class="c-promotion-plan-card" data-cy="component-promotion-plan-card">
<div class="flex items-baseline mb-sm">
<div class="text-h6 text-dark" :class="handlePlan.plan === 'standard' ? 'style-class' : 'other-style'">{{ handlePlan.name }}</div>
</div>
</div>
</div>
我有一个根据用户成员身份呈现文本的组件,我想根据该道具值更改内插文本。除了带有 v-if
或 v-show
的一堆 divs/p 标签之外,是否有更有效的方式根据道具显示不同的文本?
不断有一堆堆叠的 div 只是一大堆文字。
如有任何建议,我们将不胜感激!
干杯!
<script lang="ts" setup>
import { PropType } from 'vue'
const props = defineProps({
kind: {
type: String as PropType<'subscribed' | 'unsubscribed'>,
default: 'subscribed',
},
planId: {
type: String as PropType<'standard' | 'silver' | 'gold' | 'platinum' | 'diamond' | 'no plan'>,
default: 'standard',
},
})
</script>
<template>
<div class="c-promotion-plan-card" data-cy="component-promotion-plan-card">
<div class="flex items-baseline mb-sm">
<div v-if="planId === 'standard'" class="text-h6 text-dark">Standard Gang</div>
<div v-if="planId === 'silver'" class="text-h6 text-dark">Silver Foxes</div>
<div v-if="planId === 'gold'" class="text-h6 text-dark">Golden Girls</div>
<div v-if="planId === 'platinum'" class="text-h6 text-dark">Platinum Boys</div>
<div v-if="planId === 'diamond'" class="text-h6 text-dark">Diamond Dudes</div>
<div v-if="planId === 'no plan'" class="text-h6 text-dark">
No Plan Posse
</div>
</div>
</div>
</template>
是的,有更好的方法。 您可以定义一个计算 属性 之类的 Vue2 语法
computed: {
getLabel() {
// Assuming that 'planId' is the dependency prop
if(this.planId === 'standard') return 'Standard Gang';
else if(this.planId === 'silver') return 'Silver Foxes';
....
return 'No Plan Posse' // For 'no plan' condition
}
Vue3 语法
setup(props) {
// 1.getLabel depends on firstName,lastName.
const getLabel = computed(() => {
// Assuming that 'planId' is the dependency prop
if(props.planId === 'standard') return 'Standard Gang';
else if(props.planId === 'silver') return 'Silver Foxes';
....
return 'No Plan Posse' // For 'no plan' condition
});
return {
getLabel,
};
},
然后在你的模板中调用这个在插值内计算的方法,比如
<div class="text-h6 text-dark">{{getLabel}}</div>
可能类似于以下代码片段(映射您的计划并使用计算 属性 ):
const { ref, computed } = Vue
const app = Vue.createApp({
props: {
kind: {
type: String,
default: 'subscribed',
},
planId: {
type: String,
default: 'standard',
},
},
setup(props) {
const plans = ref([{plan:'standard', name: 'Standard Gang'}, {plan:'silver', name: 'Silver Foxes'}, {plan:'gold', name: 'Golden Girls'}, {plan:'platinum', name: 'Platinum Boys'}, {plan:'diamond', name: 'Diamond Dudes'}, {plan: 'no plan', name: 'No Plan Posse'}])
const handlePlan = computed(() => plans.value.find(p => p.plan === props.planId))
return { plans, handlePlan }
},
})
app.mount('#demo')
.style-class {
color: red;
font-size: 2em;
}
.other-style {
color: blue;
}
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="demo">
<div class="c-promotion-plan-card" data-cy="component-promotion-plan-card">
<div class="flex items-baseline mb-sm">
<div class="text-h6 text-dark" :class="handlePlan.plan === 'standard' ? 'style-class' : 'other-style'">{{ handlePlan.name }}</div>
</div>
</div>
</div>