【Vue.js】自定义事件,全局事件总线,订阅与发布

目录

一,自定义事件

1 绑定事件 

2 @ 或 v-on  

3 代码展示 小案例

 二,全局事件总线

1 安装

2 组件的使用

三,订阅与发布

1,含义

2,安装 pubsub:npm i pubsub-js

3,发布消息 接收消息 取消订阅 将由下列代码展示


一,自定义事件

1 绑定事件 

定义:子给父传递数据:通父组件给子组件绑定自定义事件

简单来讲就是:子组件通过自定义事件给父组件传递数据

2 @ 或 v-on  

3 代码展示 小案例

下面是父组件中的代码块

<template>
	<div id="app">
		<h1>{{msg}}</h1>
		<hr />
		<h2>班级信息:{{title}}</h2>
		<!-- 从子组件中拿到数据 绑定事件(给子组件绑定一个事件getName  showName是个回调函数) -->
		<Person @getName="showName"/>
		<!-- 当子组件调用这个自定义事件时(getName),就可以调用这个回调函数(showName) -->
	</div>

</template>

<script>
	import Person from './components/Person.vue';
	export default {
		name: 'app',
		data() {
			return {
				title: 'web2209',
				msg: '自定义事件'
			}
		},
		components: {
			Person
		},
		methods:{
			showName(name){//这个参数是子组件传的值
				console.log("App得到了姓名",name);
			}
		}
	}
</script>

<style>

</style>

接下来是子组件的代码块

<template>
	<div>
		姓名:{{name}},年龄:{{age}}
		<button @click="sendName">发送信息给父组件</button>
	</div>
</template>

<script>
	export default {
		name: 'Person',
		data() {
			return {
				name: '张三',
				age: 19
			}
		},
		methods: {//调用父组件中的自定义事件
			sendName() {
				this.$emit('getName',this.name)
			}
		},
	}
</script>

<style>
</style>

效果图

 二,全局事件总线

作用: 一种组件间通信的方式 适用于任意组件间通信。

1 安装

安装全局事件总线:在入口文件main.js中,给VM添加$bus,任意组件都可以在原型中调用

new Vue({
  render: h => h(App),
  //给VM添加$bus
  beforeCreate() {
  	Vue.prototype.$bus = this
  }
}).$mount('#app')

2 组件的使用

给全局事件总线,绑定自定义事件getName 谁需要接收数据就再谁绑定。

子组件①:LiSi中

<template>
	<div>
		姓名:{{name}} 年龄:{{age}}
		<button @click="sendName">发姓名到"张三"组件</button>
	</div>
</template>

<script>
	export default{
		name:'LiSi',
		data(){
			return{
				name:'李四',
				age: 20
			}
			
		},
		methods:{
			sendName(){
				this.$bus.$emit("getName",this.name)
			}
		},
		mounted() {
			this.$bus.$on("getAge",(age)=>{
				console.log("李四组件得到的age:",age);
			})
		}
	}
</script>

<style>
</style>

子组件②:ZhangSan中   

注意:组件销毁之前卸载自定义事件

<template>
	<div>
		姓名:{{name}} 年龄:{{age}}
		<button @click="sendAge">发送年龄给"李四"组件</button>
		<button @click="estroyGetName">销毁getName</button>
		
	</div>
</template>

<script>

	export default{
		name:'ZhangSan',
		data(){
			return{
				name:'张三',
				age: 19
			}
			
		},
		mounted() {
			this.$bus.$on('getName',(name)=>{
				console.log("张三组件得到的name:",name);
			})
		},
		methods:{
			sendAge(){
				this.$bus.$emit("getAge",this.age)
			},
			estroyGetName(){
				this.$destroy();
			}
		},
		beforeDestroy() {
			// console.log('正在销毁中.....');
			this.$bus.$off();//销毁全部组件
			// this.$bus.$off("getName");//销毁getName
			// this.$bus.$off("getAge");//销毁getAge
		}
		
	}
</script>

<style>
</style>

父组件中的代码块为

<template>
	
	<div id="app">
		<ZhangSan/>
		<hr>
		<LiSi/>
	</div>

</template>

<script>
import ZhangSan from './components/ZhangSan.vue';
import LiSi from './components/LiSi.vue';
export default {
	name: 'app',
	data(){
		return{
		}
	},
	components:{
		ZhangSan,
		LiSi
	}
}
</script>

<style>

</style>

三,订阅与发布

1,含义

一种组件间通信的方式,适用于任意组件间通信,如今有很多消息订阅与发布的包,在这里只介绍一种,pubsub-js。

2,安装 pubsub:npm i pubsub-js

3,发布消息 接收消息 取消订阅 将由下列代码展示

子组件①ClassInfor(班级信息)

<template>
	<div>
	班级:{{name}}
	<button @click="send">发布信息</button>
	</div>
</template>

<script>
	// 引入: import pubsub from 'pubsub-js'
	import pubsub from 'pubsub-js'
	export default{
		name:'ClassInfor',
		data(){
			return{
				name:'web2209',
			}
		},
		//发布
		methods:{
			send(){
				pubsub.publish('name',this.name) //第一个参数为 发布消息的名称,第二个参数:为发布内容
			}
		}
}
</script>

<style>
</style>

子组件② ZhangSan

<template>
	<div>
		姓名:{{name}} 年龄:{{age}}
		<button @click="mydestroy">销毁组件</button>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default{
		name:'ZhangSan',
		data(){
			return{
				name:'张三',
				age: 19
			}
		},
		// 接收 来自班级信息中 发布的数据
		mounted() {
		this.mypubsub =	pubsub.subscribe('name',(msg,data)=>{
				console.log("班级信息:",data); //每次接收消息的时,会生成一个订阅的ID
			} )
		},
		//销毁组件
		beforeDestroy() {
				pubsub.unsubscribe(this.mypubsub);
		},
		
		methods:{
			mydestroy(){
				this.$destroy();
			}
		}
	}
</script>

<style>
</style>

父组件

<template>
	<div id="app">
			<ClassInfor/>
			<hr>
			<ZhangSan/>
	</div>

</template>

<script>
	import ZhangSan from './components/ZhangSan.vue';
	import ClassInfor from './components/ClassInfor.vue';
	export default {
		name: 'app',
			data(){
				return{
			}
		},
			components:{
				ZhangSan,
				ClassInfor
			}	
}
</script>

<style>

</style>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue.js是一种流行的JavaScript前端框架,它可以用来构建用户界面。要自定义问卷,我们可以利用Vue.js的强大功能来创建动态和交互式的问卷。 首先,我们可以使用Vue.js的模板语法来定义问卷的结构。我们可以使用v-for指令来迭代问题列表,并使用v-model指令将用户的回答绑定到数据模型中。 当用户提交问卷时,我们可以使用Vue.js事件处理机制来处理用户的输入。我们可以在提交按钮上添加一个click事件监听器,并在事件处理方法中获取用户的回答并进行处理。 另外,我们还可以使用Vue.js的计算属性来实时计算问卷的结果。例如,如果问卷中有选择题,我们可以使用计算属性来统计每个选项的选择次数,并显示结果图表。 除此之外,我们还可以使用Vue.js的动态组件来创建多个页面的问卷。我们可以将每个问题作为一个组件,并在用户回答问题后动态加载下一个组件,从而实现问卷的动态性。 最后,Vue.js还提供了一些有用的插件和扩展,可以帮助我们更方便地创建问卷。例如,可以使用vue-router插件来实现问卷的路由和导航功能,使用element-ui库来美化问卷界面。 总而言之,利用Vue.js的强大功能,我们可以轻松地自定义问卷。它提供了方便的数据绑定、事件处理、计算属性和动态组件等功能,使问卷易于构建和维护。 ### 回答2: Vue.js是一个流行的JavaScript框架,它用于构建用户界面。我们可以利用Vue.js自定义问卷。下面是一个简单的示例: 首先,我们需要创建一个Vue实例,用于驱动我们的问卷应用程序。在这个实例中,我们可以定义问题、选项和用户的回答。 ```javascript var app = new Vue({ el: '#app', data: { questions: [ { text: '你喜欢哪种颜色?', options: ['红色', '蓝色', '绿色'] }, { text: '你喜欢哪种动物?', options: ['狗', '猫', '鸟'] } ], responses: [] }, methods: { submit: function() { // 处理用户回答的方法 // 可以将回答保存到responses数组中 } } }) ``` 在HTML中,我们可以利用Vue绑定来渲染问卷的问题和选项,并为用户提供选择的界面。 ```html <div id="app"> <h2>问卷调查</h2> <div v-for="(question, index) in questions"> <h3>{{ question.text }}</h3> <ul> <li v-for="(option, optionIndex) in question.options" :key="optionIndex"> <input type="radio" :name="'question-' + index" :value="option" v-model="responses[index]"> {{ option }} </li> </ul> </div> <button @click="submit">提交</button> </div> ``` 在这个例子中,我们使用了v-for指令来遍历问题和选项,并用v-model指令来绑定用户选择的结果。 最后,我们在submit方法中可以处理用户的回答。我们可以在这个方法中进行一些逻辑操作,比如发送HTTP请求将回答保存到后端服务器。 这只是一个简单的示例,你可以根据具体需求来扩展和定制你的问卷应用程序。Vue.js提供了丰富的功能和灵活的API,可以帮助我们轻松构建交互性强的用户界面。 ### 回答3: Vue.js是一种流行的JavaScript框架,可以用于构建用户界面。通过使用Vue.js,我们可以方便地创建自定义问卷。 首先,我们可以使用Vue.js的组件功能来创建不同类型的问题。例如,我们可以创建一个单选题组件、多选题组件和文本题组件等等。每个组件都可以有自己的属性,比如问题内容、选项等等。 然后,我们可以使用Vue.js的数据绑定功能来动态地更新问卷的内容。我们可以通过绑定问卷的问题和选项列表来实现这一点。当用户选择一个选项时,我们可以通过Vue.js事件处理功能来捕获并更新问卷的状态。 除了问题和选项,我们还可以使用Vue.js的条件渲染功能来实现问卷的逻辑控制。例如,某些问题可能只在某些条件下显示,我们可以根据用户的选择来动态地控制问题的显示与隐藏。 此外,Vue.js还可以方便地处理问卷的提交和验证。我们可以使用Vue.js的表单验证功能来验证用户的输入,并根据验证结果来处理问卷的提交操作。 最后,我们可以使用Vue.js的路由功能来实现问卷的多页展示。我们可以将不同的问题分布在不同的页面上,通过路由来导航用户。 总的来说,Vue.js提供了强大的功能和灵活的语法,使我们能够方便地创建自定义问卷。它可以帮助我们构建交互式、动态和易于使用的问卷系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值