(三)VUE自定义事件兄弟、父子组件通讯

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<body>
	<div id="app"></div>
	<div id="app2">
		<div>
			<!-- vue自定义组件写在html中必须双标记闭合写法 -->
			<Sibling1></Sibling1>
			<Sibling2></Sibling2>
		</div>
		
	</div>
</body>
<script>

	var title = {
		data(){
			return {
				lang: "大吉大利!今晚吃鸡?"
			}
		},
		template: "<div @click='tochangeName'>{{lang}}</div>",
		methods: {
			tochangeName(){
				this.$emit("onName")
			}
		}
	}
	var myInput = {//自定义的input组件
		// props: ['ty', 'va', 'pl'],//必须提前声明要接收的属性,不然报错
		props: {//属性验证,增强组件健壮性
			ty: {
				type: String,
				required: true
			},
			va: [Number, String],
			pl: String
		},
		template: "<input :type='ty' :value='va' :placeholder='pl' @input='changeName'/>",
		methods: {
			changeName(e){
				this.$emit("input", e.target.value)
			}
		}
	}
	var app = new Vue({
		el: "#app",
		data:{
			name: "林哥"
		},
		template: `<div>
						<h1>{{name}}胜利</h1>
						<con @onName='changeName'/>
						<my-input ty='type' va='linge' pl='输入大名哇' v-model='name'/>
						<my-input ty='password' pl='输入密码'/>
					</div>`
		,			//这里<my-input v-model='name'/>是语法糖写法,原始写法是<my-input @input='name = arguments[0]'/>这里是用自定义属性名为input,并且回调函数只有一行代码简写在行内@input='name = arguments[0]'。
		components: {
			'con': title,
			'my-input': myInput
		},
		methods: {
			changeName(){
				this.name = this.name ==="林哥" ? "linge" : "林哥"
			}
		}
	})

// 自定义组件双向绑定总结:
		//1.自定义组件接受一个value属性,并把值赋给组件内部的input标签
		//2.给组件内部的input绑定input事件,然后在事件回调函数中定义this.$emit执行一个自定义input事件,并传递value值
	

	//兄弟组件数据传递(不使用vuex):
	var bus = new Vue();//new Vue创建一个空的vue实例作为事件总线
	Vue.component('Sibling1', {
		data(){
			return {
				money: 0
			}
		},
		mounted(){
			bus.$on("getSblingdata", m=>{
				console.log(m)//1000
			})
		},
		template: `<div>{{money}}</div>`
		
	})
	var Sibling2 = {
		template: "<button @click='getSibling'>GET</button>",
		methods: {
			getSibling(){
				bus.$emit("getSblingdata", 1000);
			}
		}
	}

	new Vue({
		el: "#app2",
		components: {
			 Sibling2,
		}
	})

</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值