vue3.2从0-1封装一个组件库 ( 组件项目的创建 - 发布npm - 使用组件库 )

2023-11-11

vue3.2从0-1封装一个组件库

1:组件的项目初建

1-1创建项目

  • npm init vue@latest
  • 目录文件
    在这里插入图片描述

1-2 packages / button / index.js

// @ts-nocheck
import tButton from "./index.vue";
tButton.install = (app) => {
  app.component(tButton.name, tButton);
};
export default tButton;

1-3 packages / button / index.vue

<!-- -->
<template>
  <div>
    <button><slot /></button>
  </div>
</template>
<script>
export default {
  name: 'tButton'
}
</script>
<script setup></script>
<style lang="scss" scoped></style>

1-4 packages / index.js

import tButton from "./button/index.js";

const install = (app) => {
  app.use(tButton);
};
const TUI = {
  install,
};
// 按需引入 import { tButton } from "TUI"
export {
  tButton
};
export default TUI;

1-5 使用 组件 - App.vue

<!-- App -->
<template>
  <div>
    App

    <t-button>我是按钮</t-button>
  </div>
</template>

<script setup lang="ts" name="App">
// import tButton from "../packages/button/index.vue";
import {} from "vue";
</script>
<style lang="scss" scoped></style>

1-6 package.json

{
  "name": "vue-ui",
  "version": "0.0.1",
  "private": "false",
  "main": "./dist/vue-ui.mjs",
  "module": "./dist/vue-ui.umd.js",
  "exports": {
    ".": {
      "import": "./dist/vue-ui.mjs",
      "require": "./dist/vue-ui.umd.js"
    }
  },
  "files": ["dist/*"],
}

1-7 main.js

import { createApp } from "vue";
import App from "./App.vue";

import "./assets/main.css";

import TUI from "../packages/index";

const app = createApp(App);
app.use(TUI);
app.mount("#app");

1-7 vite.config.ts 配置打包的入口

import {
  defineConfig
} from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      external: ["vue"],
      output: {
        globals: {
          vue: "Vue"
        }
      }
    },
    lib: {
      // 打包的入口
      entry: "./packages/index.js",
      name: "xzl-vue-ui",
    },
  },
})

2:组件库 之 button组件

2-1 packages / button / index.vue

<!-- -->
<template>
  <div :class="tClass">
    <button><slot /></button>
  </div>
</template>
<script lang="ts">
export default {
  name: 'tButton'
}
</script>
<script setup lang="ts">
import { computed } from 'vue'
type Props = {
  type?: string
}
const props = withDefaults(defineProps<Props>(), {
  type: 'default'
})
console.log('props', props.type)
const tClass = computed(() => {
  return ['t-button', `t-button-${props.type}`]
})
</script>

<style lang="scss" scoped>
button {
  outline: none;
  border: 0;
  background: none;
  cursor: pointer;
}
.t-button {
  button {
    padding: 12px 20px;
    border: 1px solid #ccc;
    border-radius: 4px;
    &:hover,
    &:focus {
      opacity: 0.7;
    }
  }
}
.t-button-default {
  button {
    background: #b4b0b0;
    color: #000;
  }
}
.t-button-success {
  button {
    background: #0eac77;
    color: #fff;
  }
}
.t-button-warning {
  button {
    background: red;
    color: #fff;
  }
}
</style>

2-2 使用 button 组件

    <tButton>按钮1</tButton>
    <tButton type="success">按钮</tButton>
    <tButton type="warning">按钮</tButton>

效果

在这里插入图片描述

3:组件库 之 input组件

3-1 packages / input / index.js

<!-- 简单的input组件 -->
<template>
  <div>
    <input :type="tType" :value="modelValue" @input="input" />
  </div>
</template>
<script lang="ts">
export default {
  name: 'tInput'
}
</script>
<script setup lang="ts" name="tInput">
import { computed } from 'vue'
const props = withDefaults(
  defineProps<{
    type?: string
    modelValue?: string | number
  }>(),
  {
    type: 'text',
    modelValue: ''
  }
)
const emit = defineEmits(['update:modelValue'])
const tType = computed(() => {
  return props.type
})
const input = event => {
  emit('update:modelValue', event.target.value)
}
</script>
<style lang="scss" scoped></style>

3-2 使用 input 组件

<!-- -->
<template>
  <div>
    inpVal - {{ inpVal }}
    <tInput v-model="inpVal"></tInput>
    <tInput type="password"></tInput>
  </div>
</template>
<script setup name="App">
// import tBB from '../packages/button/index'
import { ref } from 'vue'
const inpVal = ref('')
</script>
<style lang="scss" scoped></style>

3-3效果

在这里插入图片描述

2:发布npm 组件库

切换npm 镜像

在这里插入图片描述

npm get registry 
npm config set registry https://registry.npmjs.org/
npm config set registry https://registry.npm.taobao.org/
  • npm 登录
    在这里插入图片描述
  • npm 发布 npm publish
  • 注意点:就是执行 npm publish之前,需要先 npm run build打包后才可
  • npm publish发布效果
    在这里插入图片描述
  • npm之中 查找 ``xzl-vue-ui 即可
  • 安装以及使用
npm i xzl-vue-ui

main.js 文件之中 使用
import "./assets/main.css";
import TUI from "xzl-vue-ui"
const app = createApp(App);
app.use(TUI);
app.mount("#app");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3.2从0-1封装一个组件库 ( 组件项目的创建 - 发布npm - 使用组件库 ) 的相关文章

  • Jest 中从未调用图像 onLoad 处理程序

    我正在尝试使用 Jest 测试将 dataUrl 加载到图像中 我正在使用 JSDOM 并按照说明添加resources usable 作为一个选项 如果我直接从 Node 运行该代码 则该代码可以工作 但是当我尝试在 Jest 中运行它时
  • 如何使用nodeJS SFTP客户端列出所有子目录?

    有趣的节点 JS ssh2 sftp client 我想列出给定路径中的所有目录及其子目录 let sftp new ssh2SftpClient console log sftp sftp connect host xx xxx xxx
  • 全局 JavaScript 变量作用域:为什么这不起作用?

    所以我在玩 JavaScript 时遇到了我认为奇怪的事情 有谁能解释一下以下内容吗 我已将警报值作为评论包含在内 为什么 foo 中的第一个警报 msg 返回不明确的并不是outside var msg outside function
  • 使用shinyjs通过javascript在闪亮的应用程序中操作现有的Leaflet地图

    我有一个闪亮的应用程序 其中包含现有的传单地图 我希望能够在渲染后使用自定义 javascript 通过shinyjs包裹 一个最小的例子如下 app R packages library dplyr library leaflet lib
  • Vue js按钮冻结dom

    我试图在按下按钮时切换包含加载动画的跨度 直到使用 v if 函数完成 但是当我按下按钮时 DOM 冻结并且 span 元素保持不变 直到函数调用结束 如何让 DOM 不冻结并显示加载图标 非阻塞按钮按下可能是一个解决方案 HTML
  • 将字符串转换为变量名。 (JavaScript)

    我确实查看了前面的问题 但它们是针对整数值的 我需要文本值的答案 我在本周早些时候问了一个与此相关的问题 但现在是这样 如下所示 我使 Make x 等于某个字符串值 Acura Honda Toyota 当我将 Make x 传递到函数
  • 使用 word_number 值对 javascript 数组进行排序

    如何对数组进行排序 var arr new Array word 12 word 59 word 17 这样我得到 word 12 word 17 word 59 Thanks 您需要编写一个排序方法 您可以编写任何您喜欢的方法 该方法在
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • AttachEvent 或 addEventListener - 存储在哪里?

    在 jQuery 中 如果我这样做 a click function Do something 点击事件存储在 a data events 我可以像这样获取它 jQuery each a data events function i eve
  • Vue:单个网站可以使用多个 Vue 应用程序吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个 Hugo 静态网站 我正在使用 Vue 使其动态化 我们正在转型 长期计划尚未确定 但在中期阶段我们正在使用 Vue 我已经在一个页面
  • 通过电子邮件发送在 HTML5 画布上创建的图像

    我有一个画布 用户可以通过交互来更改设计 现在 用户完成更改后 可以提交他的设计及其电子邮件 ID 但为了提交设计 我使用以下方法将画布转换为图像http www nihilogic dk labs canvas2image http ww
  • 函数声明或函数表达式

    我刚刚在块作用域中定义函数时遇到了问题 考虑以下程序 try greet function greet alert Merry Christmas catch error alert error 我希望这个程序能够发出警报Merry Chr
  • 从 UnityWebGL jslib 返回字符串

    我想使用 jslib 来获取网址参数 像这样的代码 jslib GetUrl function var s var strUrl window location search var getSearch strUrl split var g
  • 检测 JavaScript 中的焦点丢失

    我希望能够检测 JavaScript 中任意元素何时失去焦点 因此我可以构建一个类似于 jEdit 的内联编辑工具 我不能依赖 jQuery 来实现这个库 所以我需要一个本机方法来完成它 我查看了 onblur 这似乎是正确的事情 但 MD
  • jQuery live() 和ready() 之间的区别?

    两者之间的确切区别是什么live and ready 编辑 发现die http docs jquery com Events die是相反的live ready http docs jquery com Events ready让你注册一
  • Javascript/DOM:如何删除 DOM 对象的所有事件侦听器?

    只是问题 有没有办法完全删除对象的所有事件 例如一个div 编辑 我添加每div addEventListener click eventReturner false 一个事件 function eventReturner return f
  • router.navigate 使用查询参数 Angular 5

    我在使用查询参数路由到路由时遇到问题我有一个像这样的函数 goToLink link this router navigate link split 0 queryParams this sortParams link 和这个功能 sort
  • jVectorMap - 向下钻取地图 - 自定义背景

    我正在使用 jVectorMap 中的向下钻取地图 并且尝试将自定义背景颜色设置为地图的第二层 为了自定义主级别 我使用 main 参数 但我不知道如何将其扩展到地图的较低级别 提前致谢 马切伊 None
  • 为什么对于整数键,“Map”操作比 JavaScript (v8) 中的“Object”慢得多?

    我很高兴使用Map对于在我的 JavaScript 代码库中随处访问的索引 但我刚刚偶然发现了这个基准 https stackoverflow com a 54385459 365104 https stackoverflow com a
  • 谷歌地图绘制两点之间的路线

    我编写了这段无辜的 JavaScript 代码 它允许用户创建两个标记并绘制它们之间的路线 它不起作用 相反 它给出了一个奇怪的错误 Uncaught TypeError Cannot read property ya of undefin

随机推荐

  • 一.使用qt creator 设计显示GUI

    一 安装qt creator 二 创建项目 文件 新建项目 三 使用设计 可以直接使用鼠标拖拽 四 转换为py文件 from123 py 为导出 py文件的文件名 form ui 为 qt creator创造的 ui 文件 pyuic5 o
  • 传统加密技术总结

    密码编码学与网络安全讨论两大领域 密码算法和协议 又可以分为4个主要的领域 对称加密 Symmetric encryption 用于加密任意大小的数据块或数据流的内容 消息 文件 加密密钥和口令 非对称加密 Asymmetric encry
  • Integration【2019牛客暑期多校训练营(第一场)B】【待定系数法】

    链接 https ac nowcoder com acm contest 881 B 来源 牛客网 题目描述 Bobo knows that 011 x2 dx 2 0 11 x2 dx 2 Given n distinct positiv
  • STM32关于Undefined symbol xxx (referred from xxx.o)问题解决

    这个问题主要是程序没有找到XXX函数的定义 1 没有将包含该函数的头文件包含进来 2 没有头文件里面声明该函数 3 没有将该函数的 C文件加入工程里面
  • CocosCreator之KUOKUO带你入门3D小游戏-躲避方块

    本次引擎2 1 0 编辑工具VSCode 目标 3D小游戏躲避方块 2 1 0版本已经出来好几天了 虽然有些地方还不够完善 但是毕竟是能写3D游戏了 简单的来写一个 嘻嘻 console log 滑稽 准备好了吗 GO 新建个工程 然后把画
  • requsts.sesstion格式化各种cookie

    格式化scrapy用 index text self sess get url index url headers self headers text print index text if 公司 not in index text pri
  • 联想机架服务器怎么装系统,联想机架服务器系统结构特性(二)

    联想服务器硬盘的拆装 在进行操作之前 确保您对本节的 拆装前的注意事项 中的内容完全理解 并已阅读 开机必读 中的安全警告及注意事项 联想万全服务器软驱模组及硬盘模组的拆装 1 参照步骤二 完成机箱盖的拆卸 2 拔掉电源及数据线 3 拧松固
  • MATLAB 检验数据正态分布及代码实现

    上篇简要介绍了正态分布检测的必要性和主要分析方法 此篇主要介绍如何通过MATLAB判断分析数据正态特性 1 主要方法 MATLAB检测数据正态特性主要通过数值测定和图形分析 其中数值测定指通过JB等假设检验方法进行测定分析数据 图形分析方法
  • 如何根据数组创建二叉树和打印二叉树?

    By Long Luo 之前的 如何根据数组或者字符串创建链表 http www longluo me blog 2020 12 10 Construct A LinkedList From An Array Or String 详述了 L
  • JS_一维数组转对象

    如果您想将一个一维数组转换为一个对象 可以使用 JavaScript 中的 Object fromEntries 方法 该方法接收一个键值对数组作为参数 并返回一个对象 其中每个键值对对应一个对象属性 const arr name John
  • 超详细手把手教你部署全分布模式Hadoop集群

    1 Hadoop 集群部署规划 全分布模式下部署 Hadoop 集群时 最低需要两台机器 一个主节点和一个从节点 本书拟将 Hadoop 集群运行在 Linux 上 将使用三台安装有 Linux 操作系统的机器 主机名分别为 hadoop
  • The JAVA_HOME environment variable is not defined correctly This environment variable is needed to r

    win10配置MAVEN HOME报错 cmd 中输入mvn v 会报错 The JAVA HOME environment variable is not defined correctly This environment variab
  • CGAL 使用PCA计算点云法向量

    目录 一 算法原理 1 主要函数 二 代码实现 一 算法原理 见 PCL 计算点云法向量并显示 1 主要函数 头文件 include
  • 在CentOS7上面搭建GitLab服务器

    首先要在CentOS系统上面安装所需的依赖 ssh 防火墙 postfix 用于邮件通知 wegt 以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问 1 安装SSH协议 安装命令 sudo yum install y curl p
  • Git 通过change push代码时,失败 提示没有找到change-id

    提示错误如下 没有找到change id 导致不能push成功 那么如何解决该问题呢 解决方案如下 首先通过git reset mixed 71d4 版本号 回退commit 操作 问题来了 版本号如何获取呢 如下操作 在idea 上的gi
  • ubantu22安装配置VS Code(图文教程)

    平台 uabntu22 文件版本 code 1 74 2 1671533413 amd64 deb VSCode下载链接 Download Visual Studio Code Mac Linux Windowshttps code vis
  • android项目开发难点_APP应用开发中的三大难点

    虽然许多开发人员将移动应用程序作为业余爱好 但企业将移动应用程序视为其品牌战略的绝对重要方面 谁可以责怪公司利用移动性和营销趋势 但是 这给移动应用程序开发人员和测试人员带来了很大的压力 问题是移动应用程序开发并不容易 它需要相同的时间 精
  • MFC 播放视频 FFMPEG SDL

    使用MFC播放RTSP视频流 采用vlc的sdk有延时 使用FFMPEG SDL机制会好很多 本文总结了网络上的 只需四行代码即可简单实现SDL嵌入MFC播放视频和图片 和 100行代码实现最简单的基于FFMPEG SDL的视频播放器 先向
  • STM32 工作流程

    工作流程 上电后 芯片复位启动 MCU通过指令 数据总线从FLASH中读取指令或数据 配合解析执行 然后再通过RAM和通用寄存器 R0 R12的内部寄存器 处理可变数据 根据执行的指令 配置和操作外设的寄存器 从而驱动对应的外设实现具体的功
  • vue3.2从0-1封装一个组件库 ( 组件项目的创建 - 发布npm - 使用组件库 )

    目录 vue3 2从0 1封装一个组件库 1 组件的项目初建 1 1创建项目 1 2 packages button index js 1 3 packages button index vue 1 4 packages index js