每日一学vue2:子组件给父组件传递数据(传统方法+自定义事件方法)

2022-11-20 13:12:25 浏览数 (1)

 1.传统的方式子组件传递数据给父组件

子组件给父组件传递信息,首先父组件要给子组件一个函数,然后子组件在调用这个函数         通过父组件给子组件传递函数类型的props实现:子给父传递数据

例子:         我们定义一个函数:getSchoolName

App.vue:

代码语言:javascript复制
<template>
                        ...
                                <LqjSchool :getSchoolName="getSchoolName"></LqjSchool>
                                <StudentLqj></StudentLqj>
                                </div>
                </template>
代码语言:javascript复制
<script>
                        ...
                                methods:{
                                getSchoolName(name){
                                console.log('App收到了学校名:',name)
                                }
                                }
                        ...
                </script>

LqjSchool.vue:

代码语言:javascript复制
<template>
                        <div class="School">
                                <button @click="sendSchoolName">把学校名给App</button>
                        </div>
                </template>
代码语言:javascript复制
<script>
                        ...
                                props:['getSchoolName']
                                methods:{
                                sendSchoolName(){
                                        this.getSchoolName(this.name)
                                }
                                }
                        ...
                </script>

-       -解释:由于v-on在StudentLqj组件上,所以可以说v-on在组件StudentLqj的vc身上绑定了个事件,时间名字叫:atlqj,如果有人以后 -       -触发了这个事件,那么demo函数就会被调用。">2.自定义事件         v-on:atlqj="demo"解释:v-on或@在哪个组件上就是给那个组件绑定事件,         例如:<StudentLqj v-on:atlqj="demo"></StudentLqj>         解释:由于v-on在StudentLqj组件上,所以可以说v-on在组件StudentLqj的vc身上绑定了个事件,时间名字叫:atlqj,如果有人以后         触发了这个事件,那么demo函数就会被调用。

第一种写法:使用@或v-on

举例:         App.vue:

代码语言:javascript复制
<template>
        通过父组件给子组件绑定一个自定义事件实现:子给父传递数据 
                <StudentLqj v-on:atlqj="getStudentName"></StudentLqj>
                //或者
                //<StudentLqj @atlqj="getStudentName"></StudentLqj>
                //如果像点击之点击一次后不让用户再次点击:
                //<StudentLqj @atlqj.once="getStudentName"></StudentLqj>

        </template>
代码语言:javascript复制
<script>
                methods:{
                ...
                        getStudentName(name){
                                console.log('App收到了学生名:',name)
                                }
                ...
                }
        </script>

给哪个组件绑定的找哪个组件触发:

StudentLqj.vue:

代码语言:javascript复制
<template>
                <button @click="sendStudentName">把学生名给App</button>
        </template>
代码语言:javascript复制
<script>
                ...
                        methods:{
                                sendStudentName(){
                                        //触发Student组件实例身上的atlqj事件
                                        this.$emit('atlqj',this.name)
                                }
                        }
                ...
        </script>

第二种写法:使用ref(更灵活)

App.vue:

代码语言:javascript复制
<template>
                <StudentLqj ref="student"></StudentLqj>
        </template>
代码语言:javascript复制
<script>
                ...
                  mounted(){
                        setTimeout(()=>{
                                //this.$refs.student.$on('atlqj',this.getStudentName)
                                //解释:$on:可以一直点击
                                this.$refs.student.$once('atlqj',this.getStudentName)
                                //解释:$once:只能点击一次,再点击就不生效了
                        },3000)
                        //等三秒之后点击才可以起效
                        }
                ...
        </script>

StudentLqj.vue:

代码语言:javascript复制
<template>
                <div class="Student">
                        <button @click="sendStudentName">把学生名给App</button>
                </div>
        </template>
代码语言:javascript复制
<script>
                ...
                        methods:{
                                sendStudentName(){
                                        //触发Student组件实例身上的atlqj事件
                                        this.$emit('atlqj',this.name)
                                }
                        }
                ...
        </script>

只要路飞哈在笑,我的生活无烦恼!

0 人点赞