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

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

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

计算属性的写法

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

    {{fullName}}
let vm = new Vue({ el: '#app', data: { firstName: 'Foo', lastName: 'Bar' }, computed: { fullName () { return this.firstName + ' ' + this.lastName } }})

登录后复制

在这里插入图片描述
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会被执行,显然在这种情况下使用计算属性比方法性能更好。

    {{messageLength}}-{{getMessageLength()}}    
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++ } }})

登录后复制

计算属性传参

在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是用来监听的,一次只能监听一个数据,监听的数据变化了,就去执行函数,它有两个选项:

immediate表示在组件第一次渲染的时候是否要执行这个函数,默认为false。deep表示监听一个对象内部属性的变化,默认为false.

实现异步计算

一、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)的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3231803.html

(0)
上一篇 2025年4月1日 17:01:48
下一篇 2025年3月7日 23:34:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 一文详解Vue中watch和watchEffect的区别

    前言 watch函数与watcheffect函数都是监听器,在写法和用法上有一定区别,是同一功能的两种不同形态,底层都是一样的。【相关推荐:vue.js视频教程】 watch和watchEffect的对比 watch watch显式指定依赖…

    编程技术 2025年4月1日
    100
  • VUE实例解析之mount实例挂载的实现

    本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于mount实例挂载的相关问题,vue2中是通过new操作符生成实例并将根作为el传入,vue3中使用mount方法代替是el配置项,使用导出的createapp代替了…

    2025年4月1日 编程技术
    100
  • vue3 axios的使用介绍及数据渲染

    本篇文章给大家介绍如何使用axios方式调用接口以及获取的数据渲染,希望对需要的朋友有所帮助! 1、axios的作用是什么呢? axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能。【相关推荐:vue.js视频教程】 2、项目…

    2025年4月1日 编程技术
    100
  • 归纳整理VUE实例参数与MVVM模式知识点

    本篇文章给大家带来了关于vue的相关知识,其中主要介绍了关于vue实例参数以及mvvm模式的相关问题,实例化一个vue对象,参数是一个选项对象,下面一起来看一下,希望对大家有帮助。 【相关推荐:vue、vue】 配置参数 实例化一个Vue对…

    2025年4月1日
    100
  • Vue基础知识总结之vue组件化开发

    本篇文章给大家带来了关于vue其中主要介绍了关于vue组件化开发的相关问题,组件化开发提供了一种抽象, 我们可以开发出一个独立可复用的小组件来构造我们的应用组件,下面一起来看一下,希望对大家有帮助。 【相关推荐:vue、vue】 一、函数式…

    2025年4月1日 编程技术
    100
  • 深入浅析Vue的动态属性绑定指令v-bind

    v-bind的作用和插值表达式差不多, 只不过v-bind主要用于动态设置标签的属性。下面本篇文章就来带大家详细了解一下vue的动态属性绑定指令v-bind,希望对大家有所帮助! v-bind指令是专门操作属性的指令,那么什么是属性呢?例如…

    2025年4月1日 编程技术
    100
  • 解析vue中axios的封装请求(附步骤代码)

    一、简介 axios 是一个轻量的http客户端,它基于 xmlhttprequest 服务来执行 http 请求,支持丰富的配置,支持 promise,支持浏览器端和 node.js 端。自vue2.0起,尤大大宣布取消对vue-reso…

    编程技术 2025年4月1日
    100
  • VUE组件的创建、渲染、及注册(总结分享)

    本篇文章给大家带来了关于vue的相关知识,其中主要介绍了关于组件的创建、渲染以及注册的相关问题,创建的组件不要写el因为最终所有的组件都要被vm管理,由vm决定服务的对象,下面一起来看一下,希望对大家有帮助。 【相关推荐:vue、vue】 …

    2025年4月1日
    100
  • 简单分析vue组件scoped的作用

    本篇文章给大家带来了关于vue的相关知识,其中主要介绍了关于scoped属性的相关问题,在style上加入scoped属性, 就会在此组件的标签上加上一个随机生成的data-v开头的属性,下面一起来看一下,希望对大家有帮助。 【相关推荐:v…

    2025年4月1日 编程技术
    100
  • 详解v-bind怎么动态绑定style属性

    v-bind怎么动态绑定style属性?本篇文章带大家详细了解一下v-bind指令动态绑定style属性的多种语法,希望对大家有所帮助! v-bind可以动态设置style属性,用以绑定内联样式。写法: 登录后复制 一、v-bind动态绑定…

    2025年4月1日 编程技术
    100

发表回复

登录后才能评论