初识vue 2.0(13):子组件使用watch监听父组件变化

子组件使用created或者mounted通常只能在组件初始化的时候,获取父组件传过来的props数据。

父组件props数据发生变化,子组件默认无法感知,因此需要手动实现子组件监听父组件变化的功能。

一般的值类型数据,可以直接使用watch监听:

watch: {
    msg(newVal, oldVal){//对引用类型的值无效
        console.info(‘value changed ‘, newVal)
    }
}

引用类型,普通watch方法,无法监听到引用类型内部的变化。

解决此问题,可以在父组件中将变化的对象变成一个新的对象,自主实现深拷贝,例如:

methods: {
    addAge(){
        this.child.age ++;
        this.child = JSON.parse(JSON.stringify(this.child));
    }
}

但是这样做不是很优雅,vue提供了方便的深拷贝的方式去监听引用类型值的变化,例如:

watch: {
    msg: {
        handler(newVal, oldVal) {
            console.info(‘value changed 2‘, newVal)
        },
        deep: true
    }
}

完整例子:

1. 父组件Game.vue向子组件传递props值

<template>
    <div class="game">
        <button @click="addAge">birthday++</button>
        <DNF :msg="child"></DNF>
    </div>
</template>
<script>
import DNF from ‘./DNF‘
export default {
    name: ‘Game‘,
    components: {
        DNF
    },
    data () {
        return {
            child:{name:‘dnf‘,age:18},
        }
    },
    methods: {
        addAge(){
            this.child.age ++;
            //this.child = JSON.parse(JSON.stringify(this.child));
        }
    }
}
</script>

2. 子组件DNF.vue 使用watch监听父组件中msg的变化,因为msg是一个object,因此设置 deep:true。

<template>
    <div class="dnf"></div>
</template>
<script>
export default {
    name: ‘DNF‘,
    props: ["msg"],
    watch: {
        msg(newVal, oldVal){//对引用类型的值无效
            console.info(‘value changed 1‘, newVal)
        },
        msg: {
            handler(newVal, oldVal) {
                console.info(‘value changed 2‘, newVal)
            },
            deep: true
        }
    },
}
</script>

官方文档:https://cn.vuejs.org/v2/guide/computed.html#侦听器

原文地址:https://www.cnblogs.com/phptree/p/10428726.html

时间: 2024-10-06 20:42:59

初识vue 2.0(13):子组件使用watch监听父组件变化的相关文章

浅谈VUE,使用watch方法监听父组件传到子组件的数据。

props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData'] 第二步动态改变值: mounted(){ this.form._name = this.updateData._name; }, 第三步使用watch监听 updateData数据 watch:{ updateData: function (newVal ,oldVal){ //不能用箭头函数 this.for

Vue的父子组件v-model双向绑定,父组件修改子组件中绑定的v-model属性

先来看下实现的效果,父组件中有个文本框,在点击下面按钮时弹出抽屉,抽屉里也有个文本框,文本框里的初始值要和父组件的文本框同步,并且修改抽屉里的文本框值时 父组件里的文本框值也要跟着改变 网上有大概三种方法 父组件调用子组件传值,子组件通过props接收父组件传来的值,并通过emit发送方法名和值,父组件根据传来的方法名定义方法接收值并进行赋值操作. Sync  这个没试过不了解 v-model  子传父: 父组件定义v-model,子组件中当数据更新时,向父组件emit一个input事件,将更新

父组件接收子组件事件的参数===子组件给父组件传值===子组件调用(绑定)父组件的方法

子组件调用(绑定)父组件的方法===父组件接收子组件事件的参数===子组件给父组件传值 就相当于父组件给子组件传递了一个方法,子组件触发这个方法,也就相当于父组件调用了这个方法 可以说是互相影响,数据双向绑定 子组件 <div @click="clickCell(参数)"> props:{ clickCell:{ type:Function, default: function(){} } } 父组件 <子组件名 :clickCell="dealClickC

react项目Bug:组件销毁清除监听(Can&#39;t perform a React state update on an unmounted component.)

最近一直在做react项目,发现一个bug,困扰了我两天. Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount metho

extjs组件添加事件监听的三种方式 http://blog.sina.com.cn/s/blog_48d7f92901011cfn.html

extjs对组件添加监听的三种方式 在定义组件的配置时设置 如代码中所示: Java代码 xtype : 'textarea', name : 'dataSetField', labelSeparator:'', fieldLabel:'', hideLabel: true, allowBlank: true, height: mainPanelHeight*0.8, anchor:'99%', listeners:{'blur':function(){ alert(1); }} 对组件变量通过

初识vue 2.0(4):vuex组件通信

0,本来想只用vue就可以做项目了,后来发现不行:一个网页被切分成若干个组件,组件之间是需要数据传递的,因此引入了vuex这个集中式存储.管理的状态管理模式. 1,安装vuex: npm install --save vuex 在main.js中引入: import Vuex from 'vuex' Vue.use(Vuex) 2,创建数据源文件vuex/store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) co

初识vue 2.0(2):路由与组件

1,在上一篇的创建工程中,使用的的模版 webpack-simple 只是创建了一个简单的demo,并没有组件和路由功能,此次采用了webpack模版,自动生成组件和路由.^_^ 在模版初始化时,因为ESLint语法检查过于严格,可以暂时不要开启. vue init webpack myapp ? Install vue-router? Yes ? Use ESLint to lint your code? No ? Setup unit tests with Karma + Mocha? Ye

初识vue 2.0(12):使用$nextTick获取更新后的DOM

Vue 异步执行 DOM 更新. 只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变. 如果同一个 watcher 被多次触发,只会被推入到队列中一次.这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要. 然后,在下一个的事件循环"tick"中,Vue 刷新队列并执行实际 (已去重的) 工作. Vue 在内部尝试对异步队列使用原生的 Promise.then 和 MessageChannel,如果执行环境不支持,会采用 setTim

初识vue 2.0(3):Ajax请求

0,模拟ajax请求,需要构建web程序,使用express 方便快捷. 1,安装express 构建web server: npm install -g express npm install -g express-generator 2,创建 express 项目: express myserver cd myserver npm install 3,启动项目,一般情况下可以使用: npm start 但开发环境需要监控代码变动并自动重启进程,因此需要安装 supervisor. npm i