当前位置: 首页 > article >正文

Vue 中的透传,插槽,依赖注入

1. 透传attributes

在组件上使用透传attribute: 当你在父组件中使用子组件时,你可以添加一些attribute到子组件上,即使这些attribute没有在子组件的props中声明。

父组件:

<!-- 父组件,例如 ParentComponent.vue -->
<template>
  <div>
    <MyComponent
      data-id="123"
      data-user="alice"
      class="my-custom-class"
      style="color: red;"
    />
  </div>
</template>

<script>
import MyComponent from '../components/MyComponent.vue';

export default {
  components: {
    MyComponent
  }
};
</script>

<style>
/* 父组件样式 */
</style>

子组件:

<!-- MyComponent.vue -->
<template>
    <div v-bind="$attrs">
      <h3>透传的Attributes:</h3>
      <ul>
        <li v-for="(value, name) in $attrs" :key="name">
          {{ name }}: {{ value }}
        </li>
      </ul>
    </div>
  </template>
  
  <script>
  export default {
    inheritAttrs: false, // 禁用默认的attribute继承行为
  };
  </script>
  
  <style>
  /* 组件样式 */
  </style>
  

显示效果:

当然如果你想在控制台打印出来,你可以打印 this.&attrs

  <script>
  export default {
    inheritAttrs: false, // 禁用默认的attribute继承行为,
    mounted() {
      // 在组件挂载后,打印透传的attributes
      console.log('透传的Attributes:', this.$attrs);
    },
  };
  </script>

2. 插槽

就是直接在组件中插入对应的模版

2.1 简单点的插入:

ChildComponent.vue:

<template>
    <div>
      before
      <slot></slot>
      <slot></slot>
      <slot></slot>
      after
    </div>
</template>

<script setup>


</script>

<style>
</style>
  

父组件: 

<template>
  <div class="home">

      <ChildComponent>
        <div>{{hello}}</div>
      </ChildComponent>

  </div>
</template>

<script setup>
import { ref } from 'vue'
import ChildComponent from '../components/ChildComponent.vue'

const hello = ref('Hello world! 2024')
</script>

显示效果:就是将插入的div代替了子组件的slot位置

2.2 在插槽指定的位置,插入指定的值

ChildComponent.vue:

<template>
    <div>
      <slot name="header"></slot>
      <slot name="content"></slot>
      <slot name="footer"></slot>
    </div>
  </template>
  

 父组件:

<template>
  <div class="home">
    <ChildComponent>
      <template #header>
        <p>This is the header slot</p>
      </template>
      <template #content>
        <p>This is the content slot with a variable: {{ contentVariable }}</p>
      </template>
      <template #footer>
        <p>This is the footer slot</p>
      </template>
    </ChildComponent>
  </div>
</template>

<script>
import { ref } from 'vue'
import ChildComponent from '../components/ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  setup() {
    const contentVariable = ref('This is some content.')
    return { contentVariable }
  }
}
</script>

3. 依赖注入

为了便于祖孙之间数据的传输,

3.1 祖组件向子组件和孙组件传递数据示例

祖组件:

<template>
  <div>
    <h1>Ancestor Component</h1>
    <p>Providing a message: "{{ message }}"</p>
    <ChildComponent />
  </div>
</template>

<script>
import { provide, ref } from 'vue';
import ChildComponent from '../components/ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const message = ref('Hello from Ancestor!');
    provide('ancestorMessage', message);
    return { message };
  }
}
</script>

子组件:

<template>
    <div>
      <h2>Child Component</h2>
      <p>Message from Ancestor: "{{ ancestorMessage }}"</p>
      <GrandchildComponent />
    </div>
  </template>
  
  <script>
  import { inject } from 'vue';
  import GrandchildComponent from '../components/GrandchildComponent.vue';
  
  export default {
    components: {
      GrandchildComponent
    },
    setup() {
      const ancestorMessage = inject('ancestorMessage');
      return { ancestorMessage };
    }
  }
  </script>
  

孙组件:

<template>
    <div>
      <h3>Grandchild Component</h3>
      <p>Message from Ancestor: "{{ ancestorMessage }}"</p>
    </div>
  </template>
  
  <script>
  import { inject } from 'vue';
  
  export default {
    setup() {
      const ancestorMessage = inject('ancestorMessage');
      return { ancestorMessage };
    }
  }
  </script>
  

然后你会发现子和孙组件都是通过inject来接收数据,而祖组件只需要通过provide发送数据

显示效果:


http://www.kler.cn/a/405012.html

相关文章:

  • 免费开源!DBdoctor推出开源版系统诊断工具systool
  • 友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!
  • 【vue】vue中.sync修饰符如何使用--详细代码对比
  • 2025计算机毕设选题精选推荐【小程序方向】
  • Python网络爬虫实践案例:爬取猫眼电影Top100
  • 无人机与低空经济:开启新质生产力的新时代
  • Linux-服务器辨别实体机OR虚拟机
  • 使用ENSP实现DHCP+动态路由
  • 逆向攻防世界CTF系列40-ReverseMe-120
  • 【Mac】安装 Python3
  • SpringMVC案例学习(二)--表白墙/图书管理系统1.0版本
  • 基于web的教务系统的实现(springboot框架 mysql jpa freemarker)
  • 小程序-使用 iconfont 图标库报错:Failed to load font
  • React的hook✅
  • CSV文件数据导入hive
  • 开发中使用UML的流程_02 CIM-1:定义业务流程
  • Docker 安装单机版mysql 并持久化数据
  • 【GNU】addr2line
  • 大前端的发展过程
  • 图像处理 之 凸包和最小外围轮廓生成
  • 开发体育赛事直播平台防止数据泄露的技术安全方案
  • Redis性能优化的18招
  • 掌握Golang中的数据竞争检测:runtime/race包全面教程
  • 探索Linux内核中的Runqueue:从O(n)到O(1)的演进与负载均衡应用
  • 卷积神经网络(CNN)中的权重(weights)和偏置项(bias)
  • qt连接postgres数据库时 setConnectOptions函数用法