Другие способы отображения условного текста на основе реквизита в Vue?

У меня есть компонент, который отображает текст на основе статуса членства пользователей, и я хочу изменить интерполированный текст на основе этого значения реквизита. Есть ли более эффективный способ отображения другого текста на основе реквизита, кроме набора тегов div/p с v-if или v-show?

Это просто тонна текста, чтобы постоянно иметь кучу сложенных друг в друга 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, есть лучший подход. Вы можете определить вычисляемое свойство, например Синтаксис 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>

Спасибо за ответ! Вычисляемые свойства кажутся здесь отличной идеей, и мне, вероятно, следовало бы начать с этого, но как только в дело вступают стили переменных, я по какой-то причине отказался от идеи о них. Как бы вы поступили со стилем тогда? Используя привязку класса, например, :class = "${planId === 'standard'? 'стиль-класс' : 'другой стиль' }`" ?

LovelyAndy 14.05.2022 18:37

Опять же, для обработки стилей вы можете сделать что-то вроде :class = "getClass", где getClass будет вычисляемым свойством.

AYK 14.05.2022 18:40
Ответ принят как подходящий

Может быть, что-то вроде следующего фрагмента (сопоставьте свои планы и используйте вычисляемое свойство):

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>

Спасибо за ответ! Как бы вы тогда обработали переменную стилизацию таким образом? Привязка класса на основе planId или вычисляемой опоры?

LovelyAndy 14.05.2022 18:38

@LovelyAndy, приятель, можешь привести пример? Вы имеете в виду стилизовать план в зависимости от planId? Кстати, я переписал свой ответ на Composition API

Nikola Pavicevic 14.05.2022 18:47

Да, допустим, у вас есть опция «нет плана», и вы хотите, чтобы ваша карточка или текст были фиолетовыми и, возможно, более крупным шрифтом и, возможно, даже другим родственным div с подтекстом, который снова имеет свой собственный стиль. В то время как другие могут быть одинаковыми по всем направлениям, просто с другим текстом-заполнителем. Просто еще один уровень сложности, с которым я не думал, что вычисляемые реквизиты действительно справятся.

LovelyAndy 14.05.2022 18:54

Хорошо, вы можете использовать вычисление и просто сравнить handlePlan.plan Я обновил свой ответ, посмотрите, пожалуйста

Nikola Pavicevic 14.05.2022 18:57

Потрясающие! Спасибо за помощь. Интересно, вы думаете, что это лучше, чем иметь кучу условных операторов в вашем шаблоне? Кажется почти таким же подробным/много настроек, что и в разделе вашего скрипта. Просто любопытны ваши предпочтения здесь :)

LovelyAndy 14.05.2022 19:06

Добро пожаловать. Я предпочитаю делать это в сценарии и оставлять шаблон как можно более чистым :)

Nikola Pavicevic 14.05.2022 19:09

Полностью понял! Спасибо за помощь в этом довольно простом вопросе

LovelyAndy 14.05.2022 19:21

Другие вопросы по теме