Vue组件通讯(父传子和子传父)


Vue组件通讯

记录父传子和子传父的方法


一、父传子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父子组件通讯-父传子</title>
</head>
<body>
<div id="app">
	<!--
	这里调用自己写的组件
	传入两个数据msg1和msg2
	接收的变量名为:
			如果在命名时是驼峰命名法
			则需要把驼峰字母改小写,并且在驼峰字母前加  -  隔开
	-->
    <b-box v-bind:my-msg1="msg1" v-bind:my-msg2="msg2"></b-box>
</div>
<!--
	这里放这组件的内容
	即把组件标签化
	但是记得给标签加上id
	例如:这里的id="box"
-->
<template id="box">
    <div>
        <p>--------------------</p>
        <h1>{{myMsg1}}</h1>
        <ol>
            <li v-for="p in myMsg2">{{p}}</li>
        </ol>
    </div>
</template>

<script src="js/vue.js"></script>
<script>
	/*
		在实例外定义一个局部组件Box
		组件可以像app实例那样
		加入
		data(){},//放变量
		methods:{},//放方法
		props:{},
		//放该组件接收的数据类型,是否一定需要传入数据,若没传数据默认值
		//例:myMsg1:{type:String,required:true,default:'你没传东西给我'}
	    template:'#box'//这里若用了组件标签化,则填'#id的值'
	*/
    const Box = {
        //props用于接收数据
        props:{
            myMsg1:{type:String,required:true,default:'你没传东西给我'},
            myMsg2:{type:Array,required:true}
        },
        template:'#box'
    }

    const app = Vue.createApp({
        data(){
            return{
                msg1:'基础模板',
                msg2:['萧炎','小医仙','萧熏儿']
            }
        },
        /*
        * 在这里使用键值对的方法,导入标签
        * 例:'b-box':Box
        * 键:使用时<b-box></b-box>
        * 值:组件名Box
        * */
        components:{
            'b-box':Box
        }
    }).mount("#app");
</script>
</body>
</html>

运行效果
在这里插入图片描述

二、子传父

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>父子组件通讯-子传父</title>
</head>
<body>
    <div id="app" style="background-color: pink;height: 300px;width: 300px;padding: 20px 20px 20px 20px">
    	<!--
            这里监听的是,组件中发射的自定义事件boxClick
            遇到驼峰命名,处理方法同上
            v-on:box-click="boxFun"
        -->
        <b-box v-on:box-click="boxFun"></b-box>
    </div>
	<!--
	这里放这组件的内容
	即把组件标签化
	但是记得给标签加上id
	例如:这里的id="box"
	组件内加了按钮监听点击
    -->
    <template id="box">
        <div style="background-color: mediumpurple;height: 200px;width: 200px">
            <button v-on:click="btnClick">点我</button>
        </div>
    </template>

    <script src="js/vue.js"></script>
    <script>
        const Box = {
            template:"#box",
            methods:{
                btnClick(){
                    alert('你点击了我');
                    //发射一个自定义事件
                    const obj = {name:'萧炎',age:21,sex:'male'}
                    //这里发射事件,使用即在上面的v-on:boxClick,后面的值就是传给父来用的值
                    this.$emit('boxClick',obj);
                }
            }
        }
        const app = Vue.createApp({
            data(){
                return{
                    msg:'基础模板'
                }
            },
            components:{
            //键值注册组件
                'b-box':Box
            },
            methods: {
            	//接收子组件传来的值,并在控制台打印
                boxFun(item) {
                    console.log('你点击了子组件中的按钮');
                    console.log(item);
                }
            }
        }).mount("#app");
    </script>
</body>
</html>

运行效果
在这里插入图片描述

在这里插入图片描述


总结

对比写了父传子,和子传父,方便回顾记忆

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠溪泽岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值