首页 > 其他分享 >Vue的计算属性和监视属性

Vue的计算属性和监视属性

时间:2023-09-18 18:32:26浏览次数:37  
标签:Vue computed firstName watch 监视 fullName 属性

计算属性

响应式的传统的实现方法:

  • 赋值语法
  • methods实现: {{fullName()}}

组件模板应该只包含简单的表达式,复杂的表达式应该重构计算属性或者方法

Vue中已有的原始属性 => 计算属性,计算属性不在 _data 中,采用对象形式定义如下:

computed:{
  // 自定义变量,采用对象形式
  fullName:{
    get(){
      // this指向当前vm实例
      return this.firstName + ':' + this.secondName;
    }
    // 按需要(写的需求)添加
    set(){
      this.firstName = 'WU';
    }
  }
}

计算属性的特点:

  • get方法存在缓存机制(重复调用只会调用一次),永远保持数据的最新值。只有在初次读取依赖的数据变化时才被调用。这种机制methods实现将不存在,会持续调用。
  • 拿到get方法的返回值放到vm身上。
  • 最终体现在vm上,直接读取使用就行,如模板中直接使用 {{fullName}}
  • 如果要修改计算属性,要写set方法区真实修改属性值。
  • 使用 this 获取data中的值。

计算属性的简写:

如果只读不写的场景,可以对计算属性进行简写,模板调用不带括号

computed:{
  fullName(){
    xxxxx
  }
}
// 模板调用
{{fullName}}

监视属性

采用watch监视属性或者方法的变化(必须提前data定义好),进行相关的操作,分为表层监视深度监视

参数:

computed:{
  // computed的简写形式
  info(){
    return this.xxx;
  }
}
watch:{
  // 要监视的属性或者方法
  isHot:{
    immediate:true,
    // newValue:新的值,oldValue:旧的值
    deep:true, //深度监视
    handler(newValue, oldValue) {

    }
  }
}

监视的另外一种写法,按需监视:

vm.$watch('isHot', {
  immediate: true,
  handler(newValue, oldValue) {
    xxxxx
  }
});

深度监视:

使用watch时根据数据的具体结构,决定是否采用深度监视。

data(){
  return {
    isHot: true,
    numbers:{
      a: 1,
      b: 2,
      // 也可以继续多级结构
      c:{

      }
    }
  }
}
watch:{
  numbers:{
    deep:true, // 只要a和b的值改变,可以监视变化
    handler(newValue, oldValue){
    }
  }
}
// 在模板中使用,对该属性进行修改,就会触发
{{numbers.a++}}

只有handler函数时,可以进行简化:

watch:{
  // 要监视的属性
  numbers(newValue, oldValue){
    xxxxxxx
  }
}

计算属性 VS. 监视属性

区别:

  • computed 和 watch都能完成同一个功能,但watch实现更复杂,没有返回值直接修改。
data(){
    return{
        firstName:'wu',
        secondName:'yuhan',
        // 必须预先定义
        fullName:'wuyuhan'
    }
  },
  watch:{
    firstName(val){
        this.fullName = val + ':' + this.secondName;
    },
    secondName(val){
        this.fullName = this.firstName + ':' + val;
    }
}
  • watch 能实现异步操作,computed无法完成,如执行定时操作
computed:{
	firstName(val){
    // 定时器中的箭头函数this没有任何指向,只能向上查找,找到了firstName的对象
    setTimeout(()=>{
        console.log(this); // 指向vue实例,如果普通函数,指向windows
        this.fullName = val + ':' + this.secondName;
    }, 1000);
  },
}

指导原则:

  • 所有vue管理的函数,必须写成普通函数,这样 this 指向vm或者组件实例对象。
  • 所有不被vue管理的函数(定时器的回调函数、ajax的回调函数、Promise的回调函数),要写成箭头函数,这样的 thisvm或者组件实例对象,通过向上查找对象实现。
  • 不是所有的箭头函数都是被vue管理的。

标签:Vue,computed,firstName,watch,监视,fullName,属性
From: https://blog.51cto.com/u_16268784/7514295

相关文章

  • spring对象的获取及属性赋值方式
    1、通过bean的id获取IOC容器中的对象SpringDemoTest.javaimportcom.mashibing.bean.Person;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassSpringDemoTest{publicsta......
  • Vue学习七:自定义创建项目和vuex
    一、自定义创建项目默认的项目有很多包不全,需要的时候还要导包搭架子,因此我们可以自定义创建项目。选择的项目按照自己需要的设置,可参考如下参数设置。(eslink是一种代码规范)二、vuex1、vuex概述vuex是一个vue的状态管理工具,状态就是数据。大白话:vuex是一个插件,可以帮我们......
  • Vue3+vite路由配置优化(自动化导入)
    今天在维护优化公司中台项目时,发现路由的文件配置非常多非常乱,只要只中大型项目,都会进入很多的路由页面,规范一点的公司还会吧路由进行模块化导入,但是依然存在很多文件夹的和手动导入的问题。于是我想到了我之前使用vuex时进行的模块化自动导入js文件,能不能使用到自动导入.vue文件......
  • vue 的 name 和最外层 class命名也需要保证唯一性
    平时为了赶工期,在画页面的时候,会复制框架里面相同样式的页面,直接Ctrl+A  Ctrl+C  Ctrl+V 然后修改字段。这样写节省不少时间,也提高了效率。但是是有隐患的,首先是vue的name,挺重要的比如keepalive时候,exclude  include的name就需要保持一致。(之前踩过坑,vue中name和r......
  • 11-计算属性 vs 监视属性
    计算属性(computed)vs监视属性(watch)1) computed能完成的功能,watch都可以完成2) watch能完成的功能,computed不一定能完成。例如watch可以进行异步操作。 两个重要的原则1) 所有被Vue管理的函数,最好写成通函数,这样this的指向才是vm或组件实例对象2) 所有不......
  • 少年,该升级 Vue3 了!
    你好,我是Kagol。前言根据Vue官网文档的说明,Vue2的终止支持时间是2023年12月31日,这意味着从明年开始:Vue2将不再更新和升级新版本,不再增加新特性,不再修复缺陷虽然Vue3正式版本已经发布快3年了,但据我了解,现在依然还有很多业务在使用Vue2,迟迟没有升级Vue3。为......
  • Vue3深度解析:reactive和ref的区别你真的了解吗?
    Vue3中引入了CompositionAPI,其中包含了reactive和ref两个核心函数。这两个函数都是用于创建响应式数据的,但它们之间有一些区别。首先,让我们来看一下reactive函数。reactive函数接受一个普通对象作为参数,并返回一个新的响应式对象。这个响应式对象会跟踪所有属性的变化,并在属性发......
  • vue3 computed属性
    该随笔是根据b站小满zs的Vue3+vite+Ts+pinia+实战+源码+electron的视频学习写的,Vue3+vite+Ts+pinia+实战+源码+electron......
  • Spring Boot + Vue3 前后端分离 实战 wiki 知识库系统<一>---Spring Boot项目搭建
    前言:接下来又得被迫开启新的一门课程的学习了,上半年末尾淘汰又即将拉开序幕【已经记不清经历过多少次考试了】,需要去学习其它领域的技术作为考试内容,我选了springboot相关技术,所以。。总之作为男人,不能轻易言败,尽力而为,抱怨解决不了任何问题,逆境使人进步,我坚信这点,效果:在正式学习......
  • Spring Boot&Vue3前后端分离实战wiki知识库系统<十三>--单点登录开发二
    接着SpringBoot&Vue3前后端分离实战wiki知识库系统<十二>--用户管理&单点登录开发一继续往下。登录功能开发: 接下来则来开发用户的登录功能,先准备后端的接口。后端增加登录接口:1、UserLoginReq:先来准备用户登录的请求实体:packagecom.cexo.wiki.req;importjavax.validation.co......