在里面编写检测对象,
1.当监视的属性变化时,回调函数自动调用,进行相关的操作
2.监视的属性必须存在,才能进行监视
3.监视的两种写法:1.new Vue时传入watch配置2.通过vm.$watch('监视对象'{实现配置})
监听事件的案例
- <body>
- <div class="hello">
- <title>天气案例title>
- <h2>{{ info }}h2>
- <button @click="change">点击切换button>
- div>
- body>
- <script>
- const vm = new Vue ({
- el: '#root',
- data: {
- isHot: true
- },
- //计算属性
- computed: {
- info () {
- return this.isHot ? '炎热' : '凉爽'
- }
- },
- methods: {
- change () {
- this.isHot = !this.isHot
- }
- },
- watch: {
- isHot: {
- // immediate初始化让handler调用一下
- immediate: true,
- // handler当isHot发生改变时,handler发生调用。newVallue为没有调用handler的isHot值, oldVallue为调用handler后的isHot值
- handler (newVallue, oldVallue) {
- console.log('isHot被修改', newVallue, oldVallue)
- }
- }
- }
-
- })
-
- script>
深度监听
1.vue中watch默认不检测对象内部值的改变(一层)
2.配置deep.true可以检测对象内部值的改变(多层)
3.vue自身可以监视对象内部值的改变,但vue提供的watch默认的不可以
- <body>
- <h3>{{number.a}}h3>
- <button @click="number.a++">点我让a+1button>
- <h3>{{number.b}}h3>
- <button @click="number.b++">点我让b+1button>
- body>
- <script>
- const vm = new Vue({
- el:'#root',
- data: {
- number: {
- a:1,
- b:1
- }
- },
- watch: {
- //监听多级结构中某种属性的变化,加单引号才能监听a值,
- /*'number.a': {
- handler(){
- console.log('a被改变了')
- }
- }
- */
- //由于vue提供的watch无法监听多级结构的所有属性,也就是无法监听number中a和b,故加上深层监听deep
- number: {
- deep: true,
- handler(){
- console.log('number改变了')
- }
- }
- }
- })
-
- script>
监视事件的缩写
缩写的条件仅仅只有handler方法时才可以缩写
- <script>
-
- //第一种写法
- watch:{
- isHot:{
- /*原来的写法
- immediate: true,
- deep: true,
- handler(newValue,oldvalue){
- console.log('isHot被修改了,newValue,oleValue')
- }
- }*/
- //缩写后
- isHot(newValue,oldvalue){
- console.log('isHot被修改了,newValue,oleValue')
- }
- }*/
- }
- //第二次写法的缩写
- /*vm.$watch('isHot',{
- immediate: true,
- deep: true,
- handler(newValue,oldvalue){
- console.log('isHot被修改了,newValue,oleValue')
- }
- })*/
- //缩写后
- vm.$watch('isHot',function(newValue,oldvalue){
- console.log('isHot被修改了,newValue,oleValue')
- })
计算机属性computed和watch的区别
computed能完成的功能,watch也可以完成
watch能完成的功能,computed不一定能完成,如: watch的异步操作
vue管理的函数写成普通函数,不是vue管理的函数写成箭头函数,目的是都可以让this的指向都指向vm或组件的实例对象
不被vue所管理的函数有(定时器的回调函数,ajax的回调函数,promise的回调函数)
- <script>
- //watch的异步操作
- watch: {
- firstName(val){
- //设置定时器的回调函数,由于setTimeout()括号内的函数不是vue所管理的函数,故括号内的函数用箭头函数
- setTimeout(()=>{
- this.firName = val + this.lastName
- },1000)
- }
- }
- script>