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

Vue开发学习笔记:动态渲染自定义封装的uview-plus的Toast组件

1.封装uview-plus的Toast组件

在src下面创建一个components,然后在创建一个HxToast(自取)文件夹,自定义封装一个uview-plus的Toast组件(多文件模式)

index.vue文件代码

<template><up-toast ref="upToastRef"></up-toast>
</template><script lang="ts" src="./index.ts"></script><style lang="scss" scoped>
@import "./index.scss";
</style>

index.ts文件代码 

import { defineComponent, onMounted, ref } from "vue";
import type { Toast, ToastProps } from "uview-plus/toast"; // 直接从uview-plus导入类型
export default defineComponent({name: "HxToast",components: {},emits: ["showHxToast"],props: {/*** 层级* string | number;*/zIndex: { type: String },/*** 是否加载中* @default false*/loading: { type: Boolean },/*** 显示的文本* string | number;*/message: { type: String },/*** 图标,或者绝对路径的图片*/icon: { type: String },/*** toast出现的位置* @default "center"* "top" | "center" | "bottom";*/position: { type: String },/*** 主题类型* @default "default"* "default" | "error" | "success" | "loading";*/type: { type: String },/*** 跳转的参数* Record<string, any>;*/params: { type: Object },/*** 展示时间,单位ms* @default 2000* string | number;*/duration: { type: Number },/*** 执行完后的回调函数*/complete: () => {},},setup: (props) => {console.log("🚀 ~ props:", props);// 根据ref获取up-toast对象const upToastRef = ref<InstanceType<typeof Toast> | null>(null);// 定义 Props 类型// const props = defineProps<{// }>();// 显示Toastconst showHxToast = () => {console.log("自定义组件测试");// emits("showHxToast");// @ts-ignore 忽略错误,其实可用upToastRef.value.show(props);};onMounted(() => {showHxToast();});return { upToastRef, showHxToast };},
});

index.scss 文件代码 

.u-toast {position: fixed !important; /* 必须设置定位否则z-index无效 */z-index: 999999 !important;
}

1.1关键点

(1).在封装组件的.vue页面,使用uview-plus的Toast组件时,需要绑定ref属性

(2).在封装组件的.ts通过ref获取.vue中的Toast组件,定义一个与.vue页面的ref属性相同名称的变量获取对象

import type { Toast } from "uview-plus/types/comps/toast"; // 直接从uview-plus导入类型
// 根据ref获取up-toast对象
const upToastRef = ref<InstanceType<typeof Toast> | null>(null);

(3)..ts文件中通过获取的Toast对象,在方法中调用uview-plus的Toast组件自带的show方法

// 显示Toastconst showHxToast = () => {console.log("自定义组件测试");// emits("showHxToast");// @ts-ignore 忽略错误,其实可用upToastRef.value.show(props);};

(3).在封装组件的.ts文件中还需要设置emits暴露showHxToast方法方便在其他的.ts文件中使用,同时设置需要在调用时传入到自定义组件的参数,设置props属性,参数名称为了方便使用设置为跟uview-plus的Toast需要的属性一致

2.创建工具类

在src创建一个文件夹utility,定义一个工具类utility,用于动态渲染自定义封装的Toast组件

import { createVNode, render } from "vue";
import HxToast from "@/components/HxToast/index.vue";// 创建 自定义组件 容器
const container = document.createElement("div");
container.className = "hx-toast-container";
document.body.appendChild(container);// 创建 自定义组件 实例
const createCustomCom = (options: any) => {// 创建 VNodeconst vnode = createVNode(HxToast, options as any);// 创建临时容器const tempContainer = document.createElement("div");// 渲染到临时容器render(vnode, tempContainer);// 将元素添加到主容器container.appendChild(vnode.el as HTMLElement);
};// 定义静态方法
const CustomStatic = {// 动态创建自定义HxToast组件showHxToast(options: any) {createCustomCom(options);},
};// 导出静态方法
export default CustomStatic;// 导出组合式函数(可选)
export const customStatic = () => {return CustomStatic;
};// 使用案例
// import { customStatic } from "@/utility/utility";
// const { showHxToast } = customStatic();
//           showHxToast({
//             message: "测试",
//             type: "success",
//             position: "top",
//             icon: "loading",
//             duration: 3000, // 不自动关闭
//           });

2.1关键点

(1).使用 createVNode创建一个自定义组件的节点,然后使用render方法将组件再渲染到临时容器最后挂载到主容器

const vnode = createVNode(HxToast, options as any);

3.在其他的Vue画面中使用(多文件开发)

3.1先导入工具类utility

import CustomStatic from "@/utility/utility";

3.2在需要的地方调用自定义的组件

CustomStatic.showHxToast({message: "测试",type: "success",position: "top",icon: "loading",duration: 3000, // 3秒关闭});

http://www.xdnf.cn/news/13569.html

相关文章:

  • LeetCode--29.两数相除
  • 位移传感器远程监控软件说明
  • 【从零学习JVM|第八篇】深入探寻堆内存
  • BERT vs BART vs T5:预训练语言模型核心技术详解
  • MySQL锁机制的优化和MVCC底层原理解释
  • 【 java 虚拟机知识 第二篇 】
  • Vue 生命周期详解(重点:mounted)
  • Tomcat线程模型
  • bash挖矿木马事件全景复盘与企业级防御实战20250612
  • 干货分享|JumpServer PAM特权账号管理功能详解
  • WPF将容器内的组件按比例缩放
  • RAG实战:基于LangChain的《肖申克的救赎》知识问答系统构建指南
  • 医疗集团级“人-机-料-法-环”全流程质控的医疗数据质控方案分析
  • Verilog基础:标识符的定义位置
  • Seedance:字节发布视频生成基础模型新SOTA,能力全面提升
  • Java虚拟机解剖:从字节码到机器指令的终极之旅(一)
  • DRG支付场景模拟器扩展分析:技术实现与应用价值
  • Windows 前端开发环境一键启动 (NVM + Yarn)
  • 第五十一天打卡
  • EtherCAT转CANopen网关与伺服器在汇川组态软件上的配置步骤
  • 【AI论文】Qwen3 嵌入:通过基础模型推进文本嵌入和重新排序
  • JavaWeb期末速成 样题篇
  • JSON 技术:从核心语法到编辑器
  • ruoyi框架添加开始事件自定义属性解释
  • 模拟IC设计基础系列6-差动放大器 Differential AMP
  • 大模型技术30讲-4-彩票假设
  • MCP(Model Context Protocol)与 LangChain的区别与联系
  • 标识符和预处理 day12
  • 6.10[A]BB84 量子
  • 一般增长率