javascript - Vue.js : How to use a computed property to modify string and apply dynamically as CSS class

标签 javascript vue.js vuejs2

我正在学习一个教程,我想添加一个新功能,将每个候选人的姓氏添加为一个类。我让它内联工作,但后来我想清理它,而是将其作为函数调用。

内联工作

mayor.name.replace(/ /g,'').replace('Mr.','').toLowerCase()

textClass 函数删除空格和“Mr.”。从字符串。我试过将其添加为计算属性,但我不知道如何在 mayor.name

上调用它

CSS

.black{ color: black;}
.brown{ color: brown;}
.pink{ color: pink;}
.red{ color: red;}

HTML

<div class="container">

  <div id="mayor-vote">
    <h2>Mayor Vote</h2>
    <ul class="list-group" style="width: 400px;">
      <li v-for="candidate in candidates" class="list-group-item clearfix">
        <div class="pull-left">
          <strong style="display: inline-block; width: 100px;">{{ candidate.name }}:</strong> {{ candidate.votes }}
        </div>
        <button class="btn btn-sm btn-primary pull-right" @click="candidate.votes++">Vote</button>
      </li>
    </ul>
    <h2>Our Mayor is <span class="the-winner" :class="mayor.name.textClass">{{ mayor.name }}</span></h2>
    <button @click="clear" class="btn btn-default">Reset Votes</button>
  </div>

</div>
</body>

JS

 new Vue({

  el: '#mayor-vote',

  data: {
    candidates: [
      { name: "Mr. Black", votes: 140 },
      { name: "Mr. Red", votes: 135 },
      { name: "Mr. Pink", votes: 145 },
      { name: "Mr. Brown", votes: 140 }
    ]
  },

  computed: {
    mayor: function(){
      var candidateSorted = this.candidates.sort(function(a,b){
        return b.votes - a.votes;
      });
      return candidateSorted[0];
    },
    textClass: function() {
      return this.replace(/ /g,'').replace('Mr.','').toLowerCase();
    }
  },

  methods: {
    clear: function() {
      this.candidates = this.candidates.map( function(candidate){
        candidate.votes = 0;
        return candidate;
      })
    }
  }
});

最佳答案

你的代码有几个错误,一个是dynamic class binding在 vue 中采用哈希对象,而不是字符串。因此,您必须从计算属性返回这样的散列:{ active: true }

第二件事是 computed property在 vue 中,总是修改另一个 vue 属性或从方法返回的值,要更正这些,您需要进行以下更改:

您必须在计算属性中使用 this.mayor.name 来计算动态类,如下所示:

  computed: {
    mayor: function(){
      var candidateSorted = this.candidates.sort(function(a,b){
        return b.votes - a.votes;
      });
      return candidateSorted[0];
    },
    textClass: function() {
      var tmp = {}
      tmp[this.mayor.name.replace(/ /g,'').replace('Mr.','').toLowerCase()] = true
      return tmp
    }
  },

并在 HTML 中像这样应用:

<h2>Our Mayor is <span class="the-winner" :class="textClass">{{ mayor.name }}</span></h2>

关于javascript - Vue.js : How to use a computed property to modify string and apply dynamically as CSS class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41030233/

相关文章:

javascript - 如何让一个函数去追踪一个元素

vue.js - 在不更改路由的情况下重新评估 Nuxt.js 中间件

javascript - 避免在 Nuxt VueJs 中直接改变 Prop

node.js - 无法使用 Vue CLI 3 要求 'fs'

Javascript - 在文件上传期间防止导航

javascript - Vue.js 推送不更新 View

vue.js - 使用现有 HTML 中的数据加载 Vue View 模型

JavaScript - 使用Assign从多个原型(prototype)继承函数?

javascript - 改进 Javascript Mandelbrot 绘图性能

javascript - Angular JS 多选选项添加额外的 ?选项