Vue组件间传值的几种方式

1. 使用v-bind和props的组合实现父向子传值

在父组件可以通过"v-bind:参数名"或者":参数名"的形式传递参数,参数值可以为任何数据类型,并且在子组件中不能更改父组件传递过来的数据。

<!-- 父组件部分,向组件level1传递两个参数,test和temp -->
<template>
	<level1 :test="1" :temp="'abc'"></level1>
</template>

在子组件使用props接收父组件传递过来的参数 props官方说明

props可以分为数组和对象两种形式实现

props数组的形式更加的简洁,但是不推荐使用数组的形式

<script>
	export default {
		data() {
			return {
				
			}
		},
		props: ['test', 'temp'],
		mounted() {
			console.log(this.test, this.temp)
		}
	}
</script>

结果输出
结果输出
props对象的形式,有很多可选的参数可以搭配,定制型更高

最基本的对象形式,只规定数据类型

<script>
	export default {
		data() {
			return {
				data: ''
			}
		},
		props: {
			test: Number,
			temp: String
		},
		mounted() {
			console.log(this.test, this.temp)
		}
	}
</script>

结果也是正常的输出
结果输出
当数据类型不符合要求时,会产生警告,但程序也会正常执行
比如将temp类型改为Number,就会产生提示你类型检查失败
在这里插入图片描述
而更复杂的参数类型则需要对象嵌套

主要可配置的参数有四个:
type:设置参数类型
default:设置默认值(对象或数组默认值必须从一个工厂函数获取)
required:设置必传(设置true则此参数必传)
validator:设置自定义验证器,只有验证器返回true才可以通过校验

<!-- 向组件level1传递1个参数,extra -->
<template>
	<level1 :extra="'abc'"></level1>
</template>
<script>
	export default {
		data() {
			return {
				data: ''
			}
		},
		props: {
			test: {
				type: Number, //设置数据类型
				default: 123 //设置默认值
			},
			load: {
				type: Array,
				default: () => {
					return []
				} // 对象或数组默认值必须从一个工厂函数获取(官方原话)
			},
			temp: {
				type: [String, Number], //设置多种数据类型
				required: true //设置必传
			},
			extra: {
				validator: (e) => {
					return [1, 2, 3].includes(e)
				} // 验证器 只有验证器返回true才可以通过校验
			}
		},
		mounted() {
			console.log(this.test, this.load, this.temp, this.extra)
		}
	}
</script>

在这里插入图片描述

2. 使用$emit和v-on的组合实现子向父传值

this.$emit( event, arg ) //触发当前实例上的事件
v-on:( event, fn );//监听event事件后运行 fn
官方文档

<!-- 子组件执行this.$emit -->
<script>
	export default {
		data() {
			return {

			}
		},
		mounted() {
			this.testClick()
		},
		methods: {
			testClick() {
				// 触发当前实例上的事件。附加参数都会传给监听器回调。
				this.$emit('testCallback', [1, 2, 3, 4, 5])
			}
		}
	}
</script>
<!-- 父组件接收this.$emit传来的自定义事件和值 -->
<template>
	<!-- 绑定自定义事件方法 -->
	<level1 @testCallback="receiveCall"></level1>
</template>
<script>
	import level1 from './level1Linkage.vue'
	export default {
		data() {
			return {

			}
		},
		components: {
			level1
		},
		methods: {
			receiveCall(e) {
				console.log('接收到值了', e)
			}
		}
	}
</script>
<style></style>

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

3. $refs、$parent、$children、$root

3.1 $refs

$refs是一个对象,对象中包含的内容是经ref注册过的组件或DOM实例。refs 不是响应式的,不应该使用它在模板中做数据绑定。

ref是一个特殊的attribute,被用来给元素或子组件注册引用信息,需要注意的是在初始渲染的时候你不能访问它们,因为ref是作为渲染结果而出现的。

我们可以通过$refs找到组件对应的实例,并直接修改他们的数据或调用他们的方法 官网文档

<!-- 子组件 -->
<script>
	export default {
		data() {
			return {
				testValue: '原始数据'
			}
		},
		props: {

		},
		mounted() {
			console.log(this.testValue)
		},
		methods: {
			testRefChange() {
				console.log(this.testValue)
			}
		}
	}
</script>
<!-- 父组件 -->
<template>
	<!-- 给组件设置ref属性 -->
	<level1 ref="level"></level1>
</template>
<script>
	import level1 from './level1Linkage.vue'
	export default {
		data() {
			return {
			}
		},
		components: {
			level1
		},
		mounted() {
			setTimeout(() => {
				console.log('延时相应啦')
				this.$refs.level.testValue = '新的数据'
				this.$refs.level.testRefChange()
			}, 3000)
		},
		methods: {
		}
	}
</script>

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

3.2 $parent

$parent指向当前组件的父组件,如果当前组件有父组件的话。官方文档

3.3 $children

当前组件的直接子组件,$children 并不保证顺序,也不是响应式的。不推荐使用本方法。

3.4 $root

当前组件树的根组件。如果当前实例没有父实例,此实例将会是其自己。
持续更新···

4. provide/inject

5. vuex

6. 使用事件总线

7.$attrs/$listeners

8. 自定义一个发布订阅者事件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值