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

MyPrint打印设计器(四)vue3 函数式调用组件

vue3 函数式调用组件

vue中,通常情况下调用一个组件需要以下步骤

  • 导入组件
  • template引入组件,并且设置ref属性
  • 在js模块定义对应的ref属性
  • 通过ref对象调用对应的方法

如果这个组件在template是不必要的,那么可以通过函数式调用组件,
来省略在template标签中引入组件,来简化调用步骤,做到可以通过纯js调用组件

这种方法也有一定的缺陷,因为在初始化的时候就已经确定了组件的DOM所在的层级,所以无法灵活的控制DOM元素的层级,
所有一般在Message这种不关心组件DOM层级的组件中使用,以下是使用示例,结尾有实战项目中的使用示例

在这里插入图片描述

组件代码

<!--MessageBox.vue-->
<script setup lang="ts">
  import {ref} from "vue";
  
  interface Message {
    msg: string
  }
  
  defineExpose({
    success, clear
  });
  const messageContentList = ref<Message[]>([]);
  
  function success(msg: string) {
    messageContentList.value.push({msg})
  }
  
  function clear() {
    messageContentList.value.length = 0
  }

</script>

<template>
  
  <div class="msg_wrapper">
    <div v-for="(item) in messageContentList">
      <div class="msg_body">
        <span class="msg_content">
        {{ item.msg }}
      </span>
      </div>
    
    </div>
  </div>
</template>

<style scoped>
  .msg_wrapper {
    position: fixed;
    width: 100%;
    top: 0;
    left: 0;
    right: 0;
    z-index: 100000;
    pointer-events: none;
    text-align: center;
  }
  
  .msg_body {
    display: inline-flex;
    padding: 10px 20px;
    margin-top: 5px;
    background: gray;
    border-radius: 5px;
  }
</style>

渲染安装组件

// install.ts
import {App, h, render, VNode} from 'vue';
import MessageBox from './MessageBox.vue';


let messageBoxNode: VNode = null!;
let successMsgHandle: (msg: string) => void;
let clearHandle: () => void;

export function mountMessageBox(app: App<any>) {
    if (!messageBoxNode) {
        messageBoxNode = h(MessageBox, {});
        const container = document.createElement('div');
        messageBoxNode.appContext = app._context;

        render(messageBoxNode, container);

        successMsgHandle = messageBoxNode.component!.exposed!.success;
        clearHandle = messageBoxNode.component!.exposed!.clear;

        document.body.appendChild(container.firstElementChild!);
    }
}

export function success(msg: string) {
    successMsgHandle(msg)
}

export function clearMsg() {
    clearHandle()
}

使用

1、main.js中安装

// main.js
import {createApp} from 'vue'
import './style.css'
import App from './App.vue'
import {mountMessageBox} from "./components/install.ts";

const app = createApp(App);
mountMessageBox(app)
app.mount('#app')

2、代码中使用


<script setup lang="ts">
  import {ref} from "vue";
  import {success, clearMsg} from "./components/install.ts";
  
  const input = ref('MyPrint打印设计器,函数式调用组件实例!')
  
  function showMsg() {
    success(input.value)
  }
  
  function clickClearMsg() {
    clearMsg()
  }
</script>

<template>
  <input v-model="input" type="text">
  <button @click="showMsg">
    发送
  </button>
  <button @click="clickClearMsg">
    清空
  </button>
</template>

代码仓库

代码仓库:github

代码仓库:gitee

实战项目:MyPrint 可视化打印设计器

操作简单,组件丰富的一站式打印解决方案打印设计器

体验地址:前往

代码仓库:github

代码仓库:gitee


http://www.kler.cn/a/283361.html

相关文章:

  • 分布式锁实践方案
  • JavaWeb后端开发知识储备1
  • C++单例模式与多例模式
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • git下载慢下载不了?Git国内国外下载地址镜像,git安装视频教程
  • NAT网络工作原理和NAT类型
  • vue3 使用vue-masonry加载更多,重新渲染
  • Java设计模式之装饰器模式详细讲解和案例示范
  • 深度学习:图像数据分析的革命
  • HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)
  • jmeter连接mysql数据库以及常规用法
  • node环境安装、vue-cli搭建过程、element-UI搭建使用过程
  • 生产监控系统与生产控制系统区别
  • 【实践经验】端口被占用问题:listen tcp:bind:only one usage of each socket address
  • 文心智能体-梦想目标实现助手-实现你的老板梦
  • Golang小项目(1)
  • asp.net core在win上的发布和部署
  • 命令模式与事件驱动编程:如何将两者结合以优化系统设计
  • 卸载重装redis
  • Python新手:学习 itertools.takewhile 迭代右过滤
  • 如何使用 Go 语言开发微服务
  • MIT 6.5840(6.824) Lab 4:Fault-tolerant Key/Value Service 设计实现
  • 可达性分析算法是什么?用于什么场景?解决什么问题?
  • 淘宝API接口解析: item_fee获取淘宝商品运费接口
  • 钉钉打包以后发送报错 org.apache.tomcat.util.codec.binary.Base64.encodeBase64([B 解决描述
  • Spring Security配置详细