入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

带着实例继续学习(2):父子组件通信之自定义事件

创建时间:2016-10-19 投稿人: 浏览次数:944

要点

我们利用之前学到的知识点做了一个用户登录框,其中
1、我们通过this.$parent.$refs 访问相邻组件的数据
2、一般来讲,我们可以把父组件作为子组件的”集中营”(集中数据状态和事件)

接下来我们看套路:

第一步:父组件初始化数据

在父组件首先初始化,示例如下:
export default{
data(){
return{username:”“,userpass:”“}
}
}

第二步:在父组件中设置方法

methods:{
setUserName(uname){
this.username = uname;
}
},

比如我们现在的父亲组件user-login.vue

<template>
    <div id="user-login" class="col-md-8 col-md-offset-2">
        <h2 class="text-center">用户登录</h2>
        <form class="form-horizontal" role="form">
            <user-name ref="uname" placeholder="请输入你的用户名"></user-name>
            <user-pass></user-pass>
            <user-submit></user-submit>
        </form>
    </div>
</template>

<style>
    @import "./../css/bootstrap.min.css";
    #user-login{
        margin-top: 50px;
    }
</style>

<script>
   import username from "./user/use-name.vue";
   import usersubmit from "./user/user-submit.vue";
   import userpass from "./user/user-pass.vue";

    export default{
        data(){
            return{
                username:"",
                userpass:""
            }
        },
        methods:{
            setUserName(uname){
                this.username = uname;
            }
        },
        components:{
           "user-name":username,
            "user-submit":usersubmit,
            "user-pass":userpass
        }
    }
</script>

那么问题来了:怎么触发这个方法呢?

在子组件中设置一个自定义事件

updateUserName是一个自定义事件名称。
在子组件中通过this.$emit(“事件名”,参数)来触发父组件的事件。

父组件user-login.vue

 <user-name ref="uname" placeholder="请输入你的用户名" v-on:updateUserName="setUserName"></user-name>
    export default{
        data(){
            return{
                username:"",
                userpass:""
            }
        },
        methods:{
            setUserName(uname){
                this.username = uname;
            }
        },
        components:{
           "user-name":username,
            "user-submit":usersubmit,
            "user-pass":userpass
        }
    }

在子组件里调用的是方法是updateUserName

来到子组件user-name.vue

<input type="text" v-model="username" v-on:change="userNameChange" class="form-control" :placeholder="username">

文本框change事件调用方法userNameChange

<script>
    export default{
        props:["placeholder"],
        data:function () {
            return {username:"张三"}
        },
        methods:{
            userNameChange(){
                // 调用父组件的方法
                this.$emit("updateUserName",this.username)
            }
        }
    }
</script>

userNameChange 方法里调用父组件的自定义方法,把值传递过去。

这样在user-submit.vue就可以拿到父组件里的值了:

<script>
    export default{
        methods:{
            test(){
                alert(this.$parent.$data.username); // 拿到父组件了定义是属性username
            }
        }
    }
</script>

这里写图片描述

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。