Как получить доступ к переменной внутри массива в Vue JS

Javascript и Vue для начинающих здесь. Пробуем примеры, чтобы изучить основные понятия.

<template>
  /*<p v-bind:class = "['bold', 'italic', isValid ? 'valid' : 'invalid']">*/

  <p v-bind:class = "classArray">
    Hello, {{name[0]}} {{name[1]}}
  </p>
</template>

<script>

export default {
  data() {
    return {     
      isValid: true,
      name: ['John','Doe'],
      classArray: ['bold', 'italic', isValid ? 'valid' : 'invalid']
      
    }
  }
}
</script>

<style>
  .bold    { font-weight: bolder }
  .italic  { font-style:  italic }
  .valid   { color: forestgreen  }
  .invalid { color: crimson      }
</style>

Приведенный выше код выдает следующую ошибку:

ОШИБКА [эслинт] /js/vue3/src/App.vue 16:38 ошибка isValid не определена no-undef

✖ 1 проблема (1 ошибка, 0 предупреждений)

Как мне получить доступ к «isValid» внутри classArray?

Вы не можете ссылаться на свойство объекта внутри инициализатора объекта. Это необходимо сделать после того, как объект будет завершен.

Pointy 05.07.2024 19:29

И даже если вы это исправите, так будет всегда true, потому что вы только что это инициализировали. Я предполагаю, что вы хотите classArray измениться при переназначении isValid. Вам нужно будет определить сеттер для isValid, который будет обновлять classArray.

Barmar 05.07.2024 19:30
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Определите classArray как геттер, который проверяет текущее значение isValid объекта.

export default {
  data() {
    return {     
      isValid: true,
      name: ['John','Doe'],
      get classArray() { return ['bold', 'italic', this.isValid ? 'valid' : 'invalid']; }
      
    }
  }
}

Геттер в data() — плохое предложение. Вы не найдете упоминания об этом в документации, и я не могу предсказать возможные последствия. Другой ответ правильный: для этого и нужны вычисления.

Estus Flask 05.07.2024 20:09

@EstusFlask Это более общее решение, не специфичное для vue.js, с которым я не знаком.

Barmar 05.07.2024 21:28
Ответ принят как подходящий

Вы можете использовать вычисляемое свойство для classArray, чтобы оно могло правильно ссылаться на isValid из данных компонента. Сделайте снимок

<template>
  <p v-bind:class = "classArray">
    Hello, {{ name[0] }} {{ name[1] }}
  </p>
</template>

<script>
export default {
  data() {
    return {     
      isValid: true,
      name: ['John', 'Doe']
    }
  },
  computed: {
    classArray() {
      return ['bold', 'italic', this.isValid ? 'valid' : 'invalid'];
    }
  }
}
</script>

<style>
  .bold    { font-weight: bolder }
  .italic  { font-style:  italic }
  .valid   { color: forestgreen  }
  .invalid { color: crimson      }
</style>

Спасибо. Это сработало. Научились новым способам достижения желаемого результата.

Venkat D 05.07.2024 20:04

@VenkatD Вот как это обычно делается, а не так, как предложено в принятом ответе.

Estus Flask 05.07.2024 20:10

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