描画

SpreadJSでは、ワークシートを再描画し、レンダリングパフォーマンスを向上させることができます。

ユーザーがシートに変更を加えた後は、Spreadコンポーネントはこの変更を処理し、新たなシートを描画する必要があります。 repaintメソッドを使用しても、シートを再描画できます。 通常、シートに変更が加えられるとコンポーネントは自動的に更新し、変更を反映させます。一度に大量の変更を加える場合、シートが何度も再描画されないようにするには、suspendPaintメソッドを使用すると、必要な変更がすべて完了するまで自動再描画が停止されます。変更が完了したら、resumePaintメソッドを呼び出してシートを再描画します。次に、この例を示します。
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import './styles.css'; import { AppFunc } from './app-func'; import { App } from './app-class'; // 1. Functional Component sample ReactDOM.render(<AppFunc />, document.getElementById('app')); // 2. Class Component sample // ReactDOM.render(<App />, document.getElementById('app'));
import * as React from 'react'; import '@mescius/spread-sheets-resources-ja'; GC.Spread.Common.CultureManager.culture("ja-jp"); import GC from "@mescius/spread-sheets"; import Panel from './panel'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import './styles.css'; let spreadFinal; export const AppFunc = () => { return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <Panel suspendPaint = {() => {suspendPaint()}} setValue = {() => {setValue()}} resumePaint = {() => {resumePaint()}} ></Panel> </div> ) } function setValue() { var sheet = spreadFinal.getActiveSheet(); var cellRange = sheet.getSelections()[0]; var salesData = [ ["Salesperson", "Region", "Sales Amount", "Commission %", "Commission Amount"], ["Joe", "North", 260, '10%', 26], ["Robert", "South", 660, '15%', 99], ["Michelle", "East", 940, '15%', 141], ["Erich", "West", 410, '12%', 49.2], ["Dafna", "North", 800, '15%', 120], ["Rob", "South", 900, '15%', 135] ]; if (cellRange) { for (var row = cellRange.row, rowCount = cellRange.row + cellRange.rowCount; row < rowCount; row++) { for (var col = cellRange.col, colCount = cellRange.col + cellRange.colCount; col < colCount; col++) { sheet.setArray(row, col, salesData); sheet.getCell(row, col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); } } } } function suspendPaint() { spreadFinal.suspendPaint(); } function resumePaint() { spreadFinal.resumePaint(); } function initSpread(spread) { spreadFinal = spread; }
import * as React from 'react'; import Panel from './panel'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import '@mescius/spread-sheets-resources-ja'; GC.Spread.Common.CultureManager.culture("ja-jp"); import GC from "@mescius/spread-sheets"; let spreadFinal; export class App extends React.Component { render() { return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <Panel suspendPaint={() => { suspendPaint() }} setValue={() => { setValue() }} resumePaint={() => { resumePaint() }} ></Panel> </div> ); } } function setValue() { var sheet = spreadFinal.getActiveSheet(); var cellRange = sheet.getSelections()[0]; var salesData = [ ["Salesperson", "Region", "Sales Amount", "Commission %", "Commission Amount"], ["Joe", "North", 260, '10%', 26], ["Robert", "South", 660, '15%', 99], ["Michelle", "East", 940, '15%', 141], ["Erich", "West", 410, '12%', 49.2], ["Dafna", "North", 800, '15%', 120], ["Rob", "South", 900, '15%', 135] ]; if (cellRange) { for (var row = cellRange.row, rowCount = cellRange.row + cellRange.rowCount; row < rowCount; row++) { for (var col = cellRange.col, colCount = cellRange.col + cellRange.colCount; col < colCount; col++) { sheet.setArray(row, col, salesData); sheet.getCell(row, col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); sheet.getCell(row, ++col).foreColor("lightGreen"); } } } } function suspendPaint() { spreadFinal.suspendPaint(); } function resumePaint() { spreadFinal.resumePaint(); } function initSpread(spread) { spreadFinal = spread; }
import * as React from 'react'; export default function Panel(props) { const { suspendPaint, setValue, resumePaint } = props; return ( <div class="options-container"> <div class="option-row"> <input type="button" id="suspendPaint" value="描画を一時停止する" onClick={suspendPaint} /> <label>ワークブックの描画を一時停止します。</label> </div> <div class="option-row"> <input type="button" id="setValue" value="値配列を設定する" onClick={setValue} /> <label>シートに一連の値を設定します。</label> </div> <div class="option-row"> <input type="button" id="resumePaint" value="描画を再開する" onClick={resumePaint} /> <label>ワークブックの描画を再開します。</label> </div> </div> ); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ja/react/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/ja/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/ja/lib/react/license.js').then(function () { System.import('./src/app'); }); </script> </head> <body> <div id="app" style="height: 100%;"></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; } .labelStyle { color:rgb(226,107,29); display:inline-block; font-family:Arial, Helvetica, sans-serif; font-size: 18px; font-weight: normal; height:30px; line-height: 30px } input[type=button] { margin-top: 6px; display: block; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-resources-ja': 'npm:@mescius/spread-sheets-resources-ja/index.js', '@mescius/spread-sheets-react': 'npm:@mescius/spread-sheets-react/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/umd/react.production.min.js', 'react-dom': 'npm:react-dom/umd/react-dom.production.min.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);