冇事来学系--Vue2.0侦听器

简介: watch侦听器允许开发者监视数据的变化,从而针对数据的变化做出特定的操作

侦听器


watch侦听器允许开发者监视数据的变化,从而针对数据的变化做出特定的操作

语法格式
const vm = new Vue({
  el: '#app',
  data: {username: ''},
  // 所有侦听器都要定义在watch节点之下
  watch: {
    // 监听 username值的变化
    // 侦听器本质上是一个函数,要监视哪个数据的变化,就把数据名作为方法名即可
    // newVal是"变化后的新值", oldVal是"变化之前的旧值"
    username(newVal, oldVal){
      console.log(newVal, oldVal)
    }
  }
})


侦听器的格式


1.  方法格式的侦听器

  • 缺点一:无法在刚进入页面的时候自动触发侦听器
  • 缺点二:当侦听的是一个对象时,若对象里面的属性发生了变化,不会触发侦听器

2.  对象格式的侦听器

  • 优点一:可以通过immediate选项,让侦听器自动触发
  • 优点二:可以通过deep选项,让侦听器监听对象中每个属性的变化
const vm = new Vue({
  el: '#app',
  data: {username: 'admin'},      // username带默认值
  // 所有侦听器都要定义在watch节点之下
  watch: {
    // 监听 username值的变化
    username: {
      // 侦听器的处理函数handler,当username发生变化时被调用
      handler(newVal, oldVal){
      },
      immediate: true       // immediate属性,默认值为false,当为true时进入页面会立即执行一次侦听器
    }
  }
})


补充:

另一种监听的方式 vm.$watch()

当vm实例对象创建时就知道要监听哪个属性,则可以在对象内使用watch节点来写配置对象

当vm实例对象创建时还没确定好监听什么,需要后续在确定,则可以使用下面这种方法

// 在vm实例的外面
vm.$watch('属性名称', {
  // 配置对象
})
// 示例:监听username
vm.$watch('username', {
  immediate: true,
  handler(newVal, oldVal){
    console.log(newVal, oldVal)
  }
})

深度侦听(deep选项)

<div id="app">
  <input type="text" v-model="info.username">   <!-- 注意这里不能直接写username,因为data里面就没有username这个属性 -->
</div>
const vm = new Vue({
  el: '#app',
  data: {
    // 用户的信息对象
    info: {
      username: 'admin',
      pwd: 666666
    }
  },      
  watch: {
    // 监听info对象的变化
    info: {
      handler(newVal){
        console.log(newVal)
      },
      deep: true  // 开启深度侦听,只要对象中任意一个属性发生变化,就会触发 对象的侦听器
    } ,
    // 也可以直接侦听对象中某一子属性的变化,但必须用单引号包裹(其实每个属性都是引号包裹的,只不过那些都省略了)
    'info.username'(newVal){
      console.log(newVal)
    }
  }
})

注意:监听一个复杂数据类型的属性,如一个对象,在改变里面的其中一个属性时,由于这个对象的地址没有发生改变,所以在监听不到这个对象发生变化;而用一个新对象去覆盖原来的对象,这样导致的地址的改变,所以才能监听到对象发生了变化。

所以,我们需要深度监听,只要对象中任意一个属性发生变化,就会触发 对象的侦听器

目录
相关文章
|
JavaScript 容器
冇事来学系--Vue2.0中VueComponent(组件)
组件的本质 组件的本质就是一个 构造函数 f VueComponent (options) { this._init(options); } ,是Vue.extend( )生成的 当我们使用组件时,写了组件的标签,Vue解析时就会创建该组件的实例对象,即Vue帮我们执行了这一句代码 new VueComponent(options) (options就是我们写的data、methods、computed等数据) 每次调用Vue.extend( )时,返回的都是一个全新的VueComponent
308 0
|
存储 JavaScript 前端开发
冇事来学系--Vue2.0中vuex(上)
专门在Vue中实现集中式状态 (数据) 管理的一个Vue插件,对vue中多个组件的共享状态进行集中式的管理(读/写) ,适用于任意组件之间的通信
185 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中讲讲生命周期吧
生命周期(Life Cycle) 是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 。是vue在关键时刻帮我们调用的一些特殊名字的函数。 生命周期函数中的this指向的是vm或组件实例对象
177 0
|
前端开发
冇事来学系--Vue2.0中Promise详讲(下)
then-fs的基本使用 可以通过node下载then-fs。 npm install then-fs
164 0
|
前端开发 JavaScript 数据库
冇事来学系--Vue2.0中Promise详讲(上)
回调地狱 多层回调函数的相互嵌套,就形成了回调地狱
306 0
|
JavaScript
冇事来学系--Vue2.0 组件开发详讲(下)
组件的自定义属性props props节点是和data、methods等同级的节点,值是一个数组
130 0
|
存储 前端开发 JavaScript
冇事来学系--Vue2.0中路由Router
路由的概念与原理 路由(router),就是对应关系。即 Hash地址(锚点链接) 与 组件 之间的对应关系 注意:锚点链接的特点-->不会刷新页面,但是会产生浏览历史
204 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中vue-cli使用
单页面应用程序(Single Page Application) 一个web网站只有一个HTML页面,所有的功能与交互都在这一个页面上完成
127 0
|
JavaScript 前端开发 API
vue3,你还为状态为何物而发愁吗?(一)
为啥需要状态?因为组件划分的非常原子化(细腻),所以造成了很多的组件,那么组件之间就需要一种“通讯方式”,这个就是状态了。不仅仅是传递数据,还可以实现事件总线。
vue3,你还为状态为何物而发愁吗?(一)
|
JavaScript
vue3,你还为状态为何物而发愁吗?(二)
为啥需要状态?因为组件划分的非常原子化(细腻),所以造成了很多的组件,那么组件之间就需要一种“通讯方式”,这个就是状态了。不仅仅是传递数据,还可以实现事件总线。
vue3,你还为状态为何物而发愁吗?(二)