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

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秒关闭});

相关文章:

  • 大模型技术30讲-5-利用数据来减少过拟合现象
  • 上海市计算机学会竞赛平台2022年5月月赛丙组最远城市距离
  • 新零售视域下实体与虚拟店融合的技术逻辑与商业模式创新——基于开源AI智能名片与链动2+1模式的S2B2C生态构建
  • win11系统部署tomcat10教程
  • @SchedulerLock处理Spring Task在分布式环境下的重复执行问题
  • 2025 年中国大学生程序设计竞赛全国邀请赛(郑州)暨第七届CCPC河南省大学生程序设计竞赛 Problem F. 幻形之路
  • 在rust中执行命令行输出中文乱码解决办法
  • Systemd 服务配置完整指南
  • 注册bean和自动配置的原理、过程
  • 初识MySQL · 事务 · 下
  • 使用最新Dify1.4.1集成LM Studio的QWQ32B绘制工作流
  • HashMap真面目
  • ( github actions + workflow 03 ) 手动添加 token, 防止权限不够
  • 价格性价比高系列的高性能单片机MS32C001-C
  • 新加坡金融管理局责令未获许可加密货币公司于6月30日前退出,Bitget、Bybit考虑撤离
  • 大模型在关键社会领域的应用研究:金融、医疗和法律
  • 河南农担携手Gitee企业版:构建农业金融数字化研发新基建
  • Vue.js 从入门到实战:用户管理分页表格项目详解
  • 需求文档:边缘计算机软件重装与物联网登录应用开发
  • Fastadmin报错Unknown column ‘xxx.deletetime‘ in ‘where clause
  • 021新手学做网站/如何在各大网站发布信息
  • 新沂网站制作/图片优化是什么意思
  • 做网站的职业叫什么/湖南关键词优化品牌价格
  • 湖州建设企业网站/百度官网入口
  • 网站怎么做电脑系统下载/上海推广seo
  • 中医风格网站模板/如何制作网址链接