基于Vant组件库二次封装组件(TS+Vue3.x环境)

这篇具有很好参考价值的文章主要介绍了基于Vant组件库二次封装组件(TS+Vue3.x环境)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 今天的需求是封装一个 Navigation Bar 导航栏组件,目的是给到App几乎所有的页面复用:

基于Vant组件库二次封装组件(TS+Vue3.x环境)

  基于Vant组件库二次封装组件(TS+Vue3.x环境)

 基于Vant组件库二次封装组件(TS+Vue3.x环境)


2. 因为之前的项目里使用过Vant组件库,笔者第一时间想到了Vant组件库中的 NavBar 组件,和当前App的需求匹配度很高。Vant组件库的 NavBar 组件:

基于Vant组件库二次封装组件(TS+Vue3.x环境)


3. 相信你也发现了,Vant组件库默认主题色是蓝色,而当前App的主题色是绿色,翻看了下Vant组件库的API文档,存在 ConfigProvider 全局配置,简单修改下样式即可:

:root {
  # 自定义主题色变量
  --cp-primary: #16C2A3;
  # 覆盖Vant主题色
  --van-primary-color: var(--cp-primary);
}

笔者在 http://t.csdn.cn/cCGFP 文章中介绍过全局引入Vant样式,这里我把需要修改主题色的代码放在了项目 src/styles/main.scss 里,不明白的小伙伴可以翻看前文!


4. 准备工作完成后正式开干,项目 src/components 文件夹下新建 cp-nav-bar.vue 组件,因为前文配置过按需引入,这里直接使用 <van-nav-bar /> 

<template>
  <div>
    <van-nav-bar
      :title="..."
      :right-text="..."
      left-arrow
      fixed
      @click-left="..."
      @click-right="..."
    />
  </div>
</template>
title                标题
right-text           右侧文案
left-arrow           是否显示左侧箭头
fixed                是否固定在顶部
click-left           点击左侧按钮时触发的事件
click-right          点击右侧按钮时触发的事件

跑起来观察后发现,van-nav-bar组件的字号和当前App有些差距,这里使用深度选择器修改下

<style scoped lang="scss">
:deep() {
  .van-nav-bar {
    &__arrow {
      font-size: 18px;
    }
    &__text {
      font-size: 15px;
    }
  }
}
</style>

vue3深度选择器不熟悉的同学,可以查看笔者的另一篇软文 http://t.csdn.cn/NkDbl


5. cp-nav-bar组件需要支持的功能:

① 支持  title  rightText  属性,父传子实现 (标题和右侧文字的自定义)

② 支持 click-right 事件,子传父实现 (右侧点击事件的抛出)

        注:右侧按钮对应要做的事情,应该是自己定义的,所以我们要支持事件,让他有自己的实现逻辑

③ 支持返回上一页功能        

        注: vue2和vue3获取路由方式有区别

                this.$router => useRouter()

                 this.$route => useRoute()


6. 标题和右侧文字的自定义

# 当前组件里
<script lang="ts" setup>
withDefaults(
  defineProps<{
    title?: string
    rightText?: string
  }>(),
  {
    title: '标题',
    rightText: '按钮'
  }
)
</script>
# 使用组件时
<cp-nav-bar title="凡大来了" right-text="他真的来了" />

7. 右侧点击事件的抛出

# 当前组件里
<script lang="ts" setup>
const emits = defineEmits<{
  (e: 'click-right'): void
}>()
const onClickRight = () => {
  emits('click-right')
}
</script>

<template>
  <div>
    <van-nav-bar
      :title="title"
      :right-text="rightText"
      left-arrow
      fixed
      @click-right="onClickRight"
    />
  </div>
</template>
# 使用组件时
<template>
  <div>
    <cp-nav-bar
      title="凡大来了"
      right-text="他真的来了"
      @click-right="handleClickRight"
    />
  </div>
</template>

<script lang="ts" setup>
const handleClickRight = () => {
  console.log('儿子的右侧按钮被点击了,父亲你要做点什么吗?')
}
</script>

8. 返回上一页功能

# 当前组件里
<script lang="ts" setup>
import { useRouter } from 'vue-router'

const router = useRouter()
const onClickLeft = () => {
  # 无脑回退是不严谨的
  # 如果back字段是个null,强制拉回我们项目的首页,反之回退
  # history不熟悉的,看下这里 https://developer.mozilla.org/zh-CN/docs/Web/API/History
  if (history.state.back) {
    router.back()
  } else {
    router.push('/')
  }
}
</script>

<template>
  <div>
    <van-nav-bar
      :title="title"
      :right-text="rightText"
      left-arrow
      fixed
      @click-left="onClickLeft"
      @click-right="onClickRight"
    />
  </div>
</template>
# 使用组件时
<cp-nav-bar />标签不需要任何操作,@click-left并没有抛出,只要引用了组件,都具有back功能

9. 有同学可能会有疑问:为什么可以直接使用组件,不导入不注册?

因为笔者在前文中 配置了 unplugin-vue-components 插件,该插 默认会把项目 src/compoenents 目录下的组件自动导入注册,是不是爽歪歪!!!

再次附上前文地址 http://t.csdn.cn/cCGFP


10. cp-nav-bar 组件类型配置

写到这里咱们的 cp-nav-bar 组件基本完成,还剩下最后一个痛点是缺失属性提示、事件提示、鼠标放上去也没有类型提示,这该怎么解决呢?

前文里我在 vite.config.js 文件中做了如下配置:

...
 
export default {
  plugins: [
    vue(),
    Components({
      # 不生成类型声明文件自己写
      dts: false
      ...   
    })
  ]
}

对!没错!我取消了自动生成类型声明文件,实际上你配置了也没卵用!为了解决缺失提示的痛点,笔者在 src目录下 \ types目录下 \ 新建 components.d.ts

# 怎么给全局的组件提供类型?
# 写一个类型声明文件,declare module 'vue' 声明一个 vue 类型模块
# 然后 interface GlobalComponents 书写全局组件的类型
# key组件名称支持大驼峰, value是组件类型, 通过 typeof 组件实例得到

import CpNavBar from '@/components/cp-nav-bar.vue'

declare module 'vue' {
  interface GlobalComponents {
    CpNavBar: typeof CpNavBar
  }
}

End-------------------文章来源地址https://www.toymoban.com/news/detail-417467.html

到了这里,关于基于Vant组件库二次封装组件(TS+Vue3.x环境)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mpVue 微信小程序基于vant-weapp 组件的二次封装TForm 表单组件(修改源码插槽使用)

    1、mpVue微信小程序不支持动态组件(component ) 2、mpVue微信小程序不支持动态属性及事件穿透( $attrs 和 $listeners ) 3、mpVue微信小程序不支持 render 函数 TForm 表单组件 代码示例: 参数 说明 类型 默认值 className 自定义类名 String - listTypeInfo 下拉选择数据源(type:\\\'date/datetime/ra

    2024年02月16日
    浏览(71)
  • vue3组件二次封装Ui处理

    在Vue开发中,我们常常需要使用UI框架提供的组件。但是UI框架的组件可能并不符合我们的需求,这时候就需要进行二次封装。下面是一些关于Vue组件二次封装Ui处理的技巧: 子组件代码: 父组件使用: 如果使用props接收弊端: 基本上组件不会只有一两个属性,属性多的话接

    2023年04月14日
    浏览(82)
  • vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

    一、TableTreeLevel组件 

    2024年02月15日
    浏览(58)
  • # vue3 vant4 Tabbar 标签栏组件的封装 和Popup弹出层的封装

    需求如上,标签栏里第三个是图片,整个项目有两种场景, 标签栏正常跳转页面, 标签拦渲染别的图片时候,点击就是打开弹出层, 封装了标签栏,弹出层两部分,作为公共组件 标签栏的封装 徽标样式需要调整,list现在是自己暂时再state里写的假数据 下面是再使用标签组

    2024年01月20日
    浏览(66)
  • vue3+ts+vite项目引入echarts,vue3项目echarts组件封装

    技术栈 :Vue3 + Ts + Vite + Echarts 简介 : 图文详解,教你如何在 Vue3 项目中 引入Echarts , 封装Echarts组件 ,并实现常用Echarts图例 1.1 静态效果 1.2 动态效果 2.1 安装 Echarts npm: pnpm: 2.2 main.ts 中引入 2.3 Echarts 组件封装 /src/components/ReEcharts/index.vue 文件中写入如下代码 3.1 柱状图 实现

    2024年02月09日
    浏览(63)
  • 分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊

    2022年11月23日首发于掘金,现在同步到公众号。 11. 前言 大家好,我是若川。推荐点右上方蓝字若川视野把我的公众号 设为星标 。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推荐关注我写的专栏《学习源码整体架构系列》

    2024年02月05日
    浏览(101)
  • vue3 ts element plus form表单二次封装详细步骤 (附参数、类型详细介绍及简单使用示例)

    上篇table 表格封装 讲到项目中经常会用到 table 表格,所以做了封装。当然,form 表单使用的频率依然很高,所以和封装 table 表格的思路相似,对 form 表单也做了一个二次封装的组件。 查看国内预览站 查看国外预览站 1. EasyForm 表单组件封装 src/components/EasyForm/index.vue Form 表单

    2024年02月07日
    浏览(61)
  • vue3+ts - element-plus封装上传文件图片组件

      近期做到的项目中有涉及到上传图片上传文件的需求,因为是pc管理后台,用到了element-plus框架,所以我也一起使用element-plus中的上传图片上传图片功能,并对它进行封装成一个组件,方便在多个地方使用。 1、上传文件、视频 2、上传图片   在这里上传图片和文件是分

    2024年02月12日
    浏览(54)
  • Vue3+element-ui + TS封装全局分页组件

    本文介绍了如何使用Vue3、element-ui和TypeScript封装一个全局分页组件。 在开始之前,你需要安装以下环境: Vue3 element-ui TypeScript 这个分页组件提供以下功能: 支持自定义每页显示条数 支持自定义跳转到指定页码 支持显示总页数和总条数 支持自定义样式 分页组件结构 分页组

    2024年02月12日
    浏览(61)
  • Vue3和TypeScript下基于Axios的二次封装教程

    学习如何在Vue3项目中使用TypeScript和Axios进行二次封装,实现更灵活的网络请求处理。详细教程包括拦截器设置和类型扩展。

    2024年02月05日
    浏览(136)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包