父子组件之间传递数据的方法

本文详细介绍了Vue.js中组件间的数据传递。通过props和slot,可以实现父组件向子组件的数据传递,props支持字符串数组和对象方式声明,遵循单向数据流原则。插槽用于向组件内部传递内容,包括默认插槽和具名插槽。而子组件向父组件传递数据则通过事件机制,使用$emit触发自定义事件,父组件通过@监听并处理这些事件。

一.属性

组件是Vue.js开发中的基本单元,组件之间不可避免的需要传递数据

从父组件向子组件传递数据是最主要的方式,可通过组件的props(属性)和slot(插槽)来实现

vue.js还允许使用更明确的方式定义属性,即通过一个对象而不是一个数组来定义一个组件的各种属性。

使用props选项来定义:

1.使用字符串数组来声明

export default {

        props:['name','age']

    }

   2.使用对象的方式来声明

 export default {

        props:{

            key:value,

            (key是prop的名称,值是该prop预期类型的构造函数)

            name:Sting,

            age:Number.

        }

    }

[props单向数据流]

概念:父组件的数据改变了会自动流动到自组件,但是子不允许修改由props流过来的数据

        所谓的单向数据流不允许子修改,是不允许改栈,但是可以改堆。

例如:父传了数组给子,在子里面可以通过调用push,pop,shift,unshift,splice等等方法来改           堆。 而且改完后父也会跟着改,因为他们指向的是同一个堆。但是在这里不允许改props上的         栈上的数据,父可以改,而且改完后能流入到子。

二.插槽

插槽的作用:向组件传递另一个组件的开闭标记之间的内容

slot-具名插槽

1.什么叫具名插槽?  

      就是有名字的插槽

2.为什么要用具名插槽?  

      因为一个组件里可能有多个地方都不想写死,那就使用具名插槽

命名语法:

<slot name = '名字'>默认值</slot>

使用语法:(依赖template包裹,并且使用v-slot指定插槽的名字)

     <template v-slot:插槽名>

            要传递的内容

     </template>

简写语法:(把v-slot变成#)

      <template #插槽名>

            要传递的内容

      </template>

三.从子组件向父组件传递数据

在Vue.js中,如果子组件需要向父组件传递数据,就需要使用事件机制来实现。父组件之间的数据流总结起来就是:“从上向下通过属性传递数据,从上向下通过事件传递数据”。档子组件向父组件传递数据时,需要通过$emit()方法向父组件暴露一个事件,然后父组件在处理这个事件的方法中获取子组件传来的数据。

【$emit】

    子组件如何给父组件传递数据?

    利用发通知的形式来间接传数据。

    发通知的语法:this.$emit('自定义的事件名'数据)

    父里要订阅这个通知(相当于监听这个事件)

    <子组件 @自定义的事件名="函数">

    当子的$emit执行时,就会自动调用父里绑定的函数,函数的参数就是子传递过来的数据。

例如:

    子组件的代码

<button aclick="$emit('sb' "hello’)">点击后,要给父传递数据</button>

    解释:当子组件里面点了这个按钮,就会触发一个叫sb的事件,那个父组件如果监听了sb就会调用。

    父里的代码

<子组件 @sb="函数"/>

    当sb事件通知时,就会调用上面的函数,函数的参数就是永不过时。

### Vue.js父子组件数据传递方法:$refs 与 $emit 的优缺点及使用场景 #### 1. 父子组件数据传递的基本方式 Vue.js 提供了多种父子组件之间数据传递方式,包括 `props`、`$refs` 和 `$emit` 等。其中,`$refs` 和 `$emit` 是两种常见的通信方式,分别适用于不同的场景。 --- #### 2. $refs 的优缺点及使用场景 ##### 优点 - **直接访问子组件实例或 DOM 元素**:通过 `$refs`,父组件可以直接获取子组件的实例或 DOM 元素,并调用其方法或访问其属性[^2]。 - **性能高效**:由于 `$refs` 是在组件实例化时生成的引用,因此在需要频繁操作子组件或 DOM 元素时,使用 `$refs` 可以避免额外的事件传递开销。 ##### 缺点 - **破坏封装性**:直接操作子组件或 DOM 元素可能会破坏组件的封装性,使得父组件过于依赖子组件的内部实现。如果子组件的结构发生变化,可能会影响父组件的逻辑。 - **非响应式**:`$refs` 不是响应式的,这意味着如果子组件的实例或 DOM 元素发生了变化,父组件中的 `$refs` 引用不会自动更新[^2]。 ##### 使用场景 - 当需要直接操作子组件的方法或 DOM 元素时,例如手动触发子组件的某个特定功能[^2]。 - 在性能敏感的场景下,避免频繁的事件传递。 --- #### 3. $emit 的优缺点及使用场景 ##### 优点 - **保持组件封装性**:通过 `$emit` 触发事件,父组件可以通过监听事件来处理子组件的行为,而不需要直接访问子组件的内部实现,从而保持了组件的封装性[^1]。 - **灵活性高**:父组件可以根据不同的事件类型执行不同的逻辑,这种基于事件的通信方式更加灵活和可扩展[^1]。 ##### 缺点 - **性能开销较大**:事件传递机制可能会引入一定的性能开销,特别是在复杂的组件树中,事件需要逐层传递才能到达目标组件[^1]。 - **调试困难**:由于事件传递是异步的,调试时可能难以追踪事件的来源和传播路径,尤其是在大型项目中[^1]。 ##### 使用场景 - 当需要从子组件向父组件传递数据或通知时,例如子组件完成某项任务后通知父组件。 - 在需要保持组件解耦的情况下,推荐使用 `$emit` 进行父子组件之间的通信。 --- #### 4. 示例代码对比 ##### 使用 $refs 的示例 ```javascript // 父组件 <template> <div> <child-component ref="child"></child-component> <button @click="callChildMethod">Call Child Method</button> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { callChildMethod() { this.$refs.child.someMethod(); // 直接调用子组件的方法 } } }; </script> ``` ##### 使用 $emit 的示例 ```javascript // 子组件 <template> <button @click="notifyParent">Notify Parent</button> </template> <script> export default { methods: { notifyParent() { this.$emit('custom-event', 'Data from child'); // 触发自定义事件 } } }; </script> // 父组件 <template> <div> <child-component @custom-event="handleEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleEvent(data) { console.log(data); // 处理子组件传递数据 } } }; </script> ``` --- #### 5. 总结 - 如果需要直接操作子组件或 DOM 元素,并且对性能要求较高,可以选择使用 `$refs`。 - 如果希望保持组件的封装性和灵活性,推荐使用 `$emit` 进行父子组件之间的通信[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值