Vue中组件之间互相传参数的方法

本文详细介绍了Vue中组件间通信的多种方式,包括父组件向子组件传值、子组件向父组件传值、使用refs进行通信以及兄弟组件间通过事件总线(订阅发布模式)传递数据。示例代码展示了如何利用属性props、$emit、$refs以及v-model实现数据流动,帮助开发者更好地理解和运用Vue组件间的通信机制。
摘要由CSDN通过智能技术生成

vue中组件互相传值的方法

  • 父组件给子组件传值
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>vue-组件之间的传递信息</title>
    		<script type="text/javascript" src="../js/vue.js"></script>
    	</head>
    	<body>
    		<div id="box">
    			<!-- 传布尔值的时候需要在前面加一个: -->
    			<mychild title="首页" :msg='msg' :myshow=true title='首页'></mychild>
    			<mychild title="购物车" :msg='msg' :myshow=true title='返回'></mychild>
    			<mychild title="返回" :msg='msg' :myshow=false title='购物车'></mychild>
    		</div>
    		<script type="text/javascript">
    			// 创建全局组件
    			Vue.component("mychild", {
    				template: "<div v-if='myshow'>导航-{{title}}-{{msg}}</div>",
    				// props:['title','myshow'] // 直接接收父组件传过来的数据
    				// 给父组件传过来的值设置一个类型 ,如果传过来的不是类型,会抛出一个异常
    				// props: {
    				// 	title: String,
    				// 	myshow: Boolean
    				// }
    				// 给组件设置默认值
    				props: {
    					title: {
    						type: String,
    						default: ''
    					},
    					myshow: {
    						type: Boolean,
    						default: true
    					},
    					msg: {
    						type: String,
    						default: ''
    					}
    				}
    			})
    			let vue = new Vue({
    				el: "#box",
    				data: {
    					'msg': '动态的传值'
    				}
    			})
    		</script>
    	</body>
    </html>
    
  • 子组件给父组件传值
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>子组件给父组件传递信息</title>
    	<script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
    	<div id="box">
    		<child @myevent="fatherClick"></child>
    	</div>
    	<script type="text/javascript">
    		Vue.component("child",{
    		data () {
    			return {
    				money: 100000
    			}
    		},
    		template: `
    			<div style="background-color:white">
    				<button @click="handlerClick">点我给父组件传值</button>
    			</div>
    			`,
    		methods:{
    			handlerClick () {
    				let _this = this;
    				_this.$emit('myevent',_this.money)
    			}
    		}
    				
    		})
    	</script>
    	<script type="text/javascript">
    		let mv = new Vue({
    			el: "#box",
    			methods:{
    				fatherClick (data) {
    					console.log('哈哈',data)
    				}
    			}
    		})
    	</script>
    </body>
    </html>
    
  • 使用refs方法进行传值
      <!DOCTYPE html>
      	<html>
      		<head>
      			<meta charset="utf-8">
      			<title>vue-refs</title>
      			<script type="text/javascript" src="../js/vue.js">	</script>
      		</head>
      		<body>
      			<div id="box">
      				<!-- 如果把ref放在了标签上面,拿到的就是原生DOM -->
      				<!-- 如果把ref放在了组件上面,拿到的就是组件对象 -->
      				<input type="text" ref="myinpupt">
      				<button type="button" @click="handlerClick">add</button>
      				<child ref='mychild'></child>
      			</div>
      			<script type="text/javascript">
      				Vue.component('child',{
      					template: `
      							<div style="background-color:red">
      							</div>
      							`,
      					methods:{},
      					data () {
      						return {
      							childname: '1111111111111111111111'
      						}
      					}
      				})
      			</script>
      			<script type="text/javascript">
      				let mv = new Vue({
      					el: '#box',
      					methods:{
      						handlerClick () {
      							console.log(this.$refs)
      							// 通过refs的值进行修改
      							this.$refs.mychild.childname = '22222222222222222222'
      						}
      					}
      				})
      			</script>
      		</body>
      	</html>
      	```
    
  • 兄弟组件在进行传值的时候,不能相互传值的,需要找到一个中间人
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>订阅分发模式</title>
    		<script type="text/javascript" src="../js/vue.js"></script>
    	</head>
    	<body>
    		<div id="box">
    			<child1></child1>
    			<child2></child2>
    		</div>
    		<script type="text/javascript">
    			let bus = new Vue; // 当我们想使用订阅发布模式的时候,需要先创建一个vue的实例
    			Vue.component('child1',{
    				template: `<div><button @click='handlerClick'>点我给兄弟组件传值</button></div>`,
    				data () {
    					return {}
    				},
    				methods:{
    					handlerClick(){
    						bus.$emit('dingyue','这里是给订阅者的值')
    					}
    				},
    				mounted () {
    					// vue的生命周期,表示当vue的这个组件加载完毕后会自动执行这个方法
    				}
    			})
    			
    			Vue.component('child2',{
    				template: `<div>{{data}}</div>`,
    				data () {
    					return {
    						data: ''
    					}
    				},
    				methods:{},
    				mounted () {
    					// vue的生命周期,表示当vue的这个组件加载完毕后会自动执行这个方法
    					bus.$on('dingyue', res => {
    						this.data = res;
    						console.log('aaaaaaa',res)
    					})
    				}
    			})
    		</script>
    		<script type="text/javascript">
    			let mv = new Vue({
    				el: "#box"
    			})
    		</script>
    	</body>
    </html>
    
  • 使用v-model传值
    1.父传子
    	<!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>使用v-model传值</title>
    		<script type="text/javascript" src="../js/vue.js"></script>
    	</head>
    	<body>
    		<div id="box">
    			<!-- v-model相当于 <input type="text" : ="myinput" @input="">-->
    			<input type="text" v-model="myinput1">
    			<child v-model="myinput1"></child>
    		</div>
    		<script type="text/javascript">
    			Vue.component('child', {
    				template: `<div class="box">
    						<label>{{value}}</label>
    						<input type="text" v-model="myinput" @input="handlerInput">
    						<button>点我一下试试</button>		
    						</div>`,
    				methods: {
    					handlerInput () {
    						this.$emit("input",this.myinput)
    					}
    				},
    				props: ['value'],
    				data() {
    					return {
    						myinput: '',
    					}
    				},
    
    			})
    		</script>
    		<script type="text/javascript">
    			let vue = new Vue({
    				el: "#box",
    				data: {
    					myinput1: "default"
    				},
    				methods: {
    					
    				}
    			})
    		</script>
    	</body>
    </html>
    
  1. 子传父
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>使用v-model子传父</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<div id="box">
			<!-- v-model相当于 <input type="text" : ="myinput" @input="">-->
			<input type="text" v-model="myinput1">
			<child v-model="myinput1"></child>
			<button @click="heandliClick">提交</button>
		</div>
		<script type="text/javascript">
			Vue.component('child', {
				template: `<div class="box">
						<label>{{value}}</label>
						<input type="text" v-model="myinput" @input="handlerInput">
						</div>`,
				methods: {
					handlerInput() {
						this.$emit("input", this.myinput)
					}
				},
				props: ['value'],
				data() {
					return {
						myinput: '',
					}
				},

			})
		</script>
		<script type="text/javascript">
			let vue = new Vue({
				el: "#box",
				data: {
					myinput1: "default"
				},
				methods: {
					heandliClick() {
						console.log(this.myinput1)
					}
				}
			})
		</script>
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,实现子组件调用父组件方法并传递参方法有多种。一种常见的方法是通过自定义事件来实现。首先,在子组件使用$emit方法触发自定义事件,并传递参。然后,父组件在模板使用v-on指令监听该自定义事件,并在触发时调用相应的方法获取参。 具体步骤如下: 1. 在子组件,通过$emit方法触发自定义事件,并传递参。例如,可以在需要调用父组件方法的地方使用$emit('customEvent', parameter)来触发自定义事件并传递参。 2. 在父组件,使用v-on指令监听该自定义事件,并在触发时调用相应的方法。例如,可以在父组件的模板使用v-on:customEvent="methodName"来监听名为customEvent的自定义事件,并在触发时调用methodName方法。 3. 在父组件方法,通过参接收子组件传递的值。例如,在methodName方法,可以使用参来接收子组件传递的值。 下面是一个示例代码,展示了如何在Vue实现子组件调用父组件方法传递参的过程: 父组件代码: ``` <template> <div> <child-component @customEvent="handleCustomEvent"></child-component> </div> </template> <script> import ChildComponent from 'path/to/ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleCustomEvent(parameter) { // 在这里处理子组件传递的参 console.log(parameter); } } } </script> ``` 子组件代码: ``` <template> <div> <button @click="callParentMethod">调用父组件方法</button> </div> </template> <script> export default { methods: { callParentMethod() { // 通过$emit触发自定义事件,并传递参 this.$emit('customEvent', '参值'); } } } </script> ``` 在这个示例,当子组件的按钮被点击时,它会调用callParentMethod方法,然后通过$emit('customEvent', '参值')触发自定义事件,并传递参。父组件通过@customEvent="handleCustomEvent"监听自定义事件,并在触发时调用handleCustomEvent方法,接收子组件传递的参。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【vue2】子组件向父组件传参方法汇总](https://blog.csdn.net/weixin_44431073/article/details/125006029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue - 父子组件互相传参、调用](https://blog.csdn.net/hutuyaoniexi/article/details/127651959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值