[英]Inquiry regarding array reactivity in Vue.js 2
我編寫了一個網格組件 ,該組件支持子行,即在每個正常行下具有可跨越表格整個寬度的單元格的可翻轉行。 為了跟蹤子行的狀態,我使用了一個名為openChildRows
的數據屬性,該屬性默認為空數組。 當用戶單擊每行第一列上的切換圖標時,該行的子行將打開。 再次單擊將其關閉。 openChildRows
數組包含打開的行的ID。
我遇到的問題是,當我在子行中使用組件時,切換后的所有打開的行都將被重新安裝。 這顯然是低效的,尤其是如果子行組件在安裝時發送ajax請求。 理想情況下,我想要的是僅安裝新的子行。
我已經使用JSX作為模板編寫了網格。 下面是相關代碼:
行模板:
module.exports = function(h, that) {
var rows = [];
var columns;
var rowKey = that.opts.uniqueKey;
var rowClass;
var data = that.source=='client'?that.filteredData:that.tableData;
var recordCount = (that.Page-1) * that.limit;
data.map(function(row, index) {
index = recordCount + index + 1;
columns = [];
if (that.hasChildRow) {
var childRowToggler = <td><span on-click={that.toggleChildRow.bind(that,row[rowKey])} class={`VueTables__child-row-toggler ` + that.childRowTogglerClass(row[rowKey])}></span></td>;
if (that.opts.childRowTogglerFirst) columns.push(childRowToggler);
}
that.allColumns.map(function(column) {
let rowTemplate = that.$scopedSlots && that.$scopedSlots[column];
columns.push(<td class={that.columnClass(column)}>
{rowTemplate ? rowTemplate({ row, column, index }) : that.render(row, column, index, h)}
</td>)
}.bind(that));
if (that.hasChildRow && !that.opts.childRowTogglerFirst) columns.push(childRowToggler);
rowClass = that.opts.rowClassCallback?that.opts.rowClassCallback(row):'';
rows.push(<tr class={rowClass} on-click={that.rowWasClicked.bind(that, row)} on-dblclick={that.rowWasClicked.bind(that, row)}>{columns} </tr>);
// Below is the code that renders open child rows
if (that.hasChildRow && this.openChildRows.includes(row[rowKey])) {
let template = this._getChildRowTemplate(h, row);
rows.push(<tr class='VueTables__child-row'><td colspan={that.allColumns.length+1}>{template}</td></tr>);
}
}.bind(that))
return rows;
}
切換方法代碼:
module.exports = function (rowId, e) {
if (e) e.stopPropagation();
if (this.openChildRows.includes(rowId)) {
var index = this.openChildRows.indexOf(rowId);
this.openChildRows.splice(index,1);
} else {
this.openChildRows.push(rowId);
}
};
_getChildRowTemplate
方法:
module.exports = function (h, row) {
// scoped slot
if (this.$scopedSlots.child_row) return this.$scopedSlots.child_row({ row: row });
var childRow = this.opts.childRow;
// render function
if (typeof childRow === 'function') return childRow.apply(this, [h, row]);
// component
return h(childRow, {
attrs: {
data: row
}
});
};
我變了:
if (that.hasChildRow && this.openChildRows.includes(row[rowKey])) {
let template = this._getChildRowTemplate(h, row);
rows.push(<tr class='VueTables__child-row'><td colspan={that.allColumns.length+1}>{template}</td></tr>);
}
至:
rows.push(that.hasChildRow && this.openChildRows.includes(row[rowKey])?
<tr class='VueTables__child-row'><td colspan={that.allColumns.length+1}>{this._getChildRowTemplate(h, row)}</td></tr>:h());
瞧!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.