:class 没有调用 vue 中的计算属性(计算属性没有被调用)

Posted

技术标签:

【中文标题】:class 没有调用 vue 中的计算属性(计算属性没有被调用)【英文标题】::class is not calling the computed property in vue (The computed property is not being called) 【发布时间】:2021-12-17 16:55:37 【问题描述】:

代码:-

     <!--:class="changeCalmarColor" is not working-->
<div :class="changeCalmarColor" class="content" >
 
      <div
        v-if="props.currency"
        :class="[
          'font-bold',
           'text-3xl': props.largeValue, 'text-center': props.center ,
        ]"
      >
         $options.methods.format(props.value) 
      </div>
      <div
        v-else-if="props.millifyOnly"
        :class="[
          'font-bold',
           'text-3xl': props.largeValue, 'text-center': props.center ,
        ]"
      >
         $options.methods.millifyNumber(props.value) 
      </div>
      <div
        v-else
        :class="[
          'font-bold',
           'text-3xl': props.largeValue, 'text-center': props.center ,
        ]"
      >
         props.value 
      </div>
    </div>
 
<script>
import millify from "millify";

export default 
  name: "StatCard",
  props: 
    type: 
      type: String,
      default: "normal",
    ,
    icon: 
      type: String,
    ,
    iconPack: 
      type: String,
      default: "",
    ,
    title: 
      type: String,
      required: true,
    ,
    value: 
      type: [String, Number],
      required: true,
    ,
    currency: 
      type: Boolean,
    ,
    millifyOnly: 
      type: Boolean,
    ,
    largeValue: 
      type: Boolean,
      default: true,
    ,
    center: 
      type: Boolean,
      default: true,
    ,
  ,
  methods: 
    format(val) 
      let millifiedVal = "";
      if (!isNaN(parseFloat(val))) 
        if (parseInt(val).toString().length > 3)
          millifiedVal = millify(val,  precision: 2 );
        else millifiedVal = parseFloat(val).toFixed(2);
        if (millifiedVal.charAt(0) === "-") return `-$$millifiedVal.slice(1)`;
        else return `$$millifiedVal`;
      
      return val;
    ,
    millifyNumber(val) 
      return !isNaN(parseFloat(val)) ? millify(val,  precision: 2 ) : val;
    ,
  ,
  computed: 
    changeCalmarColor() 
      console.log("/////VALUE AND TITLE////", this.props.title, this.props.title);
      if(this.props.title == "Calmar Ratio") 
        if(this.props.value < 1 || this.props.value == null) 
          return "text-danger";
         else if(1 <= this.props.value && this.props.value <= 3.00)   
          return "text-yellow";
         else if(1 <= this.props.value && this.props.value > 3.00) 
          return "text-green"; 
        
      
    ,
  ,
;
</script>

这里:class="changeCalmarColor" 行不工作,计算的属性永远不会被调用。绑定类不起作用。我不知道为什么它没有被调用,我已经明确定义了它。我认为:class="changeCalmarColor" 是将计算属性与类绑定的正确方法。我不明白我到底在做什么错。

我什至尝试显示我的计算属性,如&lt;p&gt;HELLP props.title changeCalmarColor&lt;/p&gt;,但它从未被调用。我在控制台中看不到它。

【问题讨论】:

【参考方案1】:

计算属性被缓存,See docs

所以changeCalmarColor 运行一次,然后等待依赖关系发生变化以便再次运行。

它不运行的原因是因为你使用了this.props.title,而你应该使用this.title

所以这个:

    changeCalmarColor() 
      console.log("/////VALUE AND TITLE////", this.props.title, this.props.title);
      if(this.props.title == "Calmar Ratio") 
        if(this.props.value < 1 || this.props.value == null) 
          return "text-danger";
         else if(1 <= this.props.value && this.props.value <= 3.00)   
          return "text-yellow";
         else if(1 <= this.props.value && this.props.value > 3.00) 
          return "text-green"; 
        
      
    ,

应改为:

    changeCalmarColor() 
      if(this.title == "Calmar Ratio") 
        if(this.value < 1 || this.value == null) 
          return "text-danger";
         else if(1 <= this.value && this.value <= 3.00)   
          return "text-yellow";
         else if(1 <= this.value && this.value > 3.00) 
          return "text-green"; 
        
      
    ,

【讨论】:

【参考方案2】:

要访问道具,您应该直接使用this.propName。您可以将计算的道具更改为:

changeCalmarColor() 
      console.log("/////VALUE AND TITLE////", this.title, this.title);
      if(this.title == "Calmar Ratio") 
        if(this.value < 1 || this.value == null) 
          return "text-danger";
         else if(1 <= this.value && this.value <= 3.00)   
          return "text-yellow";
         else if(1 <= this.value && this.value > 3.00) 
          return "text-green"; 
        
      
    

【讨论】:

什么都没有发生,伙计。我删除了第二个类属性并更新了changeCalmarColor() 我编辑了我的答案,再次检查并告诉我 拥有多个类属性其实没问题,只要一个有v-bind:。对不起! 我使用了propName,但没有任何反应,没有错误。我已经编辑了我的问题,计算的属性没有被调用,我不知道为什么它没有被调用 您拥有的所有props. 都应该被删除(也在模板中),不会调用计算的道具,因为它们无效。也请参阅其他答案。

以上是关于:class 没有调用 vue 中的计算属性(计算属性没有被调用)的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js计算属性不更新

1 vue 关键字解释

Vue.js 修改计算属性?

vue的计算属性 是怎么关联某个数据

Vue 对象中的计算值函数被触发

Vue 中的计算属性不会触发监视