Vue3中jsx父子传值、provide和inject、v-memo指令、Teleport内置组件、KeepAlive缓存组件、transition过渡组件

news2024/11/15 9:23:18

文章目录

  • 1. jsx父子传值
  • 2. provide和inject
  • 3. v-memo指令
  • 4. Teleport内置组件
  • 5. KeepAlive缓存组件
  • 6. transition过渡组件


1. jsx父子传值

父组件:

<template>
  <div>
    <child :title="title" :setTitle="setTitle" />
  </div>
</template>

<script>
import { ref } from 'vue'
// 如果你用的是.jsx或.tsx,则引入时,扩展名不要写
import child from './components/child'
export default {
  components: { child },
  setup() {
    let title = ref('测试')

    const setTitle = titleStr => (title.value = titleStr)

    return { title, setTitle }
  }
}
</script>

<style lang="scss" scoped></style>

子组件:

// const Child = props => {
//   return (
//     <div>
//       <h3>jsx -- {props.title}</h3>
//       <button onClick={() => props.setTitle(Date.now() + '')}>jsx</button>
//     </div>
//   )
// }

// 解构写法
const Child = ({ title, setTitle }) => {
  return (
    <div>
      <h3>jsx -- {title}</h3>
      <button onClick={() => setTitle(Date.now() + '')}>jsx</button>
      {/* <button onClick={() => changeTitle(setTitle)}>jsx</button> */}
    </div>
  )
}

export default Child

在这里插入图片描述

2. provide和inject

我们想要在组件内实现很方便的通信,却又想要与外界隔绝,这时候就需要用到 provide/inject。

父组件:

<template>
  <div>
    <child />
  </div>
</template>

<script>
import { ref, provide } from 'vue'
import child from './components/child.vue'
export default {
  components: { child },
  setup() {
    let title = ref('测试')

    // 在祖先组件中发布了一个数据
    // 如果你发布的数据它是一个响应式对象,则provide它就是一个响应式,如果是一个普通值和对象,则不是响应式

    provide('title', title)
    
    // 这种方式可以将会使发布的数据变为普通对象,无法响应
    // provide('title', title.value)

    return { title }
  }
}
</script>

<style lang="scss" scoped></style>

子组件:

<template>
  <div>
    <h3>{{ title }}</h3>
    <button @click="title = 1323">+++++</button>
  </div>
</template>

<script>
import { inject } from 'vue'
export default {
  setup() {
    let title = inject('title')

    console.log(title)

    return { title }
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

3. v-memo指令

只要 v-memo 的依赖项没有发生改变,那它的子元素就不会重新渲染,这是一种优化手段。

<template>
  <div>
    <!-- v-memo它依赖项没有发生改变,则它子元素不会重新渲染,优化 -->
    <!-- <div v-memo="[names.length]"> -->
    <div v-memo="[num]">
      <ul v-for="item of names" :key="item">
        <li> {{ item }}</li>
      </ul>
    </div>
    <button @click="addNames">++++</button>
  </div>
</template>

<script>
import { ref, watch } from 'vue'
export default {
  setup() {
    let num = ref(0)
    let names = ref(['乐乐', '英子', '小森', '亮亮'])
    // 这里只是让names变量发生了变化,而v-memo的依赖项为num,所以这时候视图并不会重新渲染
    const addNames = () => names.value.push(Date.now())

    watch(
      // 只要names属性发生了变化,就修改num的值
      names,
      n => {
        num.value = n.length
      },
      { deep: true, immediate: true }
    )

    return { num, names, addNames }
  }
}
</script>

<style lang="scss" scoped>

</style>

在这里插入图片描述

4. Teleport内置组件

<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

举个例子,当我们利用 v-if 显示和隐藏某些元素的时候,可能会导致整个页面(当前 app 节点) html 结构的变化,从而导致元素样式的变化,这时候我们就可以将这个元素挂载到其他节点中去,于是就可以使用 Teleport 来包裹元素实现。

首先我们在根目录的 index.html 中添加一个新的挂载点:

在这里插入图片描述

父组件:

<template>
  <div>
    <button @click="isShow = !isShow">点击显示</button>
    <Teleport to="#other">
      <div v-if="isShow" class="modal">
        <h3>提示框</h3>
        <div>欢迎登录页面</div>
      </div>
    </Teleport>
  </div>
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    let isShow = ref(false)

    return { isShow }
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

5. KeepAlive缓存组件

<KeepAlive> 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。

<template>
  <div>
    <button @click="cmp = 'child1'">child1</button>
    <button @click="cmp = 'child2'">child2</button>

    <!-- 只缓存 child2 中的内容 -->
    <!-- <KeepAlive :include="['child1']"> -->

    <!-- 如果是字符串,则一定不能有多余空格,多个以逗号隔开 -->
    <!-- <KeepAlive include="child1"> -->

    <!-- 使用正则匹配 -->
    <KeepAlive :include="/child/">
      <component :is="cmp"></component>
    </KeepAlive>
  </div>
</template>

<script>
import { ref } from 'vue'
import child1 from './components/child1.vue'
import child2 from './components/child2.vue'
export default {
  components: {
    child1,
    child2
  },
  setup() {
    let cmp = ref('child1')
    return { cmp }
  }
}
</script>

<style lang="scss" scoped></style>

在这里插入图片描述

6. transition过渡组件

利用过渡组件实现元素的显示与隐藏:

<template>
  <div>
    <button @click="isShow = !isShow">点击显示</button>
    <!-- 样式前缀,以v-开头 -->
    <Transition name="v">
      <div v-if="isShow" class="modal">
        <h3>提示框</h3>
        <div>欢迎登录页面</div>
      </div>
    </Transition>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    let isShow = ref(false)

    return { isShow }
  }
}
</script>

<style lang="scss" scoped>
// enter 进场
// leave 出场

/* 在进场和退场的过程中,进行透明度的变化 */
.v-enter-active,
.v-leave-active {
  transition: opacity 0.6s ease;
}

/* 进场开始和退场的结束 */
.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

在这里插入图片描述

利用过渡组件和动态组件实现在组件间的切换:

<template>
  <div>
    <button @click="activeComponent = 'child1'">child1</button>
    <button @click="activeComponent = 'child2'">child2</button>
    <!-- 模式:先进入后退出 -->
    <!-- <Transition name="v" mode="in-out"> -->
    <!-- 模式:先退出后进入 -->
    <Transition name="v" mode="out-in">
      <component :is="activeComponent"></component>
    </Transition>
  </div>
</template>

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

export default {
  components: {
    child1,
    child2
  },
  setup() {
    let isShow = ref(true)
    let activeComponent = ref('child1')

    return { isShow, activeComponent }
  }
}
</script>

<style lang="scss" scoped>
// enter 进场
// leave 出场

/* 在进场和退场的过程中,进行透明度的变化 */
.v-enter-active,
.v-leave-active {
  transition: opacity 0.3s ease;
}

/* 进场开始和退场的结束 */
.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub下载量过百万,阿里P8秘密分享的「亿级并发系统设计」真香

随着互联网的不断发展&#xff0c;CPU硬件的核心数也在不断进步&#xff0c;并发编程越来越普及&#xff0c;但是并发编程并不像其他业务那样直接了当。在编写并发程序时&#xff0c;我们常常都会出现各种漏洞&#xff0c;这些问题往往都突然出现&#xff0c;然后又迅速消失&am…

Java编码与解码

首先区分加密与编码并不是一回事&#xff0c; 本节主要讲述常见的三种编解码方式&#xff0c;分别为&#xff1a;Unicode、URL、Base64。 常见编码算法&#xff1a; Unicode编码&#xff1a;每一字符都可变成以 \u 开头&#xff0c;长度为6的字符串。URL编码&#xff1a;以百分…

Java并发编程--多线程间的同步控制和通信

使用多线程并发处理&#xff0c;目的是为了让程序更充分地利用CPU &#xff0c;好能加快程序的处理速度和用户体验。如果每个线程各自处理的部分互不相干&#xff0c;那真是极好的&#xff0c;我们在程序主线程要做的同步控制最多也就是等待几个工作线程的执行完毕&#xff0c;…

JS表达式完全攻略

在语法概念中&#xff0c;运算符属于词&#xff0c;表达式属于短语。表达式由一个或多个运算符、操作数组成的运算式。表达式的功能是执行计算&#xff0c;并返回一个值。 表达式的形式 表达式是一个比较富有弹性的运算单元。简单的表达式就是一个直接量、常量或变量。例如&a…

【优化调度】粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】

⛄一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型&#xff0c;在他的仿真中&#xff0c;每一个个体都遵循&#xff1a;避免与邻域个体相撞&#xff1a;匹配邻域个体…

Java面向对象之——封装

文章目录前言一、封装的概念二、何为封装&#xff1f;三、封装拓展——包&#x1f351;1、包的概念&#x1f351;2、导入包中的类&#x1f351;3、自定义包&#x1f351;4、常见的包四、访问限定符&#x1f351;1、public修饰符&#x1f351;2、private修饰符&#x1f351;3、默…

软件产品确认测试包括哪些方面

1.技术方面 确认测试又称有效性测试&#xff0c;是在模拟的环境下&#xff0c;运用黑盒测试的方法&#xff0c;验证被测软件是否满足需求规格说明书列出的需求。 确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后&#xff0c;已经按照设计把所有的模…

Docker 下 jitsi-meet 视频服务器 安装部署

一、参考网站 官网文档地址&#xff1a;Self-Hosting Guide - Docker | Jitsi Meet 二、Docker 版本 三、安装部署 3.1、下载并解压缩安装包 地址&#xff1a;Release stable-8044: release jitsi/docker-jitsi-meet GitHub CSDN地址&#xff1a;docker-jitsi-meet-stab…

visdom安装及使用

目录1. 安装visdom的流程2. 使用流程1. 安装visdom的流程 重点参考链接&#xff1a;visdom安装出现Downloading scripts, this may take a little while然后就不动了 先去到github直接下载了visdom的压缩包&#xff1a;https://github.com/fossasia/visdom然后将visdom-maste…

第七章 数学 6 AcWing 1593. 整数分解

第七章 数学 6 AcWing 1593. 整数分解 原题链接 AcWing 1593. 整数分解 算法标签 数学 数论 DP 背包问题 思路 类似AcWing 12. 背包问题求具体方案 把n看成背包的容积N 因为n最多不超过400&#xff0c;然而p进制最少为2 所以物品的价值最大可以取到20(因为20^2 400) 所以…

Python读取CSV文件,数值精度丢失

Excel保存为csv以后&#xff0c;大数值的列&#xff0c;会把转换为科学计数法&#xff0c;而且后边几位都会被转为0. 搞了很多方法,最后直接安装 openpyxl 组件 和 pandas&#xff0c; 读取Excel文件就行了。 data pd.read_excel("C:/work/20221111AI/cleaned_data_noTi…

第二章 计算机算术

数据表示决定了计算机所执行操作的类型&#xff0c;数据从一个位置传到另一个位置的方法&#xff0c; 以及对存储元件的特性要求。浮点运算是非常重要的&#xff0c;因为它的实现决定了计算机执行复杂图形变换和图像处理的速度&#xff0c; 而且浮点运算对计算的准确度也有很重…

高通平台开发系列讲解(mm-camera篇)MM-CAMERA框架

文章目录 一、Camera软件位置1.1、开源代码1.2、专有源码二、摄像头前端(Camera Frontend)2.1、整体框架2.2、 Camera HAL与mm-camera交互沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍高通平台mm-camera代码框架。 一、Camera软件位置 QTI 针对 An…

Flink 状态编程

状态编程有状态算子状态的管理状态的分类按键分区状态&#xff08;Keyed State&#xff09;支持的结构类型代码实现状态生存时间&#xff08;TTL&#xff09;算子状态&#xff08;Operator State&#xff09;基本概念和特点状态类型代码实现广播状态&#xff08;Broadcast Stat…

DFP 数据转发协议应用实例 .与其它厂商 LoRA 设备匹配

DFP 数据转发协议应用实例 5.与其它厂商 LoRA 设备匹配 DFP 是什么&#xff1f; 稳控科技编写的一套数据转发规则&#xff0c; 取自“自由转发协议 FFP&#xff08;Free Forward Protocol&#xff09;” &#xff0c;或者 DFP&#xff08;DoubleF Protocol&#xff09;&#xf…

【优化求解】粒子群算法求解仓库成本控制优化问题【含Matlab源码 1577期】

⛄一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型&#xff0c;在他的仿真中&#xff0c;每一个个体都遵循&#xff1a;避免与邻域个体相撞&#xff1a;匹配邻域个体…

基于JAVA的网上图书商城参考【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427643 主要使用技术 Struts2HibernateJSPCSSJSMysql 功能介绍 系统有五类用户&#xff0c;分别是&#xff1a;会员用户&#xff0c;商品管理员&#xff0c;订单管理员&#xff0c;会员管…

【MSSQL】SQL SERVER导入中文乱码问题解决

公司最近承接了一个项目&#xff0c;甲方现使用旧版SiteServer框架&#xff08;以下简称“SiteCMS”&#xff09;作为门户网站&#xff0c;使用的数据源是SQL Server。 现在需要对SiteCMS进行升级&#xff0c;在升级时数据库和数据库结构也需要同时更新&#xff0c;其中数据库…

硬件顶配、数字先行,路特斯重塑「智能座舱」

诚然&#xff0c;在车联网的高度普及、5G技术的铺开以及汽车产业融合的大势下&#xff0c;传统单一驾驶与乘坐功能的汽车座舱正在被颠覆&#xff0c;更高级、更智能的“智能座舱”应运而生。 从行业发展态势来看&#xff0c;大屏多屏已经是智能汽车的基本操作&#xff0c;智能…

【网络安全】——逻辑漏洞之短信轰炸漏洞

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…