vue3+tsx封装组件

子组件(selectTab.tsx)

import { defineComponent } from 'vue'
import { tabsProps, Tab } from './selectTabType'
import './selectTab.scss'
export default defineComponent({name: 'selectTab',props: tabsProps,emits: ['update:modelValue', 'tab-click'],setup(props, { emit, slots }) {const tabClick = (item: Tab) => {if (props.modelValue === item.name) returnemit('update:modelValue', item.name)emit('tab-click', item)}return () => (<div class="select_tab"><div class="tab_con_l"></div><div class="tab_con">{props.tabList.map((item: Tab) => {return (<divclass={[props.modelValue === item.name ? 'tab_active' : '', 'tab_con_item']}key={item.name}onClick={() => tabClick(item)}>{item.label}</div>)})}</div>{slots['right'] ? (<div class="tab_right">{/* <slot name="right"></slot> */}{slots['right']?.()}</div>) : null}</div>)},
})

类型定义(selectTabType)

import { PropType } from 'vue'export interface Tab {label: string | numbername: string | number
}export const tabsProps = {modelValue: {type: [String, Number] as PropType<string | number>,default: null,},tabList: {type: Array as PropType<Array<Tab>>,default: function() {return []},},
}

样式文件(selectTab.scss)

.select_tab {display: flex;margin-bottom: 10px;height: 36px;border-bottom: 1px solid #e4e7ed;.tab_con {display: flex;}.tab_con_l {width: 20px;}.tab_con_item {cursor: pointer;padding: 0 20px;height: 36px;box-sizing: border-box;line-height: 36px;list-style: none;font-size: 14px;font-weight: 500;border-bottom: 1px solid #e4e7ed;width: 110px;text-align: center;&:hover {color: #4f6bff;}}.tab_active {color: #4f6bff;background-color: #fff;border: 1px solid #e4e7ed;border-bottom: none;border-radius: 4px 4px 0 0;}.tab_right {height: 36px;line-height: 36px;margin-left: auto;}
}

父组件使用

// template
<selectTab v-model="activeTab" :tabList="tabList"><template #right><div>右侧插槽</div></template>
</selectTab>// data
tabList: [{ label: '整体数据', name: 'all' },{ label: '详细数据', name: 'detail' },
],
activeTab: 'all',

实现效果

子组件另一种写法(render)

import { defineComponent } from 'vue'
import { tabsProps, Tab } from './selectTabType'
import './selectTab.scss'
export default defineComponent({name: 'selectTab',props: tabsProps,emits: ['update:modelValue', 'tab-click'],setup(props, { emit, slots }) {const tabClick = (item: Tab) => {if (props.modelValue === item.name) returnemit('update:modelValue', item.name)emit('tab-click', item)}return { slots, tabClick }},render() {return (<div class="select_tab"><div class="tab_con_l"></div><div class="tab_con">{this.tabList.map((item: Tab) => {return (<divclass={[this.modelValue === item.name ? 'tab_active' : '', 'tab_con_item']}key={item.name}onClick={() => this.tabClick(item)}>{item.label}</div>)})}</div>{this.slots['right'] ? (<div class="tab_right">{/* <slot name="right"></slot> */}{this.slots['right']?.()}</div>) : null}</div>)},
})

vue3+tsx封装组件相关推荐

  1. Vue3VideoPlay+vue3+ts封装一个视频播放组件

    vue3+ts封装一个视频播放组件 基于Vue3VideoPlay 做了常用的配置,复制即用! 官方文档https://codelife.cc/vue3-video-play/ 安装 npm安装: n ...

  2. vue3 + uni-app 封装音乐播放插件

    1.初始化一个音乐实例 let AUDIO = '' export const initAudio = function (url) {AUDIO = uni.createInnerAudioCont ...

  3. vue 封装组件供全局使用_vue 封装组件的基本操作

    /**1.封装组件 局部 封装**/ // 1.创建组件构造器对象 const cpnC = Vue.extend({ template: ` <div> </div>` }) ...

  4. 前端:uniapp封装组件用法笔记

    大家在做前端项目开发的时候,经常会遇到公用的一些页面,比如搜索.列表.商品详情卡片.评论列表等.为了提高开发效率.使代码看起来更加简洁,这个时候封装相应的组件是最好的解决方案.今天小编给大家介绍一下如 ...

  5. jquery数组怎么传给后台_我是如何让公司后台管理系统焕然一新的(下)封装组件...

    作者:yeyan1996 https://juejin.im/post/5c7b4761f265da2db2795036 写在前面 上篇在这里 马上到了金三银四的时间,很多公司开启了今年第一轮招聘的热 ...

  6. vue3 内置组件keep-alive用法的全面介绍

    vue3 内置组件keep-alive用法的全面介绍 基础用法 首先看一个反面例子 const app = Vue.createApp({template: `<button v-for=&qu ...

  7. 补充记录vue3中rrweb-player组件实现网页录屏的一个BUG解决

    项目场景: vue3中rrweb-player组件实现网页录屏功能 问题描述 提示:这里描述项目中遇到的问题: 录制的视频会重复记录录制中这个按钮的状态,每打开一次开始录制视频中就会多一个按钮,bug ...

  8. vue3内置组件(Teleport组件,Fragment组件)-传送组件,减少层级

    一.传送组件(Teleport组件) 可将组件移动到 DOM 中 Vue app 之外的其他位置,主要是为了解决一些特殊场景下模态对话框组件.组件的渲染. 例子:模拟UI框架对话框组件. App.vu ...

  9. Vue3+ Vue-cli (2) 组件篇

    目录 一.全局组件定义和复用性讲解 二.Vue3中的局部组件 三.父子组件的静态和动态传值 四.组件传值时的校验操作 五.组件中重要机制 - 单项数据流 六.Non-props使用技巧 七.组件中通过 ...

  10. Vue3 10多种组件通讯方法

    本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解 Vue 3.2 组件多种通讯方式的基础用法,并且使用了 单文件组件 <script setup> . 众所周知,Vue.js 中一 ...

最新文章

  1. 田志刚:写文章的两个好处
  2. LeetCode Peeking Iterator
  3. 【MySQL】按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
  4. 自然语言处理笔记-哈工大 关毅
  5. ZeroMQ之Publish/Subscribe (Java)
  6. VTK:vtkClipClosedSurface用法实战
  7. SAP UI5 dialog style max-height
  8. 开发composer包
  9. SpringBoot项目利用maven自定义打包结构
  10. Hadoop环境 IDE配置(在eclipse中安装hadoop-eclipse-plugin-2.7.3.jar插件)
  11. 数据库每日一题 2020.04.29
  12. C# Combobox可输入+自动完成
  13. CheckBoxList控件绑定数据和设置选定项
  14. android无法创建AVD了?
  15. kubernetes视频教程笔记 (24)-存储-PV和PVC
  16. vb access mysql数据库教程_vb操作access数据库的方法
  17. Python 实现求矩阵的伴随矩阵
  18. 从零搭建KVM虚拟服务器
  19. 应用程序,软件,小程序,APP的区别?
  20. 电脑登录宽带怎么自动连接服务器地址,宽带自动连接怎么设置

热门文章

  1. 秋风,唱给田野动听的歌
  2. golang--channal与select
  3. 怎么看两张图片的相似度,测试两张照片相似度
  4. Linux gpio 接口
  5. Git _ 报错信息
  6. 程序员快速记忆英文单词的专属诀窍
  7. 《安全评估报告》7条回答范例
  8. iOS GUI 规范
  9. 荒野、车居生活与自由世界——读《车轮上的瓦尔登湖》
  10. Centos6使用阿里云centos-vault的yum源