vue中的watch属性(vue Watch和Computed的使用总结)
类别:编程学习 浏览量:2402
时间:2022-01-26 01:11:38 vue中的watch属性
vue Watch和Computed的使用总结目录
- 01. 监听器watch
- (1)作用
- (2)属性和方法
- (3)监听对象
- (4)监听数组
- 02. 计算属性computed
- (1)计算属性的set方法
- (2)区别
- (3)使用场景
(1)作用
- watch:用于监听data中的数据变化,只在被监听的属性值发生变化时执行
export default { data() { return { number: 1 } }, watch:{ // 普通监听方法,这里表示监听data中的 number属性 // 第一个参数表示改变后的新值,第二个参数表示改变前的旧值 number(newVal,oldVal){ console.log(newVal); console.log(oldVal); } } }
(2)属性和方法
- immediate:表示在组件创建后,立即监听属性,在最初绑定值的时候,设置为:immediate: true
- handler:监听对象的时候使用,发生变化时,执行handler中的方法~
- deep:表示深度监听对象、数组内部的属性的变化,设置为:deep: true
export default { data(){ return { number: 1 } }, watch: { // 监听 number属性 number: { handler(newVal, oldVal){ }, immediate: true, // 立即监听 } } }
(3)监听对象
- 可以监听对象的直接赋值操作
- 但不能监听对象属性的添加、修改、删除
export default { data() { return { obj: { a: 1 } } }, watch: { obj: { handler(newVal){ console.log('监听到了', newVal) }, immediate: true } }, created(){ // 无法监听到,因为是对属性进行的修改操作 // 打印一次,且打印结果为修改后的值, this.obj.a = 2 // 可以监听到,因为是直接对 对象进行的 赋值操作 // 打印两次(immediate立即监听会打印一次,修改时打印一次) this.obj = { a: 2} } }
由于 Vue 会在初始化实例时,会对属性执行 getter/setter 转化过程
所以属性必须在 data 对象上存在,才能让 Vue 转换它,这样才能让它是响应式的
因此,Vue 无法检测到对象属性的添加、删除、修改等操作
默认情况下 handler 只监听对象内部属性的引用的变化
因此,我们只有进行赋值操作的时候,它才会监听到
- 可以直接监听对象的某一个属性值
- 如果这个属性是基本类型的值,就可以正常监听
export default { watch: { 'obj.a': { handler(newVal){ console.log(newVal) } } }, created(){ // 以下两个都可以监听到 打印两次 this.obj.a = 2 this.obj = { a:2 } } }
- 可以使用deep属性进行深度监听
- 只能监听原有属性的变化,不能监听新增属性
- vue 无法监听 this.$set 修改原有属性的变化
这是因为,this.$set()就是相当于在data中对初始值进行改变
它可以触发监听,但变化体现不出来,即newVal === oldVal
export default { watch: { obj: { handler(newVal){ console.log(newVal) }, deep: true, immediate: true } }, created(){ // 进行深度监听后,直接修改属性的变化也可以监听到 // 打印两次(因为immediate) this.obj.a = 2 // 无法监听到 对象属性的增加 // 打印一次,且打印结果为添加了新增属性的对象 // 即,它只会 因immediate而执行一次 ,且打印输出 {a:1,b:2} this.obj.b = 2 // 可以触发监听,但无法监听到变化 // 打印两次,两次值都是{a:2},不能体现变化 this.$set(this.obj, 'a', 2) } }
(4)监听数组
- 可以监听
- 数组的直接赋值操作
- 通过数组方法的添加、修改、删除操作
- 通过this.$set()方法进行的数组操作
数组方法如pop()、push()等,和this.$set(arr, index, newVal)方法
它们可以触发监听,但无法体现变化,即newVal === oldVal
- 无法监听
- 无法监听数组的非数组方法的添加、删除、修改操作
- 无法监听直接通过索引值改变数组的变化
- 无法监听直接修改数组长度的变化
export default { data() { return { arr: [1] } }, watch: { arr: { handler(newVal, oldVal) { console.log('新:', newVal) console.log('旧:', oldVal) }, immediate: true } }, created() { // 可以监听到---直接整个数组赋值 this.arr = [2] // 无法监听到---索引赋值、长度修改 this.arr[1] = 2 this.arr[0] = 2 this.arr.length = 2 // 可以触发监听,但无法监听到变化 => 即新、旧值都是一样的 this.arr.push(2) this.$set(this.arr, 0, 2) } }
(1)计算属性的set方法
- 计算属性可以写为一个 Object,而非 Function,只是 Function 形式是我们默认使用它的 get 方法,当写为 Object 时,我们还可以使用它的 set 方法
computed: { fullName: { get () { return `${this.firstName} ${this.lastName}`; }, set (val) { const names = val.split(' '); this.firstName = names[0]; this.lastName = names[names.length - 1]; } } }
当执行 this.fullName = 'Aresn Liang',computed 的 set 就会调用,firstName 和 lastName 就会被赋值为 Aresn 和 Liang
computed 可以依赖其它 computed,甚至是其它组件的 data
(2)区别
- 计算属性和监听器
- 计算属性computed是:监听依赖值的变化
- 只要依赖值不变,都会直接读取缓存进行复用
- 计算属性不能响应异步操作中数据的变化
- 需要人为调用
- 监听器watch是:监听属性值的变化
- 只要属性值发生变化,都可以触发一个回调函数
- 监听器可以响应异步操作中数据的变化
- 自动触发
- 计算属性computed是:监听依赖值的变化
- 计算属性和方法
- methods 是一个方法,它可以接受参数,而 computed 不能
- computed 是可以缓存的,methods 不会
(3)使用场景
- 当一个属性受多个属性影响的时候就需要用到computed
- 当一条数据影响多条数据的时候就需要用watch,如搜索数据
以上就是vue Watch和Computed的使用总结的详细内容,更多关于vue Watch和Computed的使用的资料请关注开心学习网其它相关文章!
您可能感兴趣
- vueassets文件路径(vue如何根据url下载非同源文件)
- vue路由跳转的方法(Vue路由监听实现同页面动态加载的示例)
- vue设置属性没响应(Vue.$set 失效的坑 问题发现及解决方案)
- vue实现一个炫酷的日历组件(vue利用Moment插件格式化时间的实例代码)
- vue 如何执行动态js(如何利用vue.js实现拖放功能)
- vue 实现吸顶效果(vue实现水波涟漪效果的点击反馈指令)
- springboot如何解析vue登录参数(SpringBoot + Vue 项目部署上线到Linux 服务器的教程详解)
- vue代码和element用法(Vue Element前端应用开发之整合ABP框架的前端登录)
- vueelementui三级菜单(vue+element ui实现锚点定位)
- vue 修改后刷新(Vue使用三种方法刷新页面)
- vue一个组件两种样式(Vue实现动态样式的多种方法汇总)
- vuejs过滤器使用教程(vue3删除过滤器的原因)
- vue封装组件技巧(浅谈vue中所有的封装方式总结)
- vue2.0自定义指令(vue2实现provide inject传递响应式)
- vue-router起步教程交流(vue3使用vue-router的完整步骤记录)
- vue父组件怎么用子组件的数据(Vue使用v-model封装el-pagination组件的全过程)
- 26岁杨紫的白素贞遇上24岁鞠婧祎,哪个最美(26岁杨紫的白素贞遇上24岁鞠婧祎)
- 鞠婧祎和杨紫两种风格的女生,你心里谁比较美(鞠婧祎和杨紫两种风格的女生)
- 三千年第一美女鞠婧祎出演白素贞pk杨紫,颜值胜赵雅芝王祖贤(三千年第一美女鞠婧祎出演白素贞pk杨紫)
- 成都轨道交通13号线一期工程最新进展(成都轨道交通13号线一期工程最新进展)
- 越南没事(越南没事情做)
- 重庆旅游攻略(重庆旅游3-4天攻略最佳线路)
热门推荐
- dedecms调用方法(DEDECMS专题制作方法)
- 搭建lamp平台并测试(浅谈Web服务器的构架:LAMP LNMP以及LLMP)
- mysqldecimal类型数据转换(mysql decimal数据类型转换的实现)
- sql常见的聚合函数有哪些(SQL中的开窗函数详解可代替聚合函数使用)
- python中导入模块的命令(Python3 导入上级目录中的模块实例)
- laravel如何设置默认模块(laravel-admin 中列表筛选方法)
- VS中打开.ashx文件
- vue做个人页面(vue简易记事本开发详解)
- python处理tcp包(Python3使用TCP编写一个简易的文件下载器功能)
- python获取特定时间日期的数据(Python提取特定时间段内数据的方法实例)