插槽,依赖注入,动态组件,异步组件,内置组件

news2024/11/23 16:30:42

插槽:父组件和子组件内容的一个通信

子组件使用<slot>接收父组件传入的内容

如果内容有多个标签时,使用<template>包裹

默认插槽:

 <template v-slot:default>
                      <h2>标题</h2>
                      <p>插槽内容</p> 
                   </template>
 <slot></slot>

具名插槽:v-slot替代字符:#  

 <template v-slot:tree>
                       <p>树</p>
                   </template>
<slot name="tree"></slot>

 

作用域插槽:(可以传参)

 <template v-slot:listtemp="slotList">
                    <ul>
                        <li v-for="book in slotList.books">
                           {{book}}
                        </li>
                    </ul>
                   </template>
  data() {
    return {
      title: "子组件",
      list:['javascript高级编程','vue高级','css高级']
    };
  },                   

 <slot name="listtemp" :books="list"></slot>

依赖注入:利用props的话,只可以进行父子通信,如果要进行爷孙或者关系更深层的通信,要使用依赖注入。

 跨组件通讯

    依赖注入:provide-inject

在根元素写入要传的值:

   data() {
    return {
      title: "父组件",
      msg:'这是根组件数据'
    }
  },

 provide(){
    return {
      message:this.msg
    }
  },

在子/孙组件写inject来接收 

 inject:['message']

 注入别名:(根节点传入的时候名字与子孙组件的名字相重的时候,可以在用到的子组件的地方改个名字。)

下面的代码的意思是将message的名字改为msg,defalut的意思是如果没有传值下来,页面会显示的值为默认值。

  inject:{
    msg:{
      from:'message',
      default:'默认值'
    }
  },

和响应式数据配合使用:message: computed(()=>this.msg)

如果父组件的值改变了,但是子组件不会发生变化,要利用计算属性来改变值:因为计算属性依赖的值变化他会跟着变化!

  data() {
    return {
      title: "父组件",
      msg:'这是根组件数据'
    }
  },
  // 提供数据
  provide(){
    return {
      //  message:this.msg
      message: computed(()=>this.msg)
    }
  },
  methods: {
    bindUpdateMessage(){
       this.msg = '新内容'
    }
  },

 


动态组件: 组件是动态变化的

  • 让多个组件使用同一个挂载点,并动态切换,这就是动态组件

<component>元素包裹起来

 <component :is="currentTab"></component>

可以实现多个组件来回切换 

import Home from "./Home.js";
import Category from "./Category.js";
import Cart from "./Cart.js";
import My from "./My.js";
/**
 *  点击tab选项 内容区域切换为对应组件
 *    1. tab选项绑定点击事件
 *    2. 切换组件
 */
export default {
  components: {
    Home,
    Category,
    Cart,
    My,
  },
  data() {
    return {
      title: "动态组件",
      currentTab:'home',
      list:[
        {name:'home',title:'首页'},
        {name:'category',title:'分类'},
        {name:'cart',title:'购物车'},
        {name:'my',title:'我的'},
      ],
      isActive:false
    };
  },
  methods: {
    onTabChange(tabName){
      this.currentTab = tabName
    }
  },
  /*html*/
  template: `<div class="g-container">
                 <div class="g-content">
                      <component :is="currentTab"></component>
                 </div>

                 <!--<ul class="g-footer">
                    <li @click="onTabChange('home')" :class="{active:currentTab=='home'}">首页</li>
                    <li @click="onTabChange('category')" :class="{active:currentTab=='category'}">分类</li>
                    <li @click="onTabChange('cart')" :class="{active:currentTab=='cart'}">购物车</li>
                    <li @click="onTabChange('my')" :class="{active:currentTab=='my'}">我的</li>
                 </ul>-->
                 <ul class="g-footer">
                    <li v-for="item in list" @click="onTabChange(item.name)" :class="{active:currentTab==item.name}">{{item.title}}</li>
                 </ul>
            </div>`,
};

购物车:(其它页面与此页面一样只改了Title的值)

/**
 */
export default {
  data() {
    return {
      title: "购物车",
    };
  },
  /*html*/
  template: `<div>
                  <h2>{{title}}</h2>
              </div>`,
};

 组件来回切换,在首页的时候,生命周期会经历创建和挂载,点击到其它页面时,首页的生命周期会被销毁,此时,所在的页面的生命周期就创建挂载起来。以此类推,如果我想实现一个组件缓存起来,不进行销毁。使用:<keep-alive>将不销毁的组件放这儿</keep-alive>

 当一个组件在<keep-alive>中被切换时,他的activated和deactivated生命周期钩子被调用,用来代替mounted和unmounted。这适用于<keepAlive>的直接子节点及其所有子孙节点。

如何实现我想缓存哪些?哪些不缓存呢?

可以使用include  /  exclude来完成

      <keep-alive include="Home,Category,Cart">
                          <component :is="currentTab"></component>
                      </keep-alive>

在表达方式上,还可以用多样化: 

 

组件如果想要条件性地被keepAlive缓存,就必须显示声明一个name选项。 name里面存放的是所在文件的文件名。


 

 异步组件:(性能优化)从后端(服务端)拿到数据。

  • Vue 提供了defineAsyncComponent方法来实现此功能

首先要引入:

import { defineAsyncComponent } from "https://unpkg.com/vue@3/dist/vue.esm-browser.js";

获取异步主件,使用promise。这里只是模拟~ 

const AsyncChild = defineAsyncComponent(() => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      //异步获取后端定义的异步组件
      const asyncComponent = {
        template: `<p>我是异步组件</p>`,
      };
      resolve(asyncComponent);
    }, 2000);
  });
});

获取后,进行注册 

 components: {
    Child,
    AsyncChild,
  },

 在templeate中使用:

 <async-child></async-child>

在显示我们异步主件前,先显示加载中....... 使用 Suspense即可

<!-- Suspense 作用: 首先显示 名为fallback的插槽内容,当异步组件加载完成后,显示异步组件  -->
                <Suspense>
                     <async-child></async-child>
                     <template #fallback>
                         <p>加载中...</p>
                     </template>
                </Suspense>


 

 Teleport传送门:

  Dialog是子组件,传送的是子组件

<Teleport to="body">
    <Dialog v-if="show" @closeDialog="show=false"></Dialog>
 </Teleport>

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

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

相关文章

Windows——编写jar启动脚本和关闭脚本

文章目录前言启动脚本编写关闭脚本restart.bat 重启脚本前言 假设项目打包后&#xff0c;项目结构为&#xff1a; 此时如果需要再windows环境中进行项目的启动或关闭&#xff0c;需要频繁的手敲命令&#xff0c;很不方便。此时可以编写.bat脚本文件进行项目的控制。 启动脚本…

就业信息追踪|基于Springboot+Vue开发实现就业信息追踪系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

双向链表,添加,删除一个节点

文章目录前言一、创建双向链表&#xff08;重命名&#xff09;二、添加一个节点1.添加头指针&#xff1a;2.若 头指针为空3.若头指针非空三、删除一个节点1.找到某节点2.将节点从链表中删除四. 展示所有的节点五. 实验效果总结前言 链表有几种&#xff0c;大致分为&#xff1a…

小程序之会议OA项目--其他界面

目录一、tabs组件及会议管理布局1、tabs.js2、tabs.wxml3、tabs.wxss4、app.wxss5、list.js6、list.json7、list.wxml二、个人中心布局1、ucenter/index/index.js2、ucenter/index/index.wxml3、ucenter/index/index.wxss一、tabs组件及会议管理布局 1、tabs.js // component…

UDS - 15.2 RequestDownload (34) service

15.2 请求下载(34)服务 来自&#xff1a;ISO 14229-1-2020.pdf 15.2.1 服务描述 客户机使用requestDownload服务发起从客户机到服务器的数据传输(下载)。 在服务器接收到requestDownload请求消息之后&#xff0c;服务器应该在发送积极响应消息之前采取所有必要的操作来接收数据…

常用图像像素格式 NV12、NV2、I420、YV12、YUYV

文章目录目的RGBYUVYCrCb采样格式YUV 4:4:4 采样YUV 4:2:2 采样YUV 4:2:0 采样YUV 存储格式YUV422&#xff1a;YUYV、YVYU、UYVY、VYUYYUV420&#xff1a;I420、YV12、NV12,、NV21扩展目的 了解常用图像像素格式 RGB 和 YUV,像素格式描述了像素数据存储所用的格式&#xff0c;…

Spring MVC框架学习

前言:本篇博客将从三个方面来写我们要学习SpringMVC的什么: 连接:当用户在游览器中输入一个url之后,能将这个url请求映射到自己写的程序,也就是访问一个地址时,能够连接到门自己写的服务器. 获取参数:用户访问时如果带一些参数,我该怎样获取.返回数据:执行业务代码之后…

NVM实现一台电脑对node的多版本管理。

一、NVM&#xff1a;Node Version Management&#xff1b; 下载地址&#xff1a;Releases coreybutler/nvm-windows GitHubA node.js version management utility for Windows. Ironically written in Go. - Releases coreybutler/nvm-windowshttps://github.com/coreybutl…

JavaScript寒假系统学习之数组(一)

JavaScript寒假系统学习之数组&#xff08;一&#xff09;一、数组1.1 什么是数组1.2 数组创建的2种方式1.2.1 利用new创建数组1.2.2 利用数组字面量创建数组1.3 访问数组元素1.4 遍历数组1.5 数组实战训练1.5.1 计算数组的和以及平均值1.5.2 求数组中的最大值1.5.3 数组转化为…

使用Qemu在Windows上模拟arm平台并安装debian10 arm系统(cd镜像) 安装记录

参考&#xff1a;使用Qemu在Windows上模拟arm平台并安装国产化操作系统_viyon_blog的博客-CSDN博客_qemu windows 镜像&#xff1a;debian-10.12.0-arm64-xfce-CD-1.iso 环境&#xff1a;qemu虚拟机&#xff0c;宿主机win10,amd64 QEMU_EFI.fd: (298条消息) qemu虚拟机的bi…

N皇后问题-leetcode51-java回溯解+详细优化过程

说明&#xff1a;问题描述来源leetcode 一、问题描述&#xff1a; 51. N 皇后 难度困难1592 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之…

实验八、直接耦合多级放大电路的调试

一、题目 两级直接耦合放大电路的调试。 二、仿真电路 图1(a)所示电路为两级直接耦合放大电路&#xff0c;第一级为双端输入、单端输出差分放大电路&#xff0c;第二级为共射放大电路。 由于在分立元件中很难找到在任何温度下均具有完全相同特性的两只晶体管&#xff0c;因而…

Active Directory 基础 —— 如何理解group的类型

因为创建一个跨域的组,重新温习了一下最基本的AD知识,所谓温故而知新,把温习的结果整理了一下。AD里面的group类型从范围来说分为global, universal 和 local domain, 从类型来分分为security和distribution。后面的类型理解很容易,security就是纯粹用来权限访问的,而dist…

Java实现FIFO、LRU、LFU、OPT四页面置换算法

题目要求 采用多道程序思想设计一个程序&#xff0c;模拟页存储管理地址变换的过程&#xff0c;可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下&#xff1a; 需要建立访问页表线程、访问快表线程、缺页中断处理线程、访问内存线程等&#xff0c;协同这些线程模拟完成…

JDK17升级之路:JCE cannot authenticate the provider BC问题

问题的产生 报错代码运行环境 JDK&#xff1a;Oracle JDK17 CentOS7.8 这个问题刚拿到比较棘手。原因是本地windows是OK的&#xff0c;centos上是不成功的&#xff0c;报了下面的错误&#xff1a; Caused by: java.lang.SecurityException: JCE cannot authenticate the provi…

论文阅读 DeepGCNs: Can GCNs Go as Deep as CNNs?

DeepGCNs: Can GCNs Go as Deep as CNNs?绪论1、介绍2、相关工作3、方法3.1、图神经网络的表针学习3.2、图神经网络的残差结构3.3、图神经网络的密集连接3.4、图神经网络的扩张性聚集绪论 CNN很强&#xff0c;但不能正确解决非欧几里得数据的问题&#xff0c;图卷积网络&…

YOLO-V5 系列算法和代码解析(五)—— 损失函数

文章目录基本简介调试准备损失函数基本简介 损失函数是神经网络的重要组成部分&#xff0c;用于评估网络的预测值和真实值的差异度。根据偏差的大小&#xff0c;反向调整网络的训练参数&#xff0c;迭代优化使得损失尽量小&#xff0c;也就得到最优的网络参数。 调试准备 debu…

Go-学生教务管理系统【无界面 / 离线版】(一)

【Go】学生教务管理系统&#xff08;无界面 / 离线版&#xff09;&#xff08;一&#xff09;Ⅰ. 程序说明一、博客日期二、引言Ⅱ. 版权声明Ⅲ. 开发环境一、开发配置二、开发工具Ⅳ. 效果演示一、工程结构&#xff08;一&#xff09;目录结构&#xff08;二&#xff09;目录说…

【Ctfer训练计划】——(六)

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

Springboot启动之自定义run方法

前言 之前分析的Springboot启动过程的源码分析中给自己留了一个扩展作业&#xff1a;执行自定义的run方法&#xff0c;此方法在B.7、调用运行器简单分析过&#xff0c;今天咱们就自定义一个Run方法试试。 一、实现自定义的run方法 由于java中的接口可以多实现&#xff0c;所以…