• 技术文章 >web前端 >Vue.js

    深入解析Vue的计算属性API(computed)

    藏色散人藏色散人2022-08-09 15:15:00转载318

    Vue模板的表达式语法仅支持单个表达式,用于简单运算;对于复杂的逻辑计算应当使用计算属性computed。

    computed可以依赖(计算)props、data、vuex的数据,即可以声明了一个计算属性,令其响应props/data/vuex的数据变化,返回一个经过某种计算的结果。【相关推荐:vue.js视频教程

    计算属性的写法

    computed属性的属性值可以是函数或者对象
    1、属性值是函数,这时候计算属性只有 getter

    <div id="app">
        {{fullName}}
    </div>
    <script>
    let vm = new Vue({
      el: '#app',
      data: {
        firstName: 'Foo',
        lastName: 'Bar'
      },
      computed: {
        fullName () {
          return this.firstName + ' ' + this.lastName
        }
      }
    })
    </script>

    在这里插入图片描述

    大前端零基础入门到就业:进入学习


    2、属性值是对象
    computed的属性值是对象时,对象的属性属性可以配置get和set方法,通过这种方式可以给计算属性提供一个 setter。

    fullName: {
       get () {
         return this.firstName + ' ' + this.lastName   },
       set (newValue) {
         const names = newValue.split(' ')
         this.firstName = names[0]
         this.lastName = names[names.length - 1]
       }
     }

    在这里插入图片描述

    计算属性支持缓存

    在视图发生了变化,而计算属性所依赖的数据没有变化的情况下,会直接从缓存中取值。

    下面的例子中计算属性messageLength和方法getMessageLength实现相同的功能,在通过点击按钮更新视图时,会发现方法getMessageLength会被执行,显然在这种情况下使用计算属性比方法性能更好。

    <div id="app">
        {{messageLength}}-{{getMessageLength()}}
        <button @click="onClick">点击{{i}}</button>
    </div>
    <script>
    let vm = new Vue({
      el: '#app',
      data: {
        message: 'Hello world',
        i: 0
      },
      computed: {
        messageLength () {
          console.log('messageLength执行了')
          return this.message.length
        }
      },
      methods: {
        getMessageLength () {
          console.log('getMessageLength执行了')
          return this.message.length
        },
        onClick () {
          this.i++
        }
      }
    })
    </script>

    计算属性传参

    在Vue实例中,计算属性以属性的方式存在,如果要传参,需要使用闭包将属性值改为一个函数
    在这里插入图片描述

    computed: {
      fullName () {
        return function (maxLength) {
          return (this.firstName + ' ' + this.lastName).substring(0, maxLength)
        }
      }}

    这种情况下,使用计算属性与使用方法等效。

    computed属性与watch属性

    计算属性可以响应Vue 实例的数据变动,watch属性同样可以观察和响应 Vue 实例上的数据变动。
    watch可以监听props、data和computed中的数据变化,并执行一个函数。
    使用时:
    computed是用来计算的,它要求返回一个结果,在调用的时候不需要加括号,它会根据一个或多个依赖自动缓存,如果依赖不变,computed不会自动计算;
    watch是用来监听的,一次只能监听一个数据,监听的数据变化了,就去执行函数,它有两个选项:

    实现异步计算

    一、computed属性无法返回异步操作的结果,但可以依赖Vuex中的数据,故通过返回store.state可以获得异步操作的结果

    二、通过vue-async-computed插件可以实现异步计算属性,list属性将被赋值为一个Promise,显然不是我们需要的结果

    import Vue from 'vue'import AsyncComputed from 'vue-async-computed'import axios from 'axios'Vue.use(AsyncComputed)export default {
      name: 'MediaIndex',
      data () {
        return {
          pageNo: 1
        }
      },
      computed: {
        list () {
          return axios(`https://www.fastmock.site/mock/d6b39fde63cbe98a4f2fb92ff5b25a6d/api/products?pageNo=${this.pageNo}`)
            .then(res => res.data)
        }
      },
      asyncComputed: {
        asyncList () {
          return axios(`https://www.fastmock.site/mock/d6b39fde63cbe98a4f2fb92ff5b25a6d/api/products?pageNo=${this.pageNo}`)
            .then(res => res.data)
        }
      }}

    在这里插入图片描述

    vue-async-computed

    巧用computed属性计算props

    下面的例子实现props的双向绑定

    export default {
      name: 'Pagination',
      props: {
       page: {
          type: Number,
          default: 1
        },
        limit: {
          type: Number,
          default: 10
        }
      },
     computed: {
      currentPage: {
        get() {
          return this.page    },
        set(val) {
          this.$emit('update:page', val)
        }
      },
      pageSize: {
        get() {
          return this.limit    },
        set(val) {
          this.$emit('update:limit', val)
        }
      }
     }

    以上就是深入解析Vue的计算属性API(computed)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    快捷开发Web应用及小程序:点击使用

    支持亿级表,高并发,自动生成可视化后台。

    专题推荐:Vue computed
    上一篇:总结Vue创建响应式数据对象(reactive、ref、toRef、toRefs) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• Vue中computed和method之间有什么不同点• Vue中Computed属性、Methods和Watch之间的差异• vue中computed和watch的区别是什么?• 认识Vue中的computed 和 watch,聊聊它们的区别
    1/1

    PHP中文网