绘制性能优化

SpreadJS 支持通过暂停和恢复绘制来优化渲染性能,在批量添加工作表或修改数据时,可以暂停重绘避免频繁刷新,完成所有操作后再一次性渲染,显著提升执行效率。

概述 本 Demo 展示了如何使用 suspendPaint 和 resumePaint 方法优化 SpreadJS 的渲染性能。通过交互式操作,演示了在暂停绘制状态下添加多个工作表,然后恢复绘制一次性渲染的过程,帮助开发者理解如何避免频繁重绘带来的性能损耗。 实现思路 初始化时调用 suspendPaint 暂停绘制,避免初始化过程中的不必要渲染 提供三个交互按钮:暂停绘制、添加工作表、恢复绘制 用户可以点击"暂停绘制"按钮进入暂停状态 在暂停状态下多次点击"添加工作表"按钮,此时不会立即看到界面变化 点击"恢复绘制"按钮后,所有添加的工作表一次性渲染显示 代码解析 初始化时暂停绘制 这段代码在初始化时调用了 suspendPaint() 暂停绘制,完成初始化操作后再调用 resumePaint() 恢复绘制。虽然这个示例中初始化操作较少,但在实际应用中,如果初始化时需要加载大量数据或进行多项设置,这种方式可以显著提升性能。 交互式控制绘制状态 这两个事件监听器允许用户手动控制绘制状态。点击"暂停绘制"按钮后,SpreadJS 进入暂停状态,后续的所有操作都不会触发界面刷新。 在暂停状态下添加工作表 在暂停绘制状态下,每次点击"添加工作表"按钮都会调用 addSheet(0) 方法在工作簿开头添加新工作表,但由于绘制已暂停,界面不会立即更新。只有在点击"恢复绘制"按钮后,所有添加的工作表才会一次性显示出来。 运行效果 点击"暂停绘制"按钮,SpreadJS 进入暂停绘制状态 在暂停状态下多次点击"添加工作表"按钮,界面不会立即显示新工作表 点击"恢复绘制"按钮后,所有添加的工作表一次性渲染显示 通过对比暂停绘制前后添加工作表的响应速度,可以直观感受性能优化的效果 API 参考 suspendPaint 方法 暂停 SpreadJS 的重绘过程。调用此方法后,所有对工作簿的修改都不会触发界面刷新,直到调用 resumePaint 方法。 resumePaint 方法 恢复 SpreadJS 的重绘过程。调用此方法后,会一次性渲染所有在暂停期间积累的修改,确保界面与数据状态同步。 addSheet 方法 index:新工作表要插入的位置索引 sheet:可选,要添加的工作表对象 在工作簿的指定位置添加新工作表。
window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(_getElementById('ss'), { sheetCount: 1 }); initSpread(spread); }; function initSpread(spread) { spread.suspendPaint(); spread.getSheet(0); var sheet = spread.getActiveSheet(); spread.resumePaint(); _getElementById('btnAddSheet').addEventListener('click', function() { spread.addSheet(0); }); _getElementById('suspendPaint').addEventListener('click', function() { spread.suspendPaint(); }); _getElementById('resumePaint').addEventListener('click', function() { spread.resumePaint(); }); } function _getElementById(id){ return document.getElementById(id); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta name="spreadjs culture" content="zh-cn" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/data/data.js" type="text/javascript"></script> <script src="$DEMOROOT$/zh/purejs/node_modules/@grapecity-software/spread-sheets-resources-zh/dist/gc.spread.sheets.resources.zh.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div class="sample-tutorial"> <div id="ss" class="sample-spreadsheets"></div> <div class="options-container"> <div class="option-row"> <label>点击按钮暂停和恢复 Spread 组件的绘制,查看操作如何受该状态的影响。</label> </div> 1. 点击“暂停绘制” <input type="button" id="suspendPaint" value="暂停绘制" /> <br /> 2. 添加多个工作表 <input type="button" id="btnAddSheet" value="添加工作表" /> <br /> 3. 点击“恢复绘制” <input type="button" id="resumePaint" value="恢复绘制" /> <div class="option-row"> <label>使用 suspendPaint/ResumePaint 功能时,渲染性能会得到提升。</label> </div> </div> </div> </body> </html>
.sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } label { display: block; margin-bottom: 6px; } input { padding: 4px 6px; } input[type=button] { margin-top: 16px; display: block; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }