学习笔记——Vue中父子组件传值


在vue中,使用组件时,我们可能会在一个页面级组件中调用其他功能组件,例如数量加减的组件,那么如何使父子组件之间进行通信哪?

父组件向子组件传参:

父组件向子组件传递数据或函数,子组件接收后调用,在下面的例子中子组件点击事件触发时,会调用父组件传过来的函数,从而改变父组件中的数据msgFather,进而改变子组件中的msgSon。

<!-- 子组件 -->
<template>
	<div>
		<span style="color: red;" v-text="msgSon" @click="changeMsgSon"></span>
	</div>
</template>

<script>
        export default {
                name: 'HelloWorld',
                props: {
                        msgSon: {  type: String, required: true },
                        changeMsgSon: {  type: Function, required: true }
                }
        }
</script>
<!--  父组件 -->
<template>
	<div>这是主页
        <!-- 使用子组件 -->
		<HelloWorld :msgSon="msgFather"  :changeMsgSon="changeMsgFather"></HelloWorld>
	</div>
</template>

<script type="text/ecmascript-6">
	    import HelloWorld from '../../components/HelloWorld';
        export default {
            name: 'Home',
	        data: function() {
                return {
                        msgFather: '你好,世界!'
                       };
	        },
	        components: {
                        HelloWorld
	        },
	        methods: {
                changeMsgFather: function() {
                        this.msgFather = '世界,你好!';
                }
	        },
        };
</script>

子组件向父组件传参:

第一种方式:函数调用传参

父组件向子组件传递数据或函数,子组件接收后调用,在下面的例子中子组件点击事件触发时,会调用父组件传过来的函数并向该函数中传递一个参数,从而改变父组件中的数据msgFather,进而改变子组件中的msgSon。以下例子中代码相对于上一例子只改变了两处地方。

<!-- 子组件:接收后的函数加入了参数 -->
<span style="color: red;" v-text="msgSon" @click.self="changeMsgSon('久违了,世界!')"></span>

<!-- 父组件:传递的值用接收的形参来赋值 -->
changeMsgFather(msg) { this.msgFather = msg; }

第二种方式:emit发射事件传参

子组件向父组件发射一个事件,可以带参数,也可以不带参数。父组件监听这个事件,并作出相应的操作

<!-- 子组件 -->
<span style="color: red;" v-text="msgSon" @click.self="$emit('changeMsg', 'Hello')"></span>
props: { msgSon: {  type: String, required: true } }

<!-- 父组件 -->
<HelloWorld :msgSon="msgFather"  @changeMsg="changeMsgFather"></HelloWorld>

第三种方式:v-model实现

模拟了vue中的v-model来实现父子组件之间的传参,与第一个实例不同之处如下:

<!-- 子组件 -->
<span style="color: red;" v-text="msgSon" @click.self="$emit('changeMsg', 'Hello')"></span>
props: { msgSon: String },
model: {
        prop: "msgSon",
	    event: "changeMsg"
}

<!-- 父组件 -->
<HelloWorld v-model="msgFather"></HelloWorld>

以上就是现在学习的实现父子组件之间传参的三种方法。

Vue 2父子组件之间的数据传递是双向的,主要通过props(属性)和$emit(事件)来实现。以下是一些常见的父子组件传值方法: 1. **Props(属性)**: - **单向数据流**:父组件向子组件传递数据使用`props`。父组件定义props时,需要指定类型,子组件通过`props`接收数据。例如: ```javascript // 父组件 <child-component :value="parentValue" /> // 子组件 props: { value: { type: String, default: '' } } ``` 子组件只能读取props,不能修改,除非父组件通过$emit触发自定义事件。 2. **自定义事件($emit)**: - **父子组件间的双向通信**:如果需要子组件向父组件发送更新,可以使用$emit触发一个自定义事件,如: ```javascript // 子组件 this.$emit('update-value', newValue); // 父组件 <child-component @update-value="handleChildValueChange" /> methods: { handleChildValueChange(value) { this.parentValue = value; } } ``` 3. **引用类型(Object/Array)**: - 如果父组件想传递对象或数组,Vue会默认浅复制。若需要深拷贝,需在子组件处理,例如使用`Vue.extend`或`JSON.parse(JSON.stringify())`。 4. **自定义指令(v-bind、v-on)**: - 可以使用自定义指令如`v-model`在组件间共享数据,但这在Vue 2不是推荐的做法,因为可能会带来性能问题。 5. **$parent/$children/$refs**: - 有时可能需要直接访问父组件或子组件的实例,这时可以使用`$parent`、`$children`和`$refs`。但这些选项通常不鼓励滥用,因为它们破坏了组件的封装性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一GG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值