vue3.0计算属性_vue的计算属性和方法有什么区别

vue3.0计算属性_vue的计算属性和方法有什么区别前言一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:<divid="example&quot

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

一般情况下属性都是放到data中的,但是有些属性可能是需要经过一些逻辑计算后才能得出来,那么我们可以把这类属性变成计算属性。比如以下:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中的多处包含此翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性。
 

基础例子

<div id="app">
  <h2>总价格:{{totalPrice}}</h2>
</div>
<script>
  const vm = new Vue({
    el: "#app",
    data: {
      message: "hello",
      books: [
        {name: '三国演义', price: 30},
        {name: '红楼梦', price: 40},
        {name: '西游记', price: 50},
        {name: '水浒传', price: 60},
      ],
    },
    computed: {
      // 计算属性的 getter
      totalPrice: function (){
          let result = 0;
          // `this` 指向 vm 实例
          for (let book of this.books){
            result += book.price;
          }
          return result
      }
    }
  })
</script>

结果:总价格:180

这里我们声明了一个计算属性 totalPrice。然后通过for循环计算出书的总价,像这种需要计算的属性,就写在computed中。

属性一般都有getset两个方法,get获取属性值,set设置属性值,computed中默认就是get属性,我们的vm.totalPrice是依赖于books.price,如果书本的价格发生变化,那么计算属性totalPrice也随之动态变化
 

计算属性缓存 vs 方法

你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果:

<div id="app">
  <h2>总价格:{{getAllPrice()}}</h2>
</div>
<script>
  const vm = new Vue({
    el: "#app",
    data: {
      message: "hello",
      books: [
        {name: '三国演义', price: 30},
        {name: '红楼梦', price: 40},
        {name: '西游记', price: 50},
        {name: '水浒传', price: 60},
      ],
    },
    methods: {
      getAllPrice: function () {
        let result = 0;
        // `this` 指向 vm 实例
        for (let book of this.books){
          result += book.price;
        }
        return result
      }
    },
  })
</script>

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 books 还没有发生改变,多次访问 totalPrice 计算属性会立即返回之前的计算结果,而不必再次执行函数。

所以说计算属性是有缓存的

我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。
 

计算属性的 setter

计算属性默认只有 getter,不过在需要时你也可以提供一个 setter

computed: {
  totalPrice: {
    get: function () {
      let result = 0;
      // `this` 指向 vm 实例
      for (let book of this.books){
        result += book.price;
      }
      return result
    },
    set: function (newValue) {
      for (let book of this.books){
        book.price += 10
      }
    }
  }
}

这里我们添加了set方法,在运行vm.totalPrice=[...]时,setter 会被调用,随后书本的总价格也会随之变化,但是一般情况下不会使用set

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/165748.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何解析域名?

    如何解析域名?

    2021年9月20日
    57
  • update Google play services_apfs for windows

    update Google play services_apfs for windows原文首发:http://mobileside.cn/post/2010/02/10/GoogleBuzzForWindowsPhone.aspx  昨天晚上,google推出了他们的Buzz产品。什么是Buzz,简单点说,他就是把微博服务和他的地图以及邮件结合到了一起,其实这是一个很典型的LBS。下载地址为:http://www.google.com/gmm/Google

    2022年8月31日
    2
  • threadlocal底层实现_数据库底层实现原理

    threadlocal底层实现_数据库底层实现原理ThreadLocal作用:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂性。package com.mupack;public class App{ private String content; public void setContent(String content) { this.content = content; } public Stri

    2022年8月8日
    3
  • 一个低级的ORA-01017错误

    一个低级的ORA-01017错误事件缘由:使用sys账户创建了一个数据清理的存储过程,再创建一个Oraclejob定时运行这个存储过程,用于做表数据的清理。第二天看表数据未删除,说明job执行有错,打算使用sys账号登录查看job运行情况,反复输入sys账户信息,总提示ORA-01017,1.尝试改sys用户密码,重试报错依旧。2.使用sys登录GC,报错相同。使用普通用户登录正常。3.数据库服务器上使用sq

    2022年6月1日
    33
  • 64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    64位CENTOS 5(RED HAT AS5)安装配置(web服务、邮件服务、WEB邮件)小记

    2021年7月25日
    43
  • css半透明层

    css半透明层首次登录弹出提示层,主要有两个层:半透明层,遮住下面的内容;提示层(主要内容),下面为这两个层的css样式。针对IE透明使用的是filter:alpha(opacity=35),针对FF透明的相关代码是opacity:0.35,这样至少在IE和FF下是兼容的,通过测试。.mask{ border:0px; background:#000; width:100%; …

    2022年7月13日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号