第三讲 组件传参

一、父传子 (自定义属性 props)

父组件向子组件传参,通过自定义属性的方式进行传参,在子组件中使用prop定义自定义的属性,然后在父组件中通过v-bind指令把需要传递的数据绑定在子组件上,那在子组件中props里面的自定义属性可以直接使用。

原理:父控制子,通过子组件的props属性,抛出子组件自定义标签属性,来接收父组件的操作状态

//父组件代码   渲染子组件
<Son  :sonName="uname" />

 // 子组件代码,接受父参数
export default {
  props: {
     sonName: String
  }
}

二、子传父 (自定义事件 this.$emit)

子组件向父组件传数据使用自定义事件, vue 组件提供了一个emit(‘自定义事件名’, 传递的数据) ),子组件传递数据时,触发响应的事件函数,就会自动触发通过$emit给父组件绑定的自定义事件,自定义事件接受一个参数,参数就是子组件传递过来的数据。

原理:子控制父,子组件绑定自定义事件,来处理父组件的方法函数,通过.$emit(‘自定义事件’,[参数])来触发属于自己的自定义事件

// 父组件代码,渲染子组件
<Son   @pass-value="valueFn" />
export default{
  method:{
    valueFn(value) {}
  }
}
// 子组件代码
this.$emit('pass-value', this.say)

 三、效果图

<template>
	<button class="active" 
	@click="counter++;
	$emit('counterchange',counter)">
		{{counter}}
	</button>
</template>

<script>
	// $emit(事件名,事件值)
	export default {
		// props接受父app.vue传参 num
		// props:["num"],
		props: {
			// 定义传递过来的参数是数字列席,默认值是1
			"num": {type: Number,default: 1},
			// "arr":{type:Array,default:1}
			//Number数字,String字符串,Boolen布尔值-值类型
			// Array数组, object对象-引用类型
			//·引用的默认值使用函数返回值default(){return:[]}

		},
		data() {
			// 使用num:把传过来的num赋值给counter
			return {
				counter: this.num
			}
		}
	}
</script>

<style scoped="spoced">
	/* 样式隔离:在scoped中的样式只在本组件有用 */
	.active {
		color: #f70;
		font-weight: 900;
	}
</style>

 

<template>
	<div>
		<h1 class="active">你好vue</h1>
		<!-- 3.使用组件 -->
		<CounterCom :num="m" @counterchange="m=$event"></CounterCom>
		<counter-com :num="c" @counterchange="c=$event"></counter-com>
		<counter-com @counterchange="n=$event"></counter-com>
		<hr>
		<p>{{n}}元钱</p>
		<p>我有{{m}}个男朋友</p>
		<p>今年有{{c}}个好朋友</p>
	</div>
</template>

<script type="text/javascript">
	// @counterchange监听子组件触发的事件
	// $event固定写法:事件的值
	//·用counterchange事件的值去更新n
	// 1.导入 CounterCom 组件
	import CounterCom from './components/CounterCom.vue'
	export default {
		// 2.注册 CounterCom 
		components: {
			CounterCom
		},
		data() {
			return {
				msg: 'vue-脚手架写大项目',
				n: 1, //父组件定义值n
				m:5,
				c:4,
			}
		}
	}
	// import导入,from从Components组件
</script>
<style>
	.green {
		background-color: green;
		color: #fff;
	}
</style>

效果图1:


效果图2:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值