Vue 父子组件传参、插槽

简介: Vue 父子组件传参、插槽

setup 函数中有两个主要的参数:props、context 。

props 用于接收父组件传递过来的数据,父传子。

context 指的是 setup 的上下文,它有三个属性:attrs、slots、emit 。

attrs 用于:当父组件传递过来的数据,没有被 props 接收时,数据就会存放在 attrs 属性中。

slots 用于:接收父组件传递过来的插槽内容,相当于 vue2 中的 `this.$slots` 。

emit 用于:创建自定义事件函数,子传父。相当于 vue2 中的 `this.$emit` 。

setup 函数中的 props 参数【父传子

父组件

<template>
    <h1>我是父组件</h1>
    <hr />
    <!-- 3.使用子组件,并通过自定义属性传递数据 -->
    <Child :name="info.name" sex="男" :age="info.age"></Child>
</template>
 
<script>
import { reactive } from 'vue';
// 1.引入子组件
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    // 2.注册子组件
    components: { Child },
    setup() {
        let info = reactive({
            name: "张三",
            age: 18
        })
        // 返回数据
        return { info }
    }
}
</script>

子组件

<template>
  <h1>我是子组件</h1>
  <p>姓名:{{ props.name }}</p>
  <p>性别:{{ props.sex }}</p>
  <p>年龄:{{ props.age }}</p>
</template>
 
<script>
export default {
  name: "Child",
  // 接收数据,未接收的数据不会在 props 参数中显示
  props: ['name', 'sex'],
  setup(props, context) {
    console.log(props);
    // 返回数据
    return { props }
  }
}
</script>

效果

props 参数的几种接收方式

无限制接收

props: ['name', 'sex', 'age']

限制数据类型接收

props: {
  name: String,
  age: Number,
  sex: String
}

限制数据类型、默认值、是否必填接收:

props: {
  name: {
    type: String,
    required: true // 是否必填
  },
  age: {
    type: Number,
    required: true // 是否必填
  },
  sex: {
    type: String,
    default: '保密' // 设置默认值
  }
}

context 参数中的 attrs 属性【子传父】

父组件:

<template>
  <h1>我是子组件</h1>
  <p>姓名:{{ props.name }}</p>
  <p>性别:{{ props.sex }}</p>
  <p>年龄:{{ props.age }}</p>
</template>
 
<script>
export default {
  name: "Child",
  // 假设父组件传递了 name、age、sex 三个数据,props 只接收 name 数据
  props: ['name'],
  setup(props, context) {
    // 那么 props 未接收的数据会在 attrs 属性中显示
    console.log(context.attrs);
    // 返回数据
    return {
      props
    }
  }
}
</script>

效果:

context 参数中的 slots 属性【默认插槽】

父组件

<template>
    <h1>我是父组件</h1>
    <hr />
    <Child>
        <p>姓名:{{ info.name }}</p>
        <p>年龄:{{ info.age }}</p>
    </Child>
</template>
 
<script>
import { reactive } from 'vue';
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    components: { Child },
    setup() {
        let info = reactive({
            name: "张三",
            age: 18
        })
        // 返回数据
        return { info }
    }
}
</script>

子组件:

<template>
  <h1>我是子组件</h1>
  <slot>默认值</slot>
</template>
 
<script>
export default {
  name: "Child",
  setup(props, context) {
    // 父组件传递过来的插槽内容,会存放在 slots 属性中
    console.log(context.slots);
  }
}
</script>

 

效果:

context 参数中的 emit 属性【子传父】

父组件

<template>
    <h1>我是父组件</h1>
    <hr />
    <!-- 使用自定义事件 -->
    <Child @myEvent="myInfo"></Child>
</template>
 
<script>
import Child from '../components/Child.vue';
export default {
    name: "Parent",
    components: { Child },
    setup() {
        // 接收父组件传递的数据
        let myInfo = (value) => {
            alert(`我是父组件,我收到数据了,值为:${value}`);
        }
        // 返回数据
        return { myInfo }
    }
}
</script>

子组件:

<template>
  <h1>我是子组件</h1>
  <button @click="test">往父组件中传递数据</button>
</template>
 
<script>
export default {
  name: "Child",
  // 声明自定义事件
  emits: ['myEvent'],
  setup(props, context) {
    let test = () => {
      // 调用自定义事件,语法为:context.emit('自定义事件', 值);
      context.emit('myEvent', 666);
    }
    // 返回数据
    return { test }
  }
}
</script>

效果


相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
269 2
|
20天前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
240 137
|
1月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
204 0
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
355 1
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
195 0
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
685 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
944 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
723 77
|
7月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍