el-table大数据量加载

参考: https://codepen.io/william_yyh/pen/mdmEzPw

//

let timer = null;

const setRowDisableNone = function (start, end, binding) {

    if(timer) {

        clearTimeout(timer);

        timer = null;

    }

    timer = setTimeout(() => {

        binding.value.call(

            null,

            start,

            end

        )

    })

};

const {floor, round} = Math;

  // 获取元素

const $el = (dom, id) => dom.querySelector(id);

const $h = (tag) => document.createElement(tag);

const setStyle = (dom, arr) => dom.setAttribute('style', arr)

// function setscrolls() {

//     let scrollTop = this;

//     const half

// }


 

export default {

    componentUpdated(el, binding, vnode, oldVnode) {

        // 表格显示数据量

        let spillDataNum = (vnode.componentOptions.propsData.data || []).length || 6;

        setTimeout(() => {

            const dataSize = vnode.data.attrs["data-size"];

            const oldDataSize = oldVnode.data.attrs["data-size"];

            if(dataSize === oldDataSize) return;

            const m_body_wrap = $el(el,'.el-table__body-wrapper');

            const m_tbody = $el(m_body_wrap, "table tbody");

            const l_body_wrap = $el(el, ".el-table__fixed-left .el-table__fixed-body-wrapper");

            const l_tbody = l_body_wrap && $el(l_body_wrap, "table tbody")

            const r_body_wrap = $el(el, ".el-table__fixed-right .el-table__fixed-body-wrapper");

            const r_tbody = r_body_wrap && $el(r_body_wrap, "table tbody")

            const m_row = $el(m_body_wrap, "table tr");

           

            if(!m_row) {

                return;

            };

            const m_row_h = m_row.clientHeight;

            let showRowNum = round(m_body_wrap.clientHeight / m_row_h);

            let h_t = 0;

            let h_b = (dataSize - spillDataNum) * m_row_h;

            const m_tr_top = $h('tr');

            const m_tr_bottom = m_tr_top.cloneNode(true);

            setStyle(m_tr_top, `height: ${h_t}px `);

            setStyle(m_tr_bottom, `height: ${h_b}px `);

            m_tbody.insertBefore(m_tr_top, m_row)

            m_tbody.append(m_tr_bottom)

            let l_tr_top, l_tr_bottom, r_tr_top, r_tr_bottom;

           

            if(l_tbody) {

                let l_row = $el(l_body_wrap, "table tr");

                l_tr_top = m_tr_top.cloneNode(true);

                l_tr_bottom = m_tr_bottom.cloneNode(true);

                l_tbody.insertBefore(l_tr_top, l_row)

                l_tbody.append(l_tr_bottom)

            }

     

            if(r_tbody) {

                let r_row = $el(r_body_wrap, "table tr");

                r_tr_top = m_tr_top.cloneNode(true);

                r_tr_bottom = m_tr_bottom.cloneNode(true);

                r_tbody.insertBefore(r_tr_top, r_row)

                r_tbody.append(r_tr_bottom)

            }


 

            m_body_wrap.addEventListener("scroll", function() {

                let { scrollTop } = this;

                const half = round((spillDataNum - showRowNum) / 2);

                const rScrollTop = scrollTop - m_row_h * half;

               

                const offsetSt = rScrollTop > 0 ? rScrollTop : 0;

                let topNum = floor(offsetSt / m_row_h);

                if(topNum + spillDataNum >= dataSize) {

                    topNum = dataSize - spillDataNum

                };

                let topPx = topNum * m_row_h;

                let topx = h_b - topPx >= 0 ? topPx : h_b;

                let bottomx = h_b - topPx >= 0 ? h_b - topPx : 0;

                setStyle(m_tr_top, `height: ${topx}px `);

                setStyle(m_tr_bottom, `height: ${bottomx}px `);

                if(l_tbody) {

                    setStyle(l_tr_top, `height: ${topx}px `);

                    setStyle(l_tr_bottom, `height: ${bottomx}px `);

                }

                if(r_tbody) {

                    setStyle(r_tr_top, `height: ${topx}px `);

                    setStyle(r_tr_bottom, `height: ${bottomx}px `);

                }

                setRowDisableNone(topNum, topNum + spillDataNum, binding)

            })






 

        })



 

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值