часть текста в объекте списка в Vuejs - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь разными способами стилизовать часть объекта данных, используя свойство computed, watch и method в vuejs. Я до сих пор понятия не имею, что я могу сделать, чтобы просто произнести «здоровое» слово в пределах «Это здорово!» Строка в другой стиль.

<template>
   <div='container'>
      <div v-for="item in food">
        {{ item }}
      </div>
   </div>
</template>
<script>
  export default{
   data(){
     return{
        food: [
           { name: 'fish', message: 'It is great!'},
           { name: 'carrot', message: 'It is healthy!'},
        ],
      }
   }
}
</script>

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Вот рабочий пример использования методов для разделения каждого сообщения и определения, должно ли оно быть выделено:

<template>
  <div class="container">
    <div v-for="(value, name) in food" :key="name">
      <span v-for="(word, index) in words(value)" :key="index">
        <span v-if="isHealthy(word)" class="healthy">{{ word }} </span>
        <span v-else>{{ word }} </span>
      </span>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      food: { fish: 'It is great!', carrot: 'It is healthy!' },
    };
  },
  methods: {
    words(string) {
      return string.split(/\s+/);
    },
    isHealthy(string) {
      return /healthy/i.test(string);
    },
  },
};
</script>

<style scoped>
.healthy {
  color: red;
}
</style>

Вышеприведенный пример демонстрирует простой способ сделать это - вы можете найти угловые случаи, когда это не удается. Вы можете представить более сложную версию words, которая извлекает список подстрок как со словом «здоровый», так и без него. Это привело бы к более поверхностной структуре HTML.

1 голос
/ 19 июня 2019

По сути вам нужно добавить какой-то класс идентификации на слово «здоровый». Для этого необходимо изменить исходные данные food. Вы можете использовать computed для генерации новых highlightedFood данных, которые заменяют «здоровые» на <span class="highlight">healthy</span>. Вы можете просто стилизовать то, что вы хотите в теге style.

<template>
  <div id="app">
    <div v-for="(item, index) in highlightedFood" :key="index">
      <div v-html="item"></div>
    </div>
  </div>
</template>

<script>
export default {
  name: "App",
  data() {
    return {
      food: [
        { name: "fish", message: "It is great!" },
        { name: "carrot", message: "It is healthy!" }
      ]
    };
  },
  computed: {
    highlightedFood() {
      return this.food.map(item => {
        return {
          name: item.name,
          message: item.message.replace(
            "healthy",
            "<span class='highlight'>healthy</span>"
          )
        };
      });
    }
  }
};
</script>

<style>
.highlight {
  color: green;
}
</style>

Обратите внимание, что если вы используете CSS с областью действия, вам придется использовать глубокий комбинатор:

<style scoped>
#app >>> .highlight {
  color: green;
}
</style>

Подробнее о глубоких селекторах: https://vue -loader.vuejs.org / guide / scoped-css.html # deep-selectors

1 голос
/ 19 июня 2019

Я создал CodePen пример:

Codepen

HTML:

<div id="app">
  <div>
    <div v-for="(value, name) in food" v-key="name">
      {{ name }}: <span v-html="isHealthy(value)"></span>
    </div>
  </div>
</div>

CSS:

.healthy {
  color: green;
  font-weight: 700;
}

JS:

new Vue({
  el: "#app",
  data: () => ({
    food: { fish: 'It is great!', carrot: 'It is healthy!' }
  }),
  methods: {
    isHealthy(str) {
      if(str.includes("healthy")) {
        return str.replace("healthy", "<span class='healthy'>healthy</span>");
      }
      return str;
    }
  }
});

...