質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

2932閲覧

Handsontableでセルの背景色設定、コメント削除を一括で実施したい

seiyan0426

総合スコア16

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2019/01/13 06:13

前提・実現したいこと

Handsontableを使用して全セルの値を一括で背景色設定、コメント削除を実施したいです。
以下のソースコードのように表の行数、列数を取得してループさせれば個別に出来るのですが、パフォーマンスが悪いので、パフォーマンスが改善されると思われるため、一括で処理させたいです。
実現方法を教えていただけないでしょうか。

該当のソースコード

JSX

1import React, { Component } from 'react'; 2import { HotTable } from '@handsontable/react'; 3import 'handsontable/dist/handsontable.full.css'; 4 5class Test extends Component { 6 constructor(props) { 7 super(props); 8 this.hotTableComponent = React.createRef(); 9 this.hotSettings = { 10 columns: [ 11 { title: 'test' } 12 ], 13 colWidths: [ 100 ], 14 startCols: 1, 15 startRows: 10, 16 rowHeaders: true, 17 width: 965, 18 height: 400, 19 }; 20 }; 21 createClick = () => { 22 // コメント 23 const commentsPlugin = this.hotTableComponent.current.hotInstance.getPlugin('comments'); 24 // 行数取得 25 const countRows = this.hotTableComponent.current.hotInstance.countRows(); 26 // 列数取得 27 const countCols = this.hotTableComponent.current.hotInstance.countCols(); 28 29 for (let intI = 0; intI < countRows; intI++) { 30 for (let intJ = 0; intJ < countCols; intJ++) { 31 // セル背景色初期化 32 this.hotTableComponent.current.hotInstance.setCellMeta( 33 intI, 34 intJ, 35 'className', 36 'err-style-release' 37 ); 38 // コメント削除 39 commentsPlugin.removeCommentAtCell(intI, intJ); 40 } 41 } 42 }; 43 render() { 44 return ( 45 <div> 46 <HotTable 47 id="hot" 48 ref={this.hotTableComponent} 49 settings={this.hotSettings} 50 /> 51 <button onClick={this.createClick}>登録</button> 52 </div> 53 ); 54 } 55}

補足情報(FW/ツールのバージョンなど)

"@handsontable/react": "^2.1.0",
"handsontable": "^6.2.2"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは。

以下、詳細まで掘って調べきったわけではありませんので、seiyan0426さんの課題を完全に解決する回答になっているかは分かりませんが、調べたことと試作したコードを回答します。

まず以下の issue

への回答コメントに以下が書かれています。

Currently the best way to style Handsontable is to use custom renderers.

つまり、「Handsontableにスタイルをあてるならカスタムレンダラーを使うのがベスト」とのことです。次に React の場合のカスタムレンダラーをどう作ればいいのかということになると、以下の issue

の zekedroid さんによる以下の2つのコメント

とこれらコメントからリンクされている以下の記事とソースコードが参考になります。(同じく、zekedroidさんによるもの)

mediumの記事で説明されている react-lru を使うとHandsontableのセルのレンダリングが効率化されるようです。

そこで、ご質問に挙げられている Test コンポーネントのコードをベースに、上記を参考にしてカスタムレンダラーを追加し、動作確認するためのコードを試作してみましたので、以下に挙げておきます。

まず、react-lru をインストールします。

yarn add react-lru

 

Test.js

Test コンポーネントの this.hotSettingsrenderer を追加し、1つのセルに対応する Cellコンポーネント も追加しました。逆に、クリックハンドラ createClick ではstate を変更するだけにしました。

javascript

1import React, { Component } from 'react'; 2import { HotTable } from '@handsontable/react'; 3import 'handsontable/dist/handsontable.full.css'; 4import { renderReactCell, MemoizedReactDomContainers } from 'react-lru'; 5 6import './styles.css'; 7 8const memoizedContainers = new MemoizedReactDomContainers(20); 9 10const Cell = ({ value, error }) => ( 11 <div className={`${error ? 'cell err-style-release' : 'cell'}`}>{error ? '' : value}</div> 12); 13 14class Test extends Component { 15 constructor(props) { 16 super(props); 17 this.hotSettings = { 18 columns: [ 19 { 20 title: 'test', 21 renderer: (instance, td, row, col, prop, value) => { 22 renderReactCell({ 23 memoizedContainers, 24 td, 25 row, 26 col, 27 jsx: <Cell value={value} error={!!(this.state.clickCount % 2)} /> 28 }); 29 return td; 30 }, 31 } 32 ], 33 colWidths: [ 100 ], 34 startCols: 1, 35 startRows: 10, 36 rowHeaders: true, 37 width: 965, 38 height: 400, 39 }; 40 this.state = { clickCount: 0, }; 41 }; 42 43 createClick = () => { 44 this.setState({ clickCount: this.state.clickCount + 1 }); 45 }; 46 47 render() { 48 return ( 49 <div> 50 <HotTable settings={this.hotSettings} /> 51 <button onClick={this.createClick}>登録</button> 52 </div> 53 ); 54 } 55} 56 57export default Test; 58

  

styles.css

.err-style-release はセレクタの詳細度を上げました。また、 padding: 0 と、 height: 22px はデモを見やすくするための暫定措置です。

.handsontable td { padding: 0 } .handsontable div.cell { height: 22px } .handsontable div.err-style-release { background-color: #FF0000; }

index.js

javascript

1import React from 'react'; 2import ReactDOM from 'react-dom'; 3import Test from './Test'; 4 5ReactDOM.render(<Test />, document.getElementById('root'));

index.html

html

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8" /> 5 <title>test</title> 6</head> 7<body> 8 <div id="root" /> 9</body> 10</html>

 

 

 
上記のように修正したTest コンポーネントをマウントして表示させ、

① いくつかの空白のセルに適当に文字を入力してから、

② 「登録」ボタンをクリックすると、.err-style-releaseによってセルが赤くなり、かつ、入力した文字が非表示になります。

イメージ説明

もう一度「登録」をクリックすると、.err-style-releaseが無くなり背景色が未設定の状態に戻ります。

以上、どこか一部でも参考になれば幸いです。

投稿2019/01/13 14:59

編集2019/01/13 15:24
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問