位置: IT常识 - 正文

Vue3折叠面板(Collapse)(vue叠化在哪里)

编辑:rootadmin
Vue3折叠面板(Collapse)

推荐整理分享Vue3折叠面板(Collapse)(vue叠化在哪里),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue侧边栏展开和折叠原理,vue侧边栏展开和折叠原理,vue 折叠面板,vue折叠动画效果,elementui折叠面板,vue 折叠面板,vue3折叠面板,vue折叠动画效果,内容如对您有帮助,希望把文章链接给更多的朋友!

可自定义设置以下属性:

折叠面板数据,可使用 slot 替换对应索引的 header 和 text(collapseData),必传,类型:Array<{key?: string, header?: string | slot, text?: string | slot}>,默认 []

当前激活 tab 面板的 key(activeKey),类型:number[] | number | string[] | string | null,默认 null

是否可复制面板内容(copyable),类型:number,默认 false

面板右上角固定内容,例如标识language(lang),类型:string | slot,默认 ''

面板标题和内容,字体大小(fontSize),类型:number,单位px,默认 0

Vue3折叠面板(Collapse)(vue叠化在哪里)

面板标题字体大小,优先级高于fontSize(headerFontSize),类型:number,单位px,默认 14

面板内容字体大小,优先级高于fontSize(textFontSize),类型:number,单位px,默认 14

是否展示面板上的箭头(showArrow),类型:boolean,默认 true

效果如下图:

 注:组件引用方法 import { rafTimeout } from '../index' 请参考以下博客:

使用requestAnimationFrame模拟实现setTimeout和setInterval_theMuseCatcher的博客-CSDN博客使用requestAnimationFrame模拟实现setTimeout和setInterval!https://blog.csdn.net/Dandrose/article/details/130167061

①创建折叠面板组件Collapse.vue: 

<script setup lang="ts">import { ref, watchEffect } from 'vue'// 使用 requestAnimationFrame 实现的等效 setTimeoutimport { rafTimeout } from '../index'interface Collapse { key?: string|number // 对应activeKey,如果没有传入key属性,则默认使用数据索引(0,1,2...)绑定 header?: string // 面板标题 string | slot text?: string // 面板内容 string | slot}interface Props { collapseData: Collapse[] // 折叠面板数据,可使用 slot 替换对应索引的 header 和 text activeKey?: number[] | number | string[] | string | null // 当前激活 tab 面板的 key copyable?: boolean // 是否可复制面板内容 lang?: string // 面板右上角固定内容,例如标识language string | slot fontSize?: number // 面板标题和内容,字体大小 headerFontSize?: number // 面板标题字体大小,优先级高于fontSize textFontSize?: number // 面板内容字体大小,优先级高于fontSize showArrow?: boolean // 是否展示面板上的箭头}const props = withDefaults(defineProps<Props>(), { collapseData: () => [], activeKey: null, copyable: false, lang: '', fontSize: 0, headerFontSize: 14, textFontSize: 14, showArrow: true})watchEffect(() => { const len = props.collapseData.length if (len) { getCollapseHeight(len) // 获取各个面板内容高度 }}, { flush: 'post' })const text = ref()const collapseHeight = ref<any[]>([])function getCollapseHeight (len: number) { for (let n = 0; n < len; n++) { collapseHeight.value.push(text.value[n].offsetHeight) }}const emits = defineEmits(['update:activeKey', 'change'])function dealEmit (value: any) { emits('update:activeKey', value) emits('change', value)}function onClick (key: number|string) { if (activeJudge(key)) { if (Array.isArray(props.activeKey)) { const res = (props.activeKey as any[]).filter(actKey => actKey!== key) dealEmit(res) } else { dealEmit(null) } } else { if (Array.isArray(props.activeKey)) { dealEmit([...props.activeKey, key]) } else { dealEmit(key) } }}function activeJudge (key: number|string): boolean { if (Array.isArray(props.activeKey)) { return (props.activeKey as any[]).includes(key) } else { return props.activeKey === key }}const copyTxt = ref('Copy')function onCopy (index: number) { navigator.clipboard.writeText(text.value[index].innerText || '').then(() => { /* clipboard successfully set */ copyTxt.value = 'Copied' rafTimeout(() => { copyTxt.value = 'Copy' }, 3000) }, (err) => { /* clipboard write failed */ copyTxt.value = err })}</script><template> <div class="m-collapse"> <div class="m-collapse-item" :class="{'u-collapse-item-active': activeJudge(data.key || index)}" v-for="(data, index) in collapseData" :key="index"> <div class="u-collapse-header" @click="onClick(data.key || index)"> <svg focusable="false" v-if="showArrow" class="u-arrow" data-icon="right" aria-hidden="true" viewBox="64 64 896 896"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"></path></svg> <div class="u-header" :class="{ml24: showArrow}" :style="`font-size: ${fontSize || headerFontSize}px;`"> <slot name="header" :header="data.header" :index="index">{{ data.header || '--' }}</slot> </div> </div> <div class="u-collapse-content" :class="{'u-collapse-copyable': copyable}" :style="`height: ${activeJudge(data.key || index) ? collapseHeight[index]:0}px;`"> <div class="u-lang"> <slot name="lang" :lang="lang" :key="data.key || index">{{ lang }}</slot> </div> <Button size="small" class="u-copy" type="primary" @click="onCopy(index)">{{ copyTxt }}</Button> <div ref="text" class="u-text" :style="`font-size: ${fontSize || textFontSize}px;`"> <slot name="text" :text="data.text" :key="data.key || index">{{ data.text }}</slot> </div> </div> </div> </div></template><style lang="less" scoped>* { box-sizing: border-box; margin: 0; padding: 0;}.m-collapse { background-color: rgba(0, 0, 0, 0.02); border: 1px solid #d9d9d9; border-bottom: 0; border-radius: 8px; .m-collapse-item { border-bottom: 1px solid #d9d9d9; &:last-child { border-radius: 0 0 8px 8px; .u-collapse-content { border-radius: 0 0 8px 8px; } } .u-collapse-header { position: relative; padding: 12px 16px; cursor: pointer; transition: all 0.3s; .u-arrow { position: absolute; width: 12px; height: 12px; top: 0; bottom: 0; margin: auto 0; fill: rgba(0,0,0,.88); transition: transform 0.3s; } .u-header { display: inline-block; color: rgba(0, 0, 0, 0.88); line-height: 1.5714285714285714; } .ml24 { margin-left: 24px; } } .u-collapse-content { position: relative; height: 0; overflow: hidden; background-color: #fff; transition: height .3s; .u-lang { position: absolute; right: 10px; top: 6px; font-size: 14px; color: rgba(0, 0, 0, .38); opacity: 1; transition: opacity .3s; } .u-copy { position: absolute; right: 8px; top: 8px; opacity: 0; pointer-events: none; transition: opacity .3s; } .u-text { padding: 16px; color: rgba(0, 0, 0, 0.88); white-space: pre-wrap; } } .u-collapse-copyable { &:hover { .u-lang { opacity: 0; pointer-events: none; } .u-copy { opacity: 1; pointer-events: auto; } } } } .u-collapse-item-active { .u-arrow { transform: rotate(90deg); } .u-collapse-content { border-top: 1px solid #d9d9d9; } }}</style>

②在要使用的页面引入:

<script setup lang="ts">import { Collapse } from './Collapse.vue'import { ref, watchEffect } from 'vue'const collapseData = ref([ { key: '1', header: 'This is panel header 1', text: 'A dog is a type of domesticated animal.Known for its loyalty and faithfulness,it can be found as a welcome guest in many households across the world.' }, { key: '2', header: 'This is panel header 2', text: ` A dog is a type of domesticated animal.Known for its loyalty and faithfulness,it can be found as a welcome guest in many households across the world. A dog is a type of domesticated animal.Known for its loyalty and faithfulness,it can be found as a welcome guest in many households across the world.` }, { key: '3', header: 'This is panel header 3', text: 'A dog is a type of domesticated animal.Known for its loyalty and faithfulness,it can be found as a welcome guest in many households across the world.' }])const activeKey = ref(['1'])watchEffect(() => { console.log('activeKey:', activeKey.value)})const key = ref('1')watchEffect(() => { console.log('key:', key.value)})function onChange (key: any) { console.log('change:', key)}</script><template> <div> <h2 class="mb10">Collapse 折叠面板基本使用 (activeKey 传入 number[] | string[],所有面板可同时展开)</h2> <Collapse :collapseData="collapseData" v-model:activeKey="activeKey" @change="onChange" /> <h2 class="mt30 mb10">'手风琴' (只允许单个内容区域展开,只需 activeKey 传入 number | string 即可)</h2> <Collapse :collapseData="collapseData" v-model:activeKey="key" @change="onChange" /> <h2 class="mt30 mb10">可复制面板内容 (copyable)</h2> <Collapse lang="template" copyable :collapseData="collapseData" v-model:activeKey="activeKey" @change="onChange" /> <h2 class="mt30 mb10">使用插槽 slot 自定义 header、lang、text 内容</h2> <Collapse copyable :collapseData="collapseData" v-model:activeKey="activeKey" @change="onChange"> <template #header="{ header, key }"> <span v-if="key==='1'" style="color: burlywood;">burlywood color {{ header }} (key = {{ key }})</span> </template> <template #lang>typescript</template> <template #text="{ text, key }"> <span v-if="key==='1'" style="color: burlywood;">burlywood color {{ text }} (key = {{ key }})</span> </template> </Collapse> <h2 class="mt30 mb10">折叠面板,隐藏箭头图标 (showArrow: false)</h2> <Collapse :show-arrow="false" :collapseData="collapseData" v-model:activeKey="activeKey" @change="onChange"/> </div></template><style lang="less" scoped></style>
本文链接地址:https://www.jiuchutong.com/zhishi/295167.html 转载请保留说明!

上一篇:基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)(基于骨骼关键点的动作识别)

下一篇:布罗兹湿地国家公园,英国诺福克郡 (© Steven Docwra/Getty Images)(布兹洛夫)

  • 钉钉办公软件怎么安装(钉钉办公软件怎么申请)

    钉钉办公软件怎么安装(钉钉办公软件怎么申请)

  • 红米手环有几种颜色呢(红米手环功能最全介绍)

    红米手环有几种颜色呢(红米手环功能最全介绍)

  • 拼多多微信支付无法跳转(拼多多微信支付扣款顺序)

    拼多多微信支付无法跳转(拼多多微信支付扣款顺序)

  • 买抖音号需要注意什么(买抖音号需要注册吗)

    买抖音号需要注意什么(买抖音号需要注册吗)

  • i79700k怎么开睿频(i7 9700k睿频怎么设置)

    i79700k怎么开睿频(i7 9700k睿频怎么设置)

  • 淘宝评分4.6严重吗(淘宝评分4.0)

    淘宝评分4.6严重吗(淘宝评分4.0)

  • 快手订单退款多久到账(快手退款得多久)

    快手订单退款多久到账(快手退款得多久)

  • 表格中打字怎么换到下一行(表格中打字怎么变成两行)

    表格中打字怎么换到下一行(表格中打字怎么变成两行)

  • 荣耀30多少hz(荣耀30多少hz刷新)

    荣耀30多少hz(荣耀30多少hz刷新)

  • 重置电脑有什么用(重置电脑有什么好处和危害)

    重置电脑有什么用(重置电脑有什么好处和危害)

  • 腾讯网盘叫什么(腾讯云盘 百度网盘)

    腾讯网盘叫什么(腾讯云盘 百度网盘)

  •  视频存在风险无法下载怎么解除(视频存在风险怎么解决)

    视频存在风险无法下载怎么解除(视频存在风险怎么解决)

  • 腾讯视频qq登录已下线为什么(怎么取消腾讯视频qq登录)

    腾讯视频qq登录已下线为什么(怎么取消腾讯视频qq登录)

  • iphonex左边扬声器不响(iphonex左边扬声器)

    iphonex左边扬声器不响(iphonex左边扬声器)

  • vivox27黑屏也重启不了(vivox27手机突然黑屏但是是开机状态)

    vivox27黑屏也重启不了(vivox27手机突然黑屏但是是开机状态)

  • 苹果7换了电池后home键按不了怎么回事(苹果7换了电池触控id无法用)

    苹果7换了电池后home键按不了怎么回事(苹果7换了电池触控id无法用)

  • qq下载的文件在qqfile看不见(QQ下载的文件在QQ浏览器找不到)

    qq下载的文件在qqfile看不见(QQ下载的文件在QQ浏览器找不到)

  • ipad5处理器是多少(ipad5 2017处理器)

    ipad5处理器是多少(ipad5 2017处理器)

  • ipadmini2内屏怎么换(ipad mini内屏)

    ipadmini2内屏怎么换(ipad mini内屏)

  • vivox20多大运存(vivox20运行内存是4g还是6g)

    vivox20多大运存(vivox20运行内存是4g还是6g)

  • 磁盘清理程序的功能是(磁盘清理程序的快捷键)

    磁盘清理程序的功能是(磁盘清理程序的快捷键)

  • realmex2pro支持多少瓦快充(realmex2pro支持5g吗)

    realmex2pro支持多少瓦快充(realmex2pro支持5g吗)

  • oppo手机怎么重新录入面部(oppo手机怎么重设账号密码)

    oppo手机怎么重新录入面部(oppo手机怎么重设账号密码)

  • 计算机类型大致分为哪三类(计算机 类型)

    计算机类型大致分为哪三类(计算机 类型)

  • cad2020怎么设置经典模式(cad2020怎么设置二维模式)

    cad2020怎么设置经典模式(cad2020怎么设置二维模式)

  • 手机微博怎么搜索用户(手机微博怎么搜索用户昵称)

    手机微博怎么搜索用户(手机微博怎么搜索用户昵称)

  • ps书皮封面设计怎么做(ps书皮封面设计图怎么做)

    ps书皮封面设计怎么做(ps书皮封面设计图怎么做)

  • 谷歌浏览器怎么设置双击关闭网页(谷歌浏览器怎么用加速器加速)

    谷歌浏览器怎么设置双击关闭网页(谷歌浏览器怎么用加速器加速)

  • mq是什么(mq是什么公式)

    mq是什么(mq是什么公式)

  • 韦尼格罗德的圣诞市场,德国萨克森-安哈尔特州 (© Krzysztof Baranowski/Moment/Getty Images)(韦罗尼卡)

    韦尼格罗德的圣诞市场,德国萨克森-安哈尔特州 (© Krzysztof Baranowski/Moment/Getty Images)(韦罗尼卡)

  • Vue中的数据操作(vue数据表)

    Vue中的数据操作(vue数据表)

  • 什么是免税合并
  • 个人所得税纳税义务人
  • 处置公司车辆账务处理
  • 新办企业发票核定及申领,选否行吗
  • 申报工资总额填错了
  • 卫生清理费计入什么科目
  • 非独生子女赡养父母扣税
  • 加油卡充值发票怎么入账
  • 一般纳税人印花税税率是多少
  • 原材料预付款如何做账
  • 过渡期损益会计分录
  • 有哪些发票可以开成餐饮服务
  • 多付的货款怎么追回
  • 补入库存商品的会计分录
  • 经济纠纷的解决途径包括哪些
  • 小规模纳税人如何纳税
  • 单位经济合同由谁来签
  • 增值税专用发票验票
  • 实收资本未注明投资款
  • 工业企业该怎样建账?
  • 质保金怎么挂账
  • 个体工商户怎么交社保
  • dir852迅雷路由器
  • 外购的礼品送客户怎么做分录小规模
  • 递延收益的会计科目
  • u启动u盘怎么装系统
  • php生成二维码
  • PHP:diskfreespace()的用法_Filesystem函数
  • 产生转让损失
  • 售后租回交易的实质是什么
  • php返回对象
  • 原材料按实际成本核算需设置的科目包括
  • 增值税检查的内容
  • 未确认融资费用报表填在哪个科目
  • php递归实现1到100的和
  • thinkphp d
  • yolov5添加注意力机制真的有用吗?
  • it云化
  • zend框架教程
  • dede转zblog
  • phpcms栏目分类
  • phpcms使用教程
  • wordpress jquery
  • 存货跌价准备科目余额在哪方
  • 织梦怎么样
  • 官方的问答
  • 怎么编制资金平衡表格
  • 财务预算资产负债表如何编制
  • 一般纳税人作废小规模时开的发票怎么报税
  • 卸车费属于什么费用
  • mysql命令列界面
  • 同时运行多个MySQL服务器的方法
  • sql server 创建数据表状态1第三行语法错误怎么回事
  • Windows Server 2003下修改MySQL 5.5数据库data目录
  • 劳务费怎么做账务处理
  • 餐饮税务每个月多少钱
  • 附加税怎么算出来的
  • 应付职工薪酬中社保费怎么记账
  • 房地产企业简易计税和一般计税的区别
  • 以现金形式发工资的公司
  • 待抵扣进项税额
  • mysql5.7最新版
  • windows 开始
  • Win10预览版拆弹
  • centos7文件路径
  • 移动宽带解绑怎么办理
  • opengl颜色代码表
  • nodejs异步编程及原理
  • python伪装请求头
  • vue+vue-validator 表单验证功能的实现代码
  • 深入理解计算机系统
  • jquery双击
  • shell脚本自动化
  • document.getElementById().src
  • unity3d打包成apk
  • javascript 类
  • python的入门教程
  • 南京市国家税务局官网
  • 苏州税务局下班时间
  • 非税控发票是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设