首页 > 其他分享 >学习vue3(五)(插槽slot,Teleport传送组件,keep-alive缓存组件,依赖注入Provide / Inject)

学习vue3(五)(插槽slot,Teleport传送组件,keep-alive缓存组件,依赖注入Provide / Inject)

时间:2022-11-03 10:56:44浏览次数:80  
标签:slot Teleport vue 插槽 HelloWorld 组件 import ref

插槽slot

插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

 

匿名插槽

子组件

<template>
    <div>
       <slot></slot>
    </div>
</template>
 
<script setup lang="ts">
import { reactive } from 'vue'

</script>

  

父组件

<template>
  <div>
    <HelloWorld>
      <template v-slot>
        <div>HelloWorld</div>
      </template>
    </HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
</script>
 
<style>
</style>

  

具名插槽

具名插槽其实就是给插槽取个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中

子组件

<template>
  <div>
      <slot name="header"></slot>
      <slot></slot>
      <slot name="footer"></slot>
  </div>
</template>
 
<script setup lang="ts">
import { reactive } from "vue";
</script>

  

父组件

<template>
  <div>
    <HelloWorld>
      <template v-slot:header>
        <div>1</div>
      </template>
      <template v-slot>
        <div>2</div>
      </template>
      <template v-slot:footer>
        <div>3</div>
      </template>
    </HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
</script>
 
<style>
</style>

  

插槽简写用   #

<template>
  <div>
    <HelloWorld>
      <template #header>
               <div>1</div>
           </template>
           <template #default>
               <div>2</div>
           </template>
           <template #footer>
               <div>3</div>
      </template>
    </HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
</script>
 
<style>
</style>

  

作用域插槽

在子组件动态绑定参数 派发给父组件的slot去使用

子组件

<template>
      <div>
        <slot name="header"></slot>
        <div>
            <div v-for="item in 10" :key="item">
                <slot :data="item"></slot>
            </div>
        </div>
 
        <slot name="footer"></slot>
    </div>
</template>
 
<script setup lang="ts">
import { reactive } from "vue";
</script>

  

父组件

<template>
  <div>
    <HelloWorld>
      <template #header>
               <div>1</div>
           </template>
           <template #default="{ data }">
                <div>{{ data }}</div>
           </template>
           <template #footer>
               <div>3</div>
      </template>
    </HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
</script>
 
<style>
</style>

 

动态插槽

插槽可以是一个变量名

子组件

<template>
      <div>
        <slot name="header"></slot>
    </div>
</template>
 
<script setup lang="ts">
import { reactive } from "vue";
</script>

  

父组件

<template>
  <div>
    <HelloWorld>
      <template #[name]>
                <div>
                    123
                </div>
            </template>
    </HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
import { ref } from "vue";
const name = ref('header')
</script>
 
<style>
</style>

  

Teleport传送组件

Teleport Vue 3.0新特性之一。

Teleport 是一种能够将我们的模板渲染至指定DOM节点,不受父级style、v-show等属性影响,但data、prop数据依旧能够共用的技术;类似于 React 的 Portal。

主要解决的问题 因为Teleport节点挂载在其他指定的DOM节点下,完全不受父级style样式影响

使用方法
通过to 属性 插入指定元素位置 to="body" 便可以将Teleport 内容传送到指定位置

<template>
  <div>
    <Teleport to="body">
      <HelloWorld></HelloWorld>
    </Teleport>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
import { ref } from "vue";
</script>
 
<style>
</style>

  

动态控制teleport

使用disabled 设置为 true则 to属性不生效  false 则生效

<template>
  <div>
    <Teleport :disabled="false" to='body'>
      <HelloWorld></HelloWorld>
    </Teleport>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
import { ref } from "vue";
</script>
 
<style>
</style>

  

keep-alive缓存组件

有时候我们不希望组件被重新渲染影响使用体验;或者处于性能考虑,避免多次重复渲染降低性能。而是希望组件可以缓存下来,维持当前的状态。这时候就需要用到keep-alive组件。

开启keep-alive 生命周期的变化

初次进入时: onMounted> onActivated
退出后触发 deactivated
再次进入:
只会触发 onActivated
事件挂载的方法等,只执行一次的放在 onMounted中;组件每次进去执行的方法放在 onActivated中

<!-- 基本 -->
<keep-alive>
  <component :is="view"></component>
</keep-alive>
 
<!-- 多个条件判断的子组件 -->
<keep-alive>
  <comp-a v-if="a > 1"></comp-a>
  <comp-b v-else></comp-b>
</keep-alive>
 
<!-- 和 `<transition>` 一起使用 -->
<transition>
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>
</transition>

  

include 和 exclude

 <keep-alive :include="" :exclude="" :max=""></keep-alive>

include 和 exclude 允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:

max

<keep-alive :max="10">
  <component :is="view"></component>
</keep-alive>

  

依赖注入Provide / Inject

Provide / Inject
通常,当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去,可能会很麻烦。

官网的解释很让人疑惑,那我翻译下这几句话:

provide 可以在祖先组件中指定我们想要提供给后代组件的数据或方法,而在任何后代组件中,我们都可以使用 inject 来接收 provide 提供的数据或方法。

 

 

看一个例子

父组件传递数据

<template>
  <div>
      <HelloWorld></HelloWorld>
  </div>
</template>
 
<script setup lang="ts">
import HelloWorld from "../components/HelloWorld.vue";
import { provide, ref } from 'vue'
let flag = ref<number>(1)
provide('flag', flag)

</script>
 
<style>
</style>

  

子组件接收  

<template>
    <div style="background-color: green;">
        我是子组件
        <button @click="change">change falg</button>
        <div>{{ flag }}</div>
    </div>
</template>
    
<script setup lang='ts'>
import { inject, Ref, ref } from 'vue'
 
const flag = inject<Ref<number>>('flag', ref(1))
 
const change = () => {
    flag.value = 2
}
</script>
    
<style>
</style>

TIPS 你如果传递普通的值 是不具有响应式的 需要通过ref reactive 添加响应式

使用场景

当父组件有很多数据需要分发给其子代组件的时候, 就可以使用provide和inject

  

 

 


———————————————— 版权声明:本文为CSDN博主「小满zs」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq1195566313/article/details/122904105

 

标签:slot,Teleport,vue,插槽,HelloWorld,组件,import,ref
From: https://www.cnblogs.com/xiaobaibubai/p/16853691.html

相关文章

  • ElasticSearch之Quick.ElasticSearch.Furion组件的使用
    ElasticSearch使用说明本章,我们主要讲解在.Net中对Quick.ElasticSearch.Furion的使用进行介绍!ElasticSearch的官方客户端API文档地址:https://www.elastic.co/guid......
  • 【leetcode 952. 按公因数计算最大组件大小】【欧拉筛+并查集】
    importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;classSolution{List<Integer>list=newArrayList<>();intprimeNum=0......
  • 4-04-组件篇之RPC(下-2)_ev
    分库分表一般分成128个表,1个库或者8或者16个库        下面这个图就单机模型     http1.0是加载css和jpg和js每一项都是一个请求例如3个......
  • Vant Weapp 组件库
    1.安装vant1.1打开项目路径,使用cd../确保路径是整个项目路径1.2输入npmi@vant/weapp-S--production1.3工具->构建npm......
  • 兄弟组件传参_bus封装
    vue3Bus兄弟组件传参typeBusClass={emit:(name:string)=>voidon:(name:string,callBack:Function)=>void}typeParamsKey=string|number|sy......
  • JavaWeb三大组件之Servlet学习
    JavaWeb三大组件之Servlet学习平时直接用springmvc较多,都没怎么接触底层的Servlet,导致对一些基本的知识点了解都不够,所以今天专门的抽出时间来学习一下带着问题出发,看下可以......
  • JavaWeb三大组件之Filter学习详解
    JavaWeb三大组件之Filter学习详解Filter基本上可以说存在所有的JavaWeb项目中,比如最基本的一个请求参数的编码​​CharacterEncodingFilter​​,大家一般都会配置下,那么filte......
  • 调用com组件读取word文档配置
    https://www.likecs.com/show-205115518.html最近由于项目中利用PHP调用com组件读取word文档,然后转换成pdf格式的文件。所以在服务器WindowsServer®2008Enterprise中......
  • 异步组件
    异步组件//index.vueimport{defineAsyncComponent}from'vue'constDialog=defineAsyncComponent(()=>import('./Dialog/index.vue'))//vue3内置组件,用于......
  • 自定义的组件无法显示;
      定义了一个自定义组件title,但是无论如何都显示不出来,看了title组件的created()函数的打印,也灭有打印; 调试的话,看到title组件也没有像其他组件一样通过re......