vue首次赋值不触发watch及watch和computed的区别
watch的使用
template中
<div>名字:{{name}},年龄:{{age}}</div>
script中
export default {props: { name: String },data() { return { age: 10 } },watch: {name(newValue, oldValue) {},age(newValue, oldValue) {}},}
这种情况通过watch监听的数据,当字段被第一次赋值时是不会执行监听函数的。只有值再次发生改变才会执行监听。那如何才能在第一次赋值时就执行监听函数呢?这里就需要用到immediate和handler
immediate和handler使用
在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调
也就是说immediate值为true,则首次赋值时就执行handler函数,immediate值为false,则首次赋值时就不执行handler函数
watch: {name: {handler(newValue, oldValue) {},immediate: true,},age: {handler(newValue, oldValue) {},immediate: true,},}
首次赋值监听时,oldValue值为undefined
deep 深度监听
当需要监听一个对象的改变时(注意这里监听的是整个对象),正常的watch无法监听到对象内部属性的改变,此时需要使用deep对对象进行深度监听
父组件
people:{name:"露西"}btnClick() {this.people.name = "宙斯";}
子组件
props: {people: {type: Object,//对象或数组的默认值必须从一个工厂函数返回。default: () => ({name: ""})}},watch: {people: {handler(newValue, oldValue) {},// immediate: true, 加上则首次也监听deep: true, //必须加上才能监听到people的变化},},
当对一个对象进行监听时,需要添加deep:true属性,此时修改对象内任意属性值都会被监听到。如果只想对对象中某一个属性进行监听,则可以使用字符串的形式监听对象某一个属性,如:
watch: {'people.name': {handler(newValue, oldValue) {},deep: true,},}
deep和immediate可同时使用,表示首次绑定就触发监听函数
注意事项
1:数组的变动可直接进行监听,不需要deep属性,操作如下,若首次监听则需加immediate: true
增
this.list.unshift({name: "宙斯"}) //添加到数组头部this.list.push({name: "宙斯"}) //添加到数组尾部
删
this.list.shift() //删除数组头部一个元素this.list.pop() //删除数组尾部一个元素
改
this.$set(this.list, 0, {name:"宙斯"}); //修改数组角标为0的数据
数组的splice方法,可用于插入、删除、替换操作,具体操作可移步到前端杂谈之splice用法
2:通过props传递对象或数组时,对象或数组的默认值必须从一个工厂函数返回,否则就会报
Invalid default value for prop “xxx”: Props with type Object/Array must use a factory function to return the default value.
people: {type: Object,default: ()=>{}}list: {type: Array,default: ()=>[]}
props传递对象时,未传递的字段如何使用默认值
1:通过computed计算属性再定义一个对象,再用assign合并默认值和传递的对象,组件内则使用新定义的对象来展示数据,如
子组件
<div> 姓名:{{privatePeople.name}} 年龄:{{privatePeople.age}} </div>props: {people: {type: Object,//数组/对象的默认值应当由一个工厂函数返回default: () => {}}},computed: {privatePeople() {let defaultPeople = {name: "露西",age: 10};return Object.assign({}, defaultPeople, this.people);}},
2:使用不带参数的v-bind=xxx
父组件
<watch-components v-bind=people></watch-components>people: {name: "宙斯"}
子组件
props: {name:{type:String,default:"露西"},age:{type:Number,default: 10}}
3:使用vuex对状态进行统一管理,子组件通过computed的计算属性获取存储在store中的变量
computed、watch、methods的区别和使用
computed计算属性-引用官网的示例
可监听data和props中的属性
主要用于当一些数据需要随着其它数据变动而变动时使用。如:购物车总金额
computed: {fullName: function () {return this.firstName + ' ' + this.lastName}}
特点
1:计算属性是基于它们的响应式依赖进行缓存的。只在 相关响应式依赖 发生改变时它们才会重新求值。也就是说当computed函数所依赖的属性值没有发生改变时,调用的结果就会从缓存中读取。
这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:
computed: {now: function () {return Date.now()}}
2:计算属性必须有return返回
watch侦听属性-引用官网的示例
可监听data和props中的属性
主要用于当需要在数据变化时执行异步或开销较大的操作时使用,如搜素框
watch: {question(newValue, oldValue) {this.axios() //执行异步逻辑}}
特点
1:watch中的函数名称必须和data或props中的属性名称一致
2:watch中函数有两个参数,第一个是newValue新值,第二个是oldValue旧值。
methods:函数方法
主要用于写一段业务逻辑
区别
- computed计算属性结果会被缓存,只有依赖的属性发生改变才会重新计算,主要用于当一些数据需要随着其它数据变动而变动时使用
- watch侦听属性用来侦听对象或属性的变化,然后执行对应回调,回调函数内主要用于执行某些业务逻辑,如异步操作或开销较大的操作
vue首次赋值不触发watch及watch和computed的区别相关推荐
- vue首次渲染全过程
昨天有朋友问我vue在页面第一次加载时到底做了些什么,看来这个问题在很多朋友心中可能还比较模糊,今天我们一起来详细的看看vue的首次渲染过程 vue源码下载地址:vue源码 了解vue首次渲染全过程, ...
- vue更新数组时触发视图更新的方法
参考原文: vue更新数组时触发视图更新的方法 - 大橙橙 - 博客园 vue数组对象修改触发视图更新 - 看风景就 - 博客园 直接修改数组元素是无法触发视图更新的,如 this.array[0] ...
- vue component created没有触发_Vue的难点解析
watch 和 computed 和 methods 区别是什么? computed 计算属性,在模板中双向绑定一些数据或表达式时,如果表达式过长,或逻辑更为复杂,就会变得臃肿,难以维护和阅读 < ...
- Vue 动态赋值 class
Vue 动态赋值 class Vue 在操作 DOM 元素的 class 属性时,有以下多种方法 更多精彩 更多技术博客,请移步 asing1elife's blog 比较通用的是否赋值方式 通过以下 ...
- vue 加载页面时触发时间_5.6 vue更新数组时触发视图更新的方法,熟记JavaScript原生方法...
问题:vue更新数组时触发视图更新的方法 变异方法: Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.什么是变异方法呢?简单理解就是改变了原来的数组,可能包括数组长度length,或者 ...
- vue和react相同点_我在React和Vue中创建了相同的应用程序。 这是区别。
vue和react相同点 by Sunil Sandhu 由Sunil Sandhu 我在React和Vue中创建了相同的应用程序. 这是区别. (I created the same app in ...
- vue中created钩子函数与mounted钩子函数的使用区别
1:在使用vue框架的过程中,我们经常需要给一些数据做一些初始化处理,这时候我们常用的就是在created与mounted选项中作出处理. 首先来看下官方解释,官方解释说created是在实例创建完成 ...
- vue路由的两种模式:hash与history的区别
前言:众所周知,vue-router有两种模式,hash模式和history模式,下面来看看两者的区别. 一.基本情况 直观区别:hash模式url带#号,history模式不带#号. 1.hash模 ...
- vue 路由传参 params 与 query两种方式的区别(转载)
vue 路由传参 params 与 query两种方式的区别 初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了: ro ...
最新文章
- 在win7下安装SQL sever2005
- python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
- android 利用eclipse观察内存变化情况
- u盘往linux考文件过大,U盘拷贝时提示文件过大怎么办,教您如何解决
- 【已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘_Python系列学习笔记
- app启动广告页的实现,解决了广告图片要实时更新的问题
- Factors of Factorial AtCoder - 2286 (N的阶乘的因子个数)(数论)
- 我们活在世界上,不是为了求人们原谅。
- mysql开发必知必会
- REDGATE又一好用的脚本工具ScriptsManager1.3
- java访问网络接口_Java网络访问 java调用http java调用其他接口
- 隐马尔可夫模型及其基本假设
- Elasticsearch 带中文分词的全文检索(分页+高亮返回)
- 计算机基础知识表格斜线,怎么在excel中画斜线-制作好看的Excel表格必备技能:3秒制作斜线表头,简单到没朋友...
- 阿里云服务器 ECS 数据盘与系统盘是什么?
- JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
- 鸿蒙系统支持双系统吗,双系统同台登出,EMUI11+鸿蒙系统2.0,有大招
- 北斗微信与服务器怎么联接,北斗卫星的导航服务全球性升级,手机怎样“连接”使用北斗导航?...
- 蓝牙鼠标windows linux,windows linux双系统共用蓝牙鼠标
- Discussion 2