如何在一个传统的html中,引入vueJs并使用vue复制组件?

news2024/9/23 17:11:32

如何在一个传统的html中,引入vueJs并使用vue复制组件?

    • 1.1 引言
    • 1.2 背景
    • 1.3 解决方案
      • 1.3.1 解决方案一:直接使用clipboard(不推荐仅供参考学习)
      • 1.3.2 解决方案二:封装指令js库后使用 (推荐)

1.1 引言

这篇博文主要分享如何在一个传统的html中,通过通过引入js方式使用vue功能和vue复制组件。

1.2 背景

项目是一个传统的前后端在一起的项目,前端框架使用的一些前端组件库是通过在html中引入bootstrap,vue 等JS实现。
无法使用包管理器,不支持import和export等语法,现在要求在这样的背景下,实现一键复制功能。
在这里插入图片描述

1.3 解决方案

在这里插入图片描述
我们知道在支持包管理器安装的vue项目中可以这样使用,有两种用法。

但是很显然第二种v-clipboard:copy="inputData" 使用方式更加优雅。

<template>
  <div class="app-container">
    <el-tabs v-model="activeName">
      <el-tab-pane label="use clipboard  directly" name="directly">
        <el-input 
          v-model="inputData" placeholder="Please input" 
          style="width:400px;max-width:100%;" />
        <el-button type="primary" 
            icon="el-icon-document" 
             @click="handleCopy(inputData,$event)"
           >
          copy
        </el-button>
      </el-tab-pane>
      <el-tab-pane label="use clipboard by v-directive" name="v-directive">
        <el-input v-model="inputData" placeholder="Please input" style="width:400px;max-width:100%;" />
        <el-button 
        v-clipboard:copy="inputData" 
        v-clipboard:success="clipboardSuccess" 
        type="primary" icon="el-icon-document">
          copy
        </el-button>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>

<script>
import clip from '@/utils/clipboard' // use clipboard directly
import clipboard from '@/directive/clipboard' // use clipboard by v-directive

export default {
  name: 'ClipboardDemo',
  directives: {
    clipboard
  },
  data() {
    return {
      activeName: 'directly',
      inputData: 'https://github.com/PanJiaChen/vue-element-admin'
    }
  },
  methods: {
    handleCopy(text, event) {
      clip(text, event)
    },
    clipboardSuccess() {
      this.$message({
        message: 'Copy successfully',
        type: 'success',
        duration: 1500
      })
    }
  }
}
</script>
  • 详细示例参见:https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/clipboard/index.vue

那么在传统的html中引入js方式使用,又该如何改造呢?

1.3.1 解决方案一:直接使用clipboard(不推荐仅供参考学习)

封装简化下

clipboard_plugin_v1.js

// 定义自定义指令对象
const clipboardDirective = {
    // 在 bind 钩子中初始化 Clipboard.js 实例
    bind(el, binding) {
        const clipboard = new ClipboardJS(el, {
            text: () => binding.value,
        });

        clipboard.on('success', (e) => {
            e.clearSelection();
            // 触发成功复制事件,您可以在这里添加自定义处理逻辑
            el.dispatchEvent(new Event('clipboard-success'));
        });

        clipboard.on('error', (e) => {
            // 触发复制失败事件,您可以在这里添加自定义处理逻辑
            el.dispatchEvent(new Event('clipboard-error'));
        });

        // 将 Clipboard.js 实例绑定到元素上以便后续销毁
        el._clipboard = clipboard;
    },

    // 在 unbind 钩子中销毁 Clipboard.js 实例
    unbind(el) {
        const clipboard = el._clipboard;
        if (clipboard) {
            clipboard.destroy();
            delete el._clipboard;
        }
    },
};
// 注册自定义指令
Vue.directive('clipboard', clipboardDirective);

html中使用示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用自定义 Clipboard 指令</title>
</head>
<body>
    <div id="app">
                                <el-button
                                        @click="copyText(textToCopy)"
                                        id="clipboardBtn"
                                        type="primary"
                                        icon="el-icon-document"
                                >
                                    复制
                                </el-button>
    </div>

    <!-- 引入 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>

    <!-- 引入 Clipboard.js 这里如果服务器不支持访问外网,请下载下来引入本地文件
          效果等价于执行 npm install `clipboard` --save -->
    <script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>

    <!-- 引入自定义 clipboard_plugin_v1.js 
         效果等价于 import clipboard from '@/directive/clipboard' -->
    <script src="../assets/js/clipboard/clipboard_plugin_v1.js"></script>

    <script>
        // 创建 Vue 实例
        new Vue({
            el: '#app',
            directives: { clipboardDirective },
            data: {
                textToCopy: '这是要复制的文本',
                clipboardInstance: null,
            },
            methods: {
              copyText(textToCopy) {
                let vm = this;
                if (vm.clipboardInstance) {
                    vm.clipboardInstance.destroy(); // 销毁旧的 clipboard 实例
                }
                // 在此处将要复制的文本设置为传递的参数
                vm.clipboardInstance = new ClipboardJS('#clipboardBtn', {
                    text: () => textToCopy
                });

                vm.clipboardInstance.on('success', (e) => {
                    e.clearSelection();
                    vm.$message({
                        message: '文本已成功复制到剪贴板!',
                        type: 'success',
                        duration: 1500
                    })
                });
                vm.clipboardInstance.on('error', (e) => {
                    e.clearSelection();
                    vm.$message({
                        message: '复制操作失败,请手动复制文本!',
                        type: 'error',
                        duration: 1500
                    })
                });
                // 在调用 copyToClipboard 方法时自动启动剪贴板复制操作,因此用户不需要手动单击按钮来复制文本。
                //vm.clipboardInstance.onClick({ currentTarget: document.querySelector('#clipboardBtn') });
            },
            },
        });
    </script>
</body>
</html>

1.3.2 解决方案二:封装指令js库后使用 (推荐)

为了简化可以使用类似 v-clipboard:copy语法,这里我们除了引入剪切板js库之外,还需要封装下指令到一个js中。
因为只有封装后我们才能使用directives: { clipboardDirectiveV2 }, 这种语法来简化使用。

clipboard_plugin_v2.js

// clipboard_plugin_v2.js

// Inspired by https://github.com/Inndy/vue-clipboard2
const clipboardDirectiveV2 = {
    bind(el, binding) {
        if (binding.arg === 'success') {
            el._v_clipboard_success = binding.value
        } else if (binding.arg === 'error') {
            el._v_clipboard_error = binding.value
        } else {
            const clipboard = new ClipboardJS(el, {
                text: () => binding.value,
                action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
            });
            clipboard.on('success', e => {
                const callback = el._v_clipboard_success
                callback && callback(e) // eslint-disable-line
            })
            clipboard.on('error', e => {
                const callback = el._v_clipboard_error
                callback && callback(e) // eslint-disable-line
            })
            el._v_clipboard = clipboard
        }
    },
    update(el, binding) {
        if (binding.arg === 'success') {
            el._v_clipboard_success = binding.value
        } else if (binding.arg === 'error') {
            el._v_clipboard_error = binding.value
        } else {
            el._v_clipboard.text = function() { return binding.value }
            el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
        }
    },
    unbind(el, binding) {
        if (binding.arg === 'success') {
            delete el._v_clipboard_success
        } else if (binding.arg === 'error') {
            delete el._v_clipboard_error
        } else {
            el._v_clipboard.destroy()
            delete el._v_clipboard
        }
    }
}
// 注册自定义指令
Vue.directive('clipboard', clipboardDirectiveV2);

然后在html中调用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>使用自定义 Clipboard 指令</title>
</head>
<body>
    <div id="app">
        <!-- 使用自定义 Clipboard 指令复制文本 -->
        <button 
        v-clipboard:copy="textToCopy" 
        @clipboard-success="handleCopySuccess" 
        @clipboard-error="handleCopyError">复制</button>
    </div>

    <!-- 引入 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>

    <!-- 引入 Clipboard.js 这里如果服务器不支持访问外网,请下载下来引入本地文件
          效果等价于执行 npm install `clipboard` --save -->
    <script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.8/dist/clipboard.min.js"></script>

    <!-- 引入自定义 clipboard_plugin_v2.js 
         效果等价于 import clipboard from '@/directive/clipboard' -->
    <script src="../assets/js/clipboard/clipboard_plugin_v2.js"></script>

    <script>
        // 创建 Vue 实例
        new Vue({
            el: '#app',
            directives: { clipboardDirectiveV2 },
            data: {
                textToCopy: '这是要复制的文本',
            },
            methods: {
                handleCopySuccess() {
                    // 复制成功时的处理逻辑
                    alert('文本已成功复制到剪贴板!');
                },
                handleCopyError() {
                    // 复制失败时的处理逻辑
                    alert('复制操作失败,请手动复制文本!');
                },
            },
        });
    </script>
</body>
</html>

在这里插入图片描述

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

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

相关文章

Springboot给每个接口设置traceId,并添加到返回结果中

原理 slf4j有个MDC的类&#xff0c;是ThreadLocal的实现&#xff0c;保存在这里的变量会绑定到某个请求线程&#xff0c;于是在该请求的线程里的日志代码都可以使用设入的变量。 实现 一、引入依赖 这个是可选项&#xff0c;用于生成唯一uid&#xff0c;我人懒&#xff0c…

一文带你了解 Linux 的 Cache 与 Buffer

目录 前言一、Cache二、Buffer三、Linux 系统中的 Cache 与 Buffer总结 前言 内存的作用是什么&#xff1f;简单的理解&#xff0c;内存的存在是为了解决高速传输设备与低速传输设备之间数据传输速度不和谐而设立的中间层&#xff08;学过计算机网络的应该都知道&#xff0c;这…

【实战】kubeadmin安装kubernetes集群

文章目录 前言服务器介绍准备工作设置服务器静态ip修改host关闭防火墙和swap修改所需的内核参数 部署步骤安装containerd安装cri工具&#xff08;效果等同于docker&#xff09; 安装kubernetes集群安装网络插件flannel安装可视化面板kuboard&#xff08;可选&#xff09; 下期预…

42. QT中开发Android配置QFtp功能时遇到的编译问题

1. 说明 此问题仅适用在QT中开发Android程序时&#xff0c;需要适用QFtp功能的情况。一般情况下&#xff0c;如果开发的是Windows或者Linux系统下的程序&#xff0c;可能不会出现该问题。 2. 问题 【Android】在将QFtp的相关代码文件加入到项目中后&#xff0c;编译项目时会…

sql server判断两个集合字符串是否存在交集

sql server判断字符串A101;A102和字符串A102;A103是否存在交集 我们编写两个函数&#xff1a; 1&#xff09;函数fn_split将字符串拆分成集合 create function [dbo].[fn_split](inputstr varchar(8000), seprator varchar(10)) returns temp table (Result varchar(200)) a…

TCP/IP(七)TCP的连接管理(四)全连接

一 全连接队列 nginx listen 参数backlog的意义 nginx配置文件中listen后面的backlog配置 ① TCP全连接队列概念 全连接队列: 也称 accept 队列 ② 查看应用程序的 TCP 全连接队列大小 实验1&#xff1a; ss 命令查看 LISTEN状态下 Recv-Q/Send-Q 含义附加&#xff1a;…

2785323-77-3,MAL-Alkyne,双功能连接试剂Alkyne maleimide

炔烃马来酰亚胺&#xff0c;Alkyne maleimide,MAL-Alkyne是一种非常有用的双功能连接试剂&#xff0c;可以在生物分子中发挥重要的作用。它的马来酰亚胺基团可以与生物分子中的硫醇基团反应&#xff0c;形成共价键&#xff0c;从而将生物分子与炔烃连接起来。这种连接方式在生物…

React的类式组件和函数式组件之间有什么区别?

React 中的类组件和函数组件是两种不同的组件编写方式&#xff0c;它们之间有一些区别。 语法和写法&#xff1a;类组件是使用类的语法进行定义的&#xff0c;它继承自 React.Component 类&#xff0c;并且需要实现 render() 方法来返回组件的 JSX。函数组件是使用函数的语法进…

Linux|qtcreator编译可执行程序双击运行

qt GUI window移植到linux参见&#xff1a;VS|vs2017跨平台编译linux&&CConsole&&QtGUI 参考&#xff1a;QtCreator修改项目的生成目录 文章目录 双击.pro文件&#xff0c;点击configureproject构建项目切换到release模式下双击打开pro文件&#xff0c;修改依赖…

嵌入式Linux裸机开发(六)EPIT 定时器

系列文章目录 文章目录 系列文章目录前言介绍配置过程 前言 前面学的快崩溃了&#xff0c;这也太底层了&#xff0c;感觉学好至少得坚持一整年&#xff0c;我决定这节先把EPIT学了&#xff0c;下面把常见三种通信大概学一下&#xff0c;直接跳过其他的先学移植了&#xff0c;有…

项目平台——项目首页设计(五)

这里写目录标题 一、页面成果图展示二、滚动条组件的使用三、页面设计1、需要4个盒子2、项目名称样式设计3、对基本信息、bug统计、执行记录进行样式设计4、基本信息5、bug统计 四、echarts使用1、安装2、折线图的使用 一、页面成果图展示 二、滚动条组件的使用 当内容超过屏幕…

虹科技术 | 重磅更新!手持式PCAN-Diag FD现可扩展为J1939监控器

重磅更新&#xff01;现可将手持式PCAN-Diag FD现可扩展为J1939监控器&#xff0c;协助您的CAN总线通信诊断&#xff01; 文章目录 一、PCAN-Diag FD 功能更新二、PCAN-Diag FD 简介 一、PCAN-Diag FD 功能更新 PCAN-Diag FD可以监控CAN/CAN FD总线的通信情况&#xff0c;可以…

SAP 设置不能用ME52N修改PR,但需要PR的修改权限

SAP 设置不能用ME52N修改PR&#xff0c;但需要PR的修改权限 想到3个思路&#xff1a; 1.设置屏幕字段控制&#xff0c;分配用户参数 2.设置屏幕变式SHD0 3.增强逻辑控制 此处用增强示例&#xff1a;

实现基于 GitLab 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…

第十七章总结

一.SQL语言 1.select语句 select语句用于从数据表中检索数据。语法&#xff1a; SELECT 所选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式&#xff08;指定分组的条件&#xff09; OEDER BY 字段名[ASC|DESC] 2.insert语句 i…

Adobe Media Encoder 2024,高效编码和转换视频的首选工具

Adobe Media Encoder 2024&#xff08;简称Me2024&#xff09;是Adobe公司推出的一款专业级视频编码和转换工具。它可以将各种格式的音频、视频文件转换为您需要的格式&#xff0c;并支持批量处理&#xff0c;让您在短时间内完成大量任务。 Me2024集成了Adobe Premiere Pro、A…

面部检测与特征分析:视频实时美颜SDK的核心组件

随着视频直播、社交媒体和在线会议的流行&#xff0c;人们对于美颜工具的需求不断增加。无论是自拍照片还是视频聊天&#xff0c;美颜技术已经成为现代应用程序的不可或缺的一部分。本文将深入探讨视频实时美颜SDK的一个核心组件——面部检测与特征分析。 一、面部检测技术 …

设计一个 SSO 单点登录系统

单点登录 &#xff08;SSO&#xff09; 发生在用户登录到一个应用程序&#xff0c;然后自动登录到其他应用程序时&#xff0c;无论用户使用的平台、技术或域如何。用户仅登录一次&#xff0c;因此功能的名称&#xff08;单一登录&#xff09;。 例如&#xff0c;如果您登录 Gm…

双周赛114(模拟、枚举 + 哈希、DFS)

文章目录 双周赛114[2869. 收集元素的最少操作次数](https://leetcode.cn/problems/minimum-operations-to-collect-elements/)模拟 [2870. 使数组为空的最少操作次数](https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-empty/)哈希 枚举 [2871. 将数…