


Vue fester Header, feste Spalte, Tabellenkomponente, die durch Klicken auf den Header sortiert werden kann
Dec 05, 2016 am 11:16 AMDas Prinzip besteht darin, die angegebenen Zeilen und Spalten der Originaltabelle zu klonen und darauf zu platzieren
Der Implementierungscode lautet wie folgt:
<template> <div> <div id="divBox1" :style="{height:height}"> <table id="tbTest1" cellpadding="0" cellspacing="0" style="text-align:center;background:rgba(244,249,255,0.4);"> <tr> <th v-for="item in thead" @click="sortBy(item)"> {{item}}<img style="width:0.16rem;height:0.20rem;margin-left:4px;" :src="filterUrl" alt="" v-if="$index!=0" data-img="{{filterUrl}}"> </th> </tr> <tr v-for="row in tableRows | orderBy sortBykey sortOrders[sortKey]"> <td style="overflow:hidden;white-space:nowrap;" v-for="item in gridColumns" v-html="row[item] | numberFilter" :id="$parent.$index"> </td> </tr> </table> </div> </div> </template> <script> /*eslint-disable*/ var ofixed_table_st = window.setTimeout; var hasLeft = ''; var hasHead = ''; window.setTimeout = function(fRef, mDelay) { if(typeof fRef == 'function') { var argu = Array.prototype.slice.call(arguments, 2); var f = (function() { fRef.apply(null, argu); }); return ofixed_table_st(f, mDelay); } return ofixed_table_st(fRef, mDelay); }; function oFixedTable(id, obj, _cfg) { this.id = id; this.obj = obj; this.box = this.obj.parentNode; this.config = { fixHead: _cfg.fixHead || true, rows: _cfg.rows || 1, cols: _cfg.cols || 0, background: _cfg.background || '#ffffff', zindex: _cfg.zindex || 10 }; window.setTimeout(this._fixTable, 100, this); } oFixedTable.prototype._fixTable = function(_) { if(_.obj.rows.length <= 0) { return false; } var hasLeft = _.buildLeft(); var hasHead = _.buildHead(); _.box.onscroll = function() { if(_.divHead != null) { _.divHead.scrollLeft = this.scrollLeft; } if(_.divLeft != null) { _.divLeft.scrollTop = this.scrollTop; } }; if(hasHead && hasLeft) { _.buildTopLeft(); } }; oFixedTable.prototype.buildHead = function() { console.log(2222222222222222222) var _ = this; var strDivId = _.id + '_div_head'; var strTbId = _.id + '_tb_header'; var div = document.createElement('div'); div.id = strDivId; div.style.cssText = 'position:absolute;overflow:hidden;z-index:' + (_.config.zindex + 1) + ';'; div.innerHTML = '<table id="' + strTbId + '" cellpadding="0" cellspacing="0" style="background:' + _.config.background + ';"></table>'; _.box.insertBefore(div, _.obj); _.divHead = div; _.tbHead = document.getElementById(strTbId); //判斷是否出現(xiàn)縱向滾動(dòng)條,若出現(xiàn),高度減去滾動(dòng)條寬度 16px var sw = _.obj.offsetHeight > _.box.offsetHeight ? 0 : 0; _.divHead.style.width = (_.box.offsetWidth - sw) + 'px'; _.tbHead.style.textAlign = _.obj.style.textAlign; _.tbHead.style.width = _.obj.offsetWidth + 'px'; var hasHead = false; if(_.config.fixHead && _.obj.tHead != null) { var tHead = _.obj.tHead; _.tbHead.appendChild(tHead.cloneNode(true)); hasHead = true; } else { for(var i = 0; i < _.config.rows; i++) { var row = _.obj.rows[i]; if(row != null) { _.tbHead.appendChild(row.cloneNode(true)); hasHead = true; } } } return hasHead; }; oFixedTable.prototype.buildLeft = function() { var _ = this; if(_.config.cols <= 0) { return false; } var strDivId = _.id + '_div_left'; var strTbId = _.id + '_tb_left'; var div = document.createElement('div'); div.id = strDivId; div.style.cssText = 'position:absolute;overflow:hidden;z-index:' + _.config.zindex + ';box-shadow: #dddddd 2px 0px 2px;width: 2rem;'; div.innerHTML = '<table id=' + strTbId + ' cellpadding="0" cellspacing="0" style="background:' + _.config.background + ';width: 2rem;"></table>'; _.box.insertBefore(div, _.obj); _.divLeft = div; _.tbLeft = document.getElementById(strTbId); _.tbLeft.style.textAlign = _.obj.style.textAlign; //判斷是否出現(xiàn)橫向滾動(dòng)條,若出現(xiàn),高度減去滾動(dòng)條高度 16px var sw = _.obj.offsetWidth > _.box.offsetWidth ? 0 : 0; _.divLeft.style.height = (_.box.offsetHeight - sw) + 'px'; var hasLeft = false; for(var i = 0, rows = _.obj.rows.length; i < rows; i++) { var row = _.tbLeft.insertRow(_.tbLeft.rows.length); row.style.cssText = _.obj.rows[i].style.cssText; for(var j = 0; j < _.config.cols; j++) { var cell = _.obj.rows[i].cells[j]; if(cell != null) { row.appendChild(cell.cloneNode(true)); cell.style.cssText = _.obj.rows[i].cells[j].style.cssText; hasLeft = true; } } } return hasLeft; }; oFixedTable.prototype.buildTopLeft = function() { var _ = this; var strDivId = _.id + '_div_top_left'; var strTbId = _.id + '_tb_top_left'; var div = document.createElement('div'); div.id = strDivId; div.style.cssText = 'position:absolute;overflow:hidden;z-index:' + (_.config.zindex + 2) + ';box-shadow: #dddddd 2px 0px 2px;width: 2rem;'; div.innerHTML = '<table id="' + strTbId + '" cellpadding="0" cellspacing="0" style="background:' + _.config.background + ';"></table>'; _.box.insertBefore(div, _.obj); var tbTopLeft = document.getElementById(strTbId); tbTopLeft.style.textAlign = _.obj.style.textAlign; for(var i = 0; i < _.config.rows; i++) { var row = tbTopLeft.insertRow(tbTopLeft.rows.length); row.style.cssText = _.obj.rows[i].style.cssText; for(var j = 0; j < _.config.cols; j++) { var cell = _.obj.rows[i].cells[j]; if(cell != null) { row.appendChild(cell.cloneNode(true)); cell.style.cssText = _.obj.rows[i].cells[j].style.cssText; hasLeft = true; } } } }; export default{ // 接收父組件傳過來的參數(shù) props: ['tableRows', 'gridColumns', 'thead', 'store', 'height', 'singleData'], // 監(jiān)控 watch: { 'tableRows': function (val) { var self = this // 明星店鋪頁面時(shí)動(dòng)態(tài)調(diào)整店鋪名所在列的寬度s if (self.store) { document.querySelectorAll('table td:nth-child(3)')[0].style.width = 3 + 'rem' document.querySelectorAll('table th:nth-child(3)')[0].style.width = 3 + 'rem' } var length = self.gridColumns.length document.getElementById('tbTest1').style.width = 2 * length + 'rem' setTimeout(function () { if (self.singleData) { document.getElementById('ofix1_tb_left').classList.add('ofix1_tb_left') } document.querySelectorAll('#ofix1_tb_left td')[0].style.width = 2 + 'rem' var tbObj = document.getElementById('ofix1_tb_header') tbObj.addEventListener('click',function (event) { if(event.target.tagName === 'TH'){ self.sortBy(event.target.innerText, event) } }) }, 101) } }, data: function() { var sortOrders = {} this.gridColumns.forEach(function (key) { sortOrders[key] = 1 }) return { sortKey: '', filterUrl: './static/img/indus/filter1.png', sortOrders: sortOrders } }, methods: { sortBykey: function (a, b) { return parseFloat(a[this.sortKey]) - parseFloat(b[this.sortKey]) console.log('11111111111') }, sortBy: function (key, event) { // 每一次排序之前所有的圖片重置 var imgDom = document.querySelectorAll('#ofix1_tb_header th img') for (var x = 0; x < imgDom.length; x++) { imgDom[x].setAttribute('src', './static/img/indus/filter1.png') } // 排序 var activeTheadIndex = 0 for (var i = 0; i < this.thead.length; i++) { if (this.thead[i] === key) { activeTheadIndex = i } } this.sortKey = this.gridColumns[activeTheadIndex] this.sortOrders[this.gridColumns[activeTheadIndex]] = this.sortOrders[this.gridColumns[activeTheadIndex]] * -1 // 排序時(shí)同步改變標(biāo)識(shí)圖片 if (this.sortOrders[this.gridColumns[activeTheadIndex]] > 0) { event.target.getElementsByTagName('img')[0].setAttribute('src', './static/img/indus/filter2.png') } else { event.target.getElementsByTagName('img')[0].setAttribute('src', './static/img/indus/filter3.png') } // 排序時(shí)同步改變左邊第一列的內(nèi)容 setTimeout(function(){ var tdDom = document.querySelectorAll('#tbTest1 tr td:nth-child(1)') var tdDomLeft = document.querySelectorAll('#ofix1_tb_left td') for (var y = 0; y < tdDom.length; y++) { tdDomLeft[y].innerHTML = tdDom[y].innerHTML } },0) } }, filters: { numberFilter: function (value) { if (value == 0) { return '0' } else if (!value) { return '/' } else { return value } } }, components: { }, ready: function() { var ofix1 = new oFixedTable('ofix1', document.getElementById('tbTest1'), { rows: 1, cols: 1 }) }, created () { } } </script> <style scoped> #divBox1{ overflow:auto; width:100%; font-size: 0.28rem; } #ofix1_div_left{ box-shadow: #dddddd 2px 0px 2px; width: 2rem; } table { table-layout : fixed; } table td, table th { width: 2rem; line-height: 1rem; height: 1rem; padding: 0; color: #999999; overflow: hidden; white-space: nowrap; /*vertical-align: middle;*/ } table th{ background: rgba(188,219,255,0.4); color: #999; font-size: .28rem; font-weight: normal; } table th:nth-child(1){ box-shadow: #dddddd 2px 0px 0px; } .ofix1_tb_left tr td:nth-child(1){ /*display: inline-block;*/ text-align: left; } #ofix1_div_top_left{ box-shadow: #dddddd 2px 0px 2px; } #tbTest1 tr td:nth-child(1){ box-shadow: #dddddd 2px 0px 0px; } #tbheader td { background: #fff; } </style>
Beispiel für den Aufruf einer übergeordneten Komponente :
<template> <table-locked :table-rows="tableData" :grid-columns="gridColumns" :thead="thead" :height="height"> </table-locked> </template> import TableLocked from '../../common/TableLocked.vue' export default{ components: {TableLocked}, data () { data.gridColumns = ['brand', 'product_count', 'averagePrice', 'sales', 'huang_sale_per', 'sale_per', 'sales_amount', 'huang_sale_amount_per', 'sales_amount_per', 'score_num', 'scort_good_per'] data.thead = ['品類', '產(chǎn)品種類', '均價(jià)', '銷量', '銷量環(huán)比', '銷量占比', '銷額(萬元)', '銷額環(huán)比', '銷額占比', '評(píng)論總數(shù)', '好評(píng)率'] } }

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Um eine vollst?ndige Python -Webanwendung zu entwickeln, befolgen Sie die folgenden Schritte: 1. W?hlen Sie das entsprechende Framework wie Django oder Flask. 2. Integrieren Sie Datenbanken und verwenden Sie Ormen wie SQLalchemy. 3. Entwerfen Sie das Front-End und verwenden Sie Vue oder React. 4. Führen Sie den Test durch, verwenden Sie PyTest oder Unittest. 5. Anwendungen bereitstellen, Docker und Plattformen wie Heroku oder AWS verwenden. Durch diese Schritte k?nnen leistungsstarke und effiziente Webanwendungen erstellt werden.

Der Kern des Front-End-Routing-Systems besteht darin, URLs an Komponenten abzubilden. Vuerouter und Reactrouter erkennen aktualisiertes Seitenschalten durch H?ren auf URL-?nderungen und das Laden entsprechender Komponenten. Zu den Konfigurationsmethoden geh?ren: 1. verschachtelte Routing, die die verschachtelten untergeordneten Komponenten in der übergeordneten Komponente erm?glichen; 2. Dynamisches Routing, Laden verschiedener Komponenten nach URL -Parametern; 3. Routenschutz, Logik wie die Berechtigungsüberprüfungen vor und nach dem Wechsel der Routen.

Reaktivit?tsformInvue3AMEDTosimplifyStellingRectiveAtaTAnyautomatic -TrackingAnagingRiftingRifting -Wirklichkeit mit

Die Kernunterschiede zwischen Vue.js und React in der Komponentenentwicklung sind: 1) VUE.JS verwendet die Vorlagensyntax und die Option -API, w?hrend React JSX- und Funktionskomponenten verwendet. 2) Vue.js verwendet reaktionsschnelle Systeme, React verwendet unver?nderliche Daten und virtuelles DOM. 3) Vue.js liefert mehrere Lebenszyklus -Haken, w?hrend React mehr Nutzungseffekthaken verwendet.

Internationalisierung undLokalisationInvueAppsAprimal-HandleDusedthevuei18nPlugin.1.Installvue-i18nvianpMoryarn.2.CreatelocalejsonFiles (z

Wenn Vue.js Array -Updates übernimmt, wird die Ansicht nicht aktualisiert, da ObjefineProperty nicht direkt auf Array -?nderungen anh?ren kann. Zu den L?sungen geh?ren: 1. Verwenden Sie die VUE.Set -Methode, um den Array -Index zu ?ndern; 2. Die gesamte Array neu zuweisen; 3. Verwenden Sie die umgeschriebene Mutationsmethode von VUE, um das Array zu bedienen.

Verwenden Sie: KeyAttributeWithv-ForinvueSessentialforperformanceAndCorrectBehavior

Zu den Methoden zur Optimierung der Leistung gro?er Listen und komplexer Komponenten in VUE geh?ren: 1. Verwenden Sie die Vonce-Richtlinie, um statische Inhalte zu verarbeiten, um unn?tige Aktualisierungen zu reduzieren; 2. Implementieren Sie virtuelle Scrollen und rendern Sie nur den Inhalt des visuellen Bereichs, beispielsweise die Verwendung der Vue-Virtual-Scroller-Bibliothek; 3. Cache-Komponenten durch Keep-Alive oder V-Once, um doppelte Halterungen zu vermeiden. 4. Verwenden Sie berechnete Eigenschaften und H?rer, um die reaktionsschnelle Logik zu optimieren, um den Wiedererlangungsbereich zu verringern. 5. Befolgen Sie die Best Practices, z. B. die Verwendung einzigartiger Schlüssel in V-für, die Vermeidung von Inline-Funktionen in Vorlagen und die Verwendung von Leistungsanalyse-Tools zum Auffinden von Engp?ssen. Diese Strategien k?nnen die Anwendungsflüssigkeit effektiv verbessern.
