【vue】Vue3中使用函数调用组件内函数和创建组件【超详细】

news2024/11/23 22:20:16

uniapp+uview vue3+typescript版本,使用函数方式调用和创建组件,并使用组件内的方法

项目场景

今天突然觉得在视图上应用组件,然后在script脚本里操作组件这方式特别的麻烦。因为每次使用组件时都要进行应用,不管你用不用你都要引用,就比如以下图片
在这里插入图片描述
所以我为了偷懒就开始想直接调用函数去创建组件和使用组件内的方法。从而不用每次使用弹出框或者警示框是都要在视图中进行引入。


解决方案:

于是是我开open度娘,网上特别多答案都是需要我使用createApp创建实例,并对组件传入你想要给他的参数,就相当于父传子参数一样。就比如以下这样子:
在这里插入图片描述
项目代码:
https://gitee.com/derekgo/uni-chat/blob/master/uniapp/src/plugins/model/loading/index.ts

但是我发现还真的只能创建实例和传参数,不能调用组件内的方法。反正我是在createApp函数里挂载后也找不到组件内的方法使用。于是我想到了vue也有函数式组件h,然后再用render进行渲染,创建虚拟dom,渲染到视图中。于是我这么写了。

toast.ts

import { h, ref, render} from "vue";
import uToast from "@/uni_modules/vk-uview-ui/components/u-toast/u-toast.vue"
import {typeType} from "@/plugins/model/toast/types";

interface propsInterface{
    title:string,
    type?:typeType,
    duration?:number,
    position?:string,
    zIndex?:number,
}
const parentNode = document.createElement('div')
parentNode.setAttribute("id","toast-style")
let optionsInit:propsInterface = {
    title:"",
    type:"default",
    duration:2000,
    position:"center",
    zIndex:999,
}
let options = ref<propsInterface>(optionsInit)

const handleToastRender = () => {
    // 创建 虚拟dom
    const boxVNode = h(uToast, {...options.value})
    // 将虚拟dom渲染到 container dom 上
    render(boxVNode, parentNode)
    // 最后将 container 追加到 body 上
    document.body.appendChild(parentNode)
    return boxVNode;
}

let modalInstance: any

const handleToast = () => {
    const show = (props:propsInterface)=>{
        if (modalInstance) {
            const toastVue = modalInstance.component
            // 调用上述组件中定义的open方法显示弹框
            // 注意不能使用toastVue.ctx来调用组件函数(build打包后ctx会获取不到)
            toastVue.proxy.show(props);
        } else {
            options.value = Object.assign(options.value,props)
            modalInstance = handleToastRender()
            show(options.value)
        }
    }
    const hide = ()=>{
        if (modalInstance) {
            const toastVue = modalInstance.component
            console.log(toastVue.proxy);
            // 调用上述组件中定义的open方法显示弹框
            // 注意不能使用toastVue.ctx来调用组件函数(build打包后ctx会获取不到)
            toastVue.proxy.hide();
        } else {
            modalInstance = handleToastRender()
            hide()
        }
    }
    return {show,hide}
}

export default handleToast

把toast.ts文件的函数挂载到vue的原型链

import {toast} from "./toast"
xxx
export function createApp() {
  const app = createSSRApp(App);
   app.config.globalProperties.$toast = toast()
  return {
    app,
  };
}

项目中使用

...
const {appContext,proxy} = getCurrentInstance() as ComponentInternalInstance

let globalProperties = appContext.config.globalProperties;
g
lobalProperties.$toast.show({title:"222"})

项目代码
https://gitee.com/derekgo/uni-chat/blob/master/uniapp/src/plugins/model/toast/index.ts

在这里插入图片描述

踩坑不易,还希望各位大佬支持一下 \textcolor{gray}{踩坑不易,还希望各位大佬支持一下} 踩坑不易,还希望各位大佬支持一下

📃 个人主页: \textcolor{green}{个人主页:} 个人主页: 沉默小管

📃 个人网站: \textcolor{green}{个人网站:} 个人网站: 沉默小管

📃 个人导航网站: \textcolor{green}{个人导航网站:} 个人导航网站: 沉默小管导航网

📃 我的开源项目: \textcolor{green}{我的开源项目:} 我的开源项目: vueCms.cn

🔥 技术交流 Q Q 群: 837051545 \textcolor{green}{技术交流QQ群:837051545} 技术交流QQ群:837051545

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

如果有不懂可以留言,我看到了应该会回复
如有错误,请多多指教

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

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

相关文章

TDengine“露面”中国油气田企业智慧油田技术交流大会,为时序数据处理带来全新思路

2023 年 7 月 4 日- 6 日&#xff0c;由中国石油和化学工业联合会主办&#xff0c;中国石油油气和新能源分公司、中国石化油田勘探开发事业部、中国海洋石油有限公司勘探开发部协办的“中国油气田企业智慧油田技术交流大会”在北京市召开。本次大会邀请了中国石油、中国石化、中…

Android Studio实现内容丰富的安卓房屋出租租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号063 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看租房列表…

SSMP整合案例(12) 在界面中实现删除操作

接下来我们来说删除 首先 我们要在表格上加上删除和修改两个操作按钮 我们先在App.vue页面部分编写 参考代码如下 <el-table-columnalign"right"label"操作" ><template slot-scope"scope"><el-buttonsize"mini"type…

王道考研数据结构——基本概念

06 算法的时间复杂度 线性的时间复杂度 O(n^3)O(n^2*logn) O(n^3) O(logN) 无法确定&#xff0c;和输入的数据量有关系&#xff0c;使用平均复杂度&#xff1a; 最坏/平均时间复杂度 07 算法的空间复杂度 S(n)n S(n)O(n^2) 刷题&#xff1a; O(n^3) 答案&#xff1a; B…

Maven 配置本地jar,通过下载第三方jar包,然后手动配置maven jar包依赖 例如:IKExpression

说明&#xff1a;有时候有一些jar包 maven中央仓库和阿里云仓库没有收录的jar包需要手动下载至本地进行手动添加maven依赖&#xff0c;就拿 IK表达式 IKExpression jar 包来说 第一步 下载IKExpression 包 没有这个包的同学可以点击下载阿里云盘分享 第二步 找到自己项目本地…

vue3+elementUiplus开发的项目如何修改公共标签的默认颜色

背景:使用elementUiplus开发路由菜单栏需要更改默认颜色 步骤: 查看用到的变量 如:var(–el-menu-bg-color); 修改: index.scss文件下进行style的修改 :root {--el-color-primary: #0cba80 !important; // 主题色--el-color-primary-dark-2: #0cba80 !important;--el-color-…

datagrip連接mysql數據連接不上

昨天使用datagrip進行數據庫的連接時發現遲遲連接不上&#xff0c;問了老大才發現問題是&#xff1a; 在host中是無需要加入jdbc:mysql://這些的&#xff0c;只需要將wiltechs-based…放入host中即可

3D点云实战案例

sd推荐免费3D场景建模工具&#xff1a;NSDT场景编辑器 CloudCompare是一个三维点云&#xff08;网格&#xff09;编辑和处理软件。最初&#xff0c;它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构&#xff0c;在进行点云对比这类任务时具有出色的性…

vue前端权限控制设计

概述 vue前端和后端程序是分离开发的&#xff0c;既然是分离的&#xff0c;vue前端怎么进行用户权限控制呢&#xff1f;本文介绍vue前端权限控制的方法&#xff0c;包括后端接口访问权限、页面操作按钮的权限、菜单的查看权限和vue路由的访问权限。 后端接口的访问权限 后端…

【服务器必备】Docker:使用容器技术,轻松部署应用

1、介绍 1.1 docker是什么&#xff1f;&#xff08;来自于维基百科&#xff09; Docker是一种流行的容器化技术&#xff0c;它能够帮助开发人员和运维人员更快、更轻松地部署和管理应用程序。通过使用Docker&#xff0c;您可以将应用程序及其依赖项打包到一个轻量级、可移植的…

spring系列-Spring Boot从初识到实战

Spring Boot从初识到实战 一、Hello Spring Boot 1、Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2、微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一…

问你个问题,项目进度怎样控制才有效?

早上好&#xff0c;我是老原。 有多少项目经理&#xff0c;每天都被项目进度搞得焦头烂额。 对于项目经理们来说&#xff0c;最可怕的事情莫过于项目虽然还在&#xff0c;但时间却没了…… 试问谁不想把项目和进度都牢牢握在手里&#xff0c;享受运筹帷幄的感觉&#xff0c;…

多领域应用落地,火山引擎ByteHouse加速云数仓升级

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎数智平台VeDI直播活动「超话数据」在线举办&#xff0c;来自火山引擎的产品及解决方案专家分享了以ByteHouse为代表的云数仓产品在字节跳动…

【设计模式】第十一章:享元模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

每周学点数学 3:概率论基础2

文章目录 1.独立性与相关性2.条件概率与边缘概率3.大数定律与中心极限定理4.随机过程5.概率论的应用 1.独立性与相关性 独立性与相关性是在数据分析中非常重要的两个概念&#xff0c;它们之间存在一定的联系&#xff0c;但也有明显的区别。 独立性&#xff08;Independence&…

CSS(持续更新!~)

二&#xff1a; 进阶&#xff1a; 只打算起到装饰作用的图片就建议就背景图片 块级标签就是&#xff1a;独占一行的标签&#xff08;比如div&#xff09;并且可以加宽加高 行内元素&#xff1a;就是不会独占一行的标签&#xff08;比如a&#xff0c;span等等&#xff0c;不可以…

软件测试为什么要学习数据库

目录 前言&#xff1a; 一、为什么要学习数据库 二、常见数据库 三、如何学习数据库 前言&#xff1a; 数据库是用于存储、组织和管理数据的系统&#xff0c;它在各个领域都得到广泛应用&#xff0c;包括企业、学术界、政府和互联网等。 一、为什么要学习数据库 能够反作…

PS 快速选择工具基本操作讲解 通过 选择并遮住 调整后续

我们先打开PS软件 然后打开一个项目 前面几篇文章我们讲了磁性套索工具 其实就已经比较智能了 但是 毕竟拿东西还得自己去描边&#xff0c;操作起来并不是特别轻松 那么 我们今天看的东西就会更智能一些 我们将鼠标在下图指向位置右键 然后在弹出的选项中选择快速选择工具 选…

Notepad++ 打开单独窗口

应用1、打开完全独立的新窗口 快捷键&#xff1a;AltF6 应用2、打开新视图

CSDN 周赛 61 期

CSDN 周赛 60 期 参赛体验判断题单选题填空题编程题1、题目名称:最近的回文数2、题目名称:风险投资小结参赛体验 嗯,今天的填空题又出了新的幺蛾子,直接所有人不给分?看到 bug 提交去好多人在议论这问题。 这个未阅卷是个啥情况?机器人下班了,要改人工了? 然后,C 站…