前端teble分页组件开发(手写组件)

简介: 这段时间,在开发过程中接到一个需求,当时接到这个需求的时候,本来想着是找一找ui组件啥的来,但是后面找了一圈后,没有找到符合的,没办法,只能自己花点时间写一下了

先看下需求,在页面的顶部加入一样table,当我们点击table时底部的页面切换,中间的内容根据切换的tab来切换,tablei里还有小table,当点吉小table时,小table也跟着切换,先来看下实际的结果图


image.png


先说一下我的逻辑吧,我将顶部的table写成一个组件,将父组件渲染table的数据通过props将数据传递过来,在用watch监听props数据,当切换父组件时,顶部table实时更新,代码如下:


image.png


通过将父组件的数据拿到后,在页面上渲染出来,然后写2套css,一套是选中的状态还有一套是没有选中的状态,在html代码里,给class加上三木运算,根据某个参数来觉得当前选中的内容,

image.png



到现在是实现了,当点击父组件的内容是,顶部table实时更新,然后要实现的就是我们点击顶部的table,父组件的内容更新了,这里我们需要做的就是,获取到当前点击的是什么内容,然后通过emit函数,将我们选中的内容传递出去,让父组件根据我们传递的数据实时渲染。大概逻辑就是,我们顶部table里分一级table和二级table,这些都是通过for循环渲染出来的,for循环的key不就是最好的数据吗?代码如下


image.png


然后,因为我们的二级table是写在一级table里的,所以我们在一级table的点击事件里把emit写上,当我们点击一级table时,将当前选中的数据传递出去;


image.png


到这里后,还有一个小bug,就是,比如我们切换第一个table,第一个table的二级table选中了某一项后,然后切换到第二个table时会导致里面的二级table没有重置,因为我选中哪一个table都是通过下标来确定的,下标没有重置就会导致没有数据,比如我第一个table有3个二级table,而第二个table则只有2个,当我们在第一个table时将二级table选中第三个的话,就会导致我们切换到第二个table时第二个table的二级table没有选中数据,因为没有下标是2的数据,这时候我们就要监听一级table的下标,当下标变化时,将二级table的下标重置为0,也就是重新选中第一个table。


image.png


这里解释下,为什么在emit那里要用到settimeout,这是因为,像父组件传值比我们赋值要快,这样就是导致像父组件传的值都是旧值,,简单说,wacth比emit执行的慢,只能让emit等待下了,等watch将数据更新后在提交了。


总代码如下:

<template><divclass="table-container"><tablecellspacing="0"cellpadding="0"><tr><td :class="outerindex == key ? 'box' : 'onbox'"                    :style="key == 0 ? 'border-radius: 4px 0px 0px 4px;' : key == length - 1 ? 'border-radius: 0px 4px 4px 0px;' : ''"v-for="(item, key) in tabledata" :key="key"@click="table(key)"><span>{{ item.name }}</span><div><buttonv-for="(itemb, key) in item.tab" :key="key"                            :class="withinindex == key ? 'button' : 'onbutton'"@click="innertable(key)">{{ itemb.tabName                            }}</button></div></td></tr></table></div></template><scriptlang="ts">import { reactive, ref, watch, onMounted, computed } from"vue"exportdefault ({
name: 'tab',
props: {
tablearr: Object    },
setup(props: any, contest: any) {
// 思考 ref 响应式和 reactive 响应式的区别; 修改对象属性值,是否会刷新数据lettabledata=reactive(props.tablearr)
console.log(props.tablearr, 12)
letouterindex=ref(0)  //外层大table每次默认选择第一个letwithinindex: any=ref(0) //里层小tab每次进入时默认选择第一个constlength=ref(0)
onMounted(() => {
length.value=props.tablearr.length        })
watch(props, () => {  //监听父组件传过来的props数据,当父组件切换小table时,子组件实时更新tabledata=props.tablearr        })
watch(outerindex, () => {  //当切换最外层的的table时,必须将里层的table重置到第一位withinindex.value=0        })
consttable= (key: any) => {  //点击大table对小tab进行切换outerindex.value=keysetTimeout(()=>{contest.emit("item", [outerindex.value, withinindex.value])},50)//当点击table时,将当前选择的是哪个table告诉父组件,暂定格式是 [外层table的下标,里层table的下标]        }
constinnertable= (key: any) => {
withinindex.value=key        }
return {
tabledata,
outerindex,
table,
withinindex,
length,
innertable        }
    }
})
</script><stylelang="stylus"scoped>.table-container{
td{
height:68px;
width:173px;
    }
span{
font-weight: 550;
font-size:16px;
    }
button{
width:45px;
height:30px;
border: none;
margin-left:2px;
    }
/*选中的状态 */    .box{
border: 1pxsolid#26D6B9;background: #F8FFFE;table{
border: 0;
      }
span{
font-family: "思源黑体 Regular";
color: #3E3E3E;        }
        .button,.onbutton{
border-bottom: 2pxsolid#26D6B9;background:rgba(0,0,0,0);
color:#0AC8A9;        }
        .onbutton{
border-bottom: 2pxsolid#E4E7ED;color:#707070;        }
    }
/*未选中的状态 */    .onbox{
border: 1pxsolid#DCDFE5;span{
color: #707070;        }
button{
border-bottom: 2pxsolid#E4E7ED;background:rgba(0,0,0,0);
color:#707070;        }
    }
}
</style>



父组件传递来的数据:

tabs: [{buttonName: '新增排放源',
tab: [
                        { tabName: '材料', name: 1, sendType: 10 },
                        { tabName: '能耗', name: 2, sendType: 11 },},
                    {buttonName: '新增排放源',
tab: [
                        { tabName: '材料', name: 1, sendType: 10 },
                        { tabName: '能耗', name: 2, sendType: 11 },}]

     

             

   

BAIBAI


相关文章
|
2月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
181 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
46 1
|
3月前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
3月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
320 1
|
3月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
92 2
|
3月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
45 3
|
4月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
3月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
223 14
|
3月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
60 0
|
3月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。