vue教程-子组件操作父组件的数据(废弃)

介绍

子组件可以直接操作父组件的数据,但vue不推荐这么做。

单向数据流

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中

vue认为:子组件变更父级组件的状态,导致应用的数据流向难以理解,子组件不应改动 prop

官网解释:
https://cn.vuejs.org/v2/guide/components-props.html#%E5%8D%95%E5%90%91%E6%95%B0%E6%8D%AE%E6%B5%81

父组件监听子组件事件

通过 父组件监听子组件事件,来实现 子组件 操作 父组件的数据

定义子组件

var std_com={
    template:`<div>子组件<input type='button' value='点击' @click='$emit("change")'></div>`
}
Vue.component("std-com",std_com)

关键: 在子组件中定义 点击事件:@click='$emit("change") ,通过调用 $emit() 方法,参数 change 是 自定义事件名称,表示:点击该按钮时,触发 自定义 事件 change,父组件会 监听到 该事件

使用子组件

<std-com @change="changeMsg()"></std-com>

关键: @change="changeMsg()",父组件监听 自定义事件 change,并指定处理函数changeMsg()

完整代码

<div id="app" >
    <input type="text" v-model="msg">
    <std-com @change="change()"></std-com>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
    var std_com={
        template:`<div>子组件<input type='button' value='点击' @click='$emit("change")'></div>`
    }
    Vue.component("std-com",std_com)

    var app = new Vue({
        el: '#app',
        data: {
            msg:'李雷'
        },
        methods: {
            change:function(){
                this.msg="韩梅梅"
            }
        }
    })
</script>

缺点:子组件 没有 向父组件传递数据

父组件获取子组件的数据

定义子组件

var std_com={
    data:function(){
        return {
            name:'韩梅梅'
        }
    },
    template:`<div>子组件
        <input type='text' v-model="name">
        <input type='button' value='点击' @click='$emit("change",name)'></div>`
}
Vue.component("std-com",std_com)

关键: @click='$emit("change",name)' ,通过 $emit()方法的第二个参数,向父组件传递数据

使用子组件

<std-com @change="changeMsg($event)"></std-com>

关键: @change="changeMsg($event)" ,通过 $event 获取子组件传递的数据

完整代码

<div id="app" >
    <input type="text" v-model="msg">
    <std-com @change="changeMsg($event)"></std-com>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
<script>
    var std_com={
        data:function(){
            return {
                name:'韩梅梅'
            }
        },
        template:`<div>子组件
            <input type='text' v-model="name">
            <input type='button' value='点击' @click='$emit("change",name)'></div>`
    }
    Vue.component("std-com",std_com)

    var app = new Vue({
        el: '#app',
        data: {
            msg:'李雷'
        },
        methods: {
            changeMsg:function(param){
                console.log(param)
                this.msg=param
            }
        }
    })
</script>

原文出处:/show_1IXTk96m4ZI.html