Vue脚手架组件通信传参

一,父组件给子组件传参props

父组件app.vue
:todos=“tdod” :参数的名字(接受的时候用) = “参数的值”

<MyList :todos="todos"></MyList>
<script>
	import MyList from './components/MyList.vue'
	export default {
		name: 'App',
		components: {
			MyList
		},
		data() {
			return {
			todos: [{
						id: '001',
						title: '打代码',
						done: false
					},
					{
						id: '002',
						title: '睡觉',
						done: true
					},
					{
						id: '003',
						title: '吃饭',
						done: false
					}
				]
			}
		}
	}
</script>

子组件MyList.vue
props:[‘todos’] props:[‘参数的名字’]

<template>
	<div class="listContent">
		<MyItem v-for="todo in todos" :key="todo.id" :todo="todo"></MyItem>
	</div>
</template>

<script>
	import MyItem from '../components/MyItem'
	export default {
		name: 'MyList',
		components: {
			MyItem
		},
		props:['todos'],
	}
</script>

二,子组件给父组件传参

props

当子组件使用props给父组件传参是,需要父组件事先声明一个函数
注意props不仅可以传递数组对象整数等,还可以传递函数
父组件app.vue

...
<MyHeader :addTodo="addTodo"></MyHeader>
...
<script>
...
methods: {
			// 添加一个todo
			addTodo(todoObj){
				this.todos.unshift(todoObj)
			}
		},
...
</script>

子组件MyHeader.vue
触发,从父组件传来的函数,从而把参数传递过去

		<input type="text" placeholder="请输入您的任务名称,按回车确认" @keydown.enter="add" v-model="title">
...
props:['addTodo'],
methods:{
			add(){
				if(this.title.trim()){
					const todoObj = {
						id:nanoid(),
						title:this.title,
						done:false
					}
					this.addTodo(todoObj)
				}else{
					alert('请输入要完成的任务')
					this.title = ""
					return 
				}
				this.title=""
			}
		}
...

组件的自定义事件 通过$emit去触发

1.第一种方式 通过v-on === @ 来绑定自定义事件
@addTodo=“addTodo” @自定义事件的名字 = “回调函数”
父组件app.vue

...
<MyHeader @addTodo="addTodo"></MyHeader>
...

2.第二种方式 通过ref $on来添加自定义事件

...
<MyHeader ref="myHeader"></MyHeader>
...
<script>
...
	mounted(){
			this.$refs.myHeader.$on('addTodo',this.addTodo)
		}
...
</script>

子组件 MyHeader .vue

	<input type="text" placeholder="请输入您的任务名称,按回车确认" @keydown.enter="add" v-model="title">
...
methods:{
			add(){
				if(this.title.trim()){
					const todoObj = {
						id:nanoid(),
						title:this.title,
						done:false
					}
					this.$emit.addTodo(todoObj)
				}else{
					alert('请输入要完成的任务')
					this.title = ""
					return 
				}
				this.title=""
			}
		}
...
解绑自定义事件

在哪里触发事件,就在那里解绑事件

this.$off('demo')//解绑一个自定义事件
this.$off(['demo','其他事件',''])//解绑多个自定义事件
this.$off()//解绑所有自定义事件

注意点:

this.$destroy() //销毁了当前的student组件的实例,销毁后所有student实例的自定义事件全都不奏效

小技巧:给组件绑定点击事件

<Student @click.native="回调函数"></Student>

全局事件总线(任意组件间通信) $bus

1.安装全局事件总线 main.js

...
new Vue({
  render: h => h(App),
  beforeCreate() {
  	Vue.prototype.$bus = this//安装全局事件总线,$bus就是当前应用的vm
  }
}).$mount('#app')

2.谁收数据就给给谁绑定
app.vue



mounted(){
	this.$bus.$on('名字',执行的函数this.xxx 或者用箭头函数()=>{})
}

3.谁发数据,谁就去调用bus上面的函数
item.vue

this.$bus.$emit('名字',参数)

消息的订阅与发布 实现任意之间组件通信

1.安装插件 pubsub.js
npm i pubsub-js

2.引入pubsub
import pubsub from ‘pubsub-js’

3.谁收消息,谁订阅消息 谁订阅消息,谁去销毁消息

this.pubId =  pubsub.subscribe('hello',这也是要用箭头函数 或者使用this.提前定义好的函数 ,不然this为undefined(第一个参数为订阅消息的名字msgName,接收的消息值data)=>{})

beforeDestroy(){
	pubshub.unsubscribe(this.pubId )
}

4.谁发送数据,谁发布消息

pubsub.publish('hello',要传递的数据)

每天一点小知识!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值