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

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

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

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

3回答

3468閲覧

React + TypeScriptでテーブルを作りたい

taro_bird

総合スコア17

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2021/07/31 04:14

React、TypeScript練習中のものです。

なんの工夫もないただの
テーブルを生成しようとしていますが、
うまくいっておりません。

現状、下記のような感じで、
「この型はpush使えませんよ!」と言った感じの
エラーが出ております。

ここで質問ですが、
・tbodyの型は間違っていますか?また、tbody,tr,tdの型はなんでしょうか?
・そもそもこの方法は合っているのでしょうか?

typescript

1const makeTable: React.FC<Props> = () => { 2 let tbody:HTMLTableSectionElement = document.createElement("tbody"); 3 4 for(let i:number = 0; i < 5; i++){ 5 tbody.push( 6 <tr> 7 <td>{i}行目</td> 8 <td>眠い眠い</td> 9 </tr> 10 ); 11 } 12 13 return( 14 <table> 15 <thead> 16 <tr> 17 <th>行数</th> 18 <th>状態</th> 19 </tr> 20 </thead> 21 {tbody} 22 </table> 23 </div> 24 ) 25 26}

以上、よろしくお願いします。

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

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

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

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

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

maisumakun

2021/07/31 04:38

> 「この型はpush使えませんよ!」と言った感じの エラーが出ております。 エラーメッセージはむやみに要約せず、「コピペで」提示していただけるとありがたいです。
taro_bird

2021/07/31 05:06

ご回答ありがとうございます。 Property 'push' does not exist on type 'HTMLTableSectionElement' というエラーが出ております。
guest

回答3

0

構成としてはやはりrowの型を定義して、rowのリストをpropsで受け取りmapで表示するのがベストかと思います。
たとえば、

javascript

1interface RowType { 2 id: string // この辺の型はご自由に 3 state: string 4} 5 6type Props { 7 rows: RowType[] 8} 9const makeTable: VFC<Props> = ({rows}: Props) => ( 10 <table> 11 <thead> 12 <tr> 13 <th>行数</th> 14 <th>状態</th> 15 </tr> 16 </thead> 17 <tbody> 18 {rows.map((row, idx) => ( 19 <tr key={row.id}> 20 <td>{idx}行目</td> 21 <td>{row.state}</td> 22 </tr> 23 )} 24 </tbody> 25 </table> 26) 27

投稿2021/07/31 06:35

p19ljk

総合スコア146

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

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

0

ベストアンサー

※TypeScritpではなくJavaScriptのコードですが
案1)

JavaScript

1const Table = () => { 2 return ( 3 <table> 4 <thead> 5 <tr> 6 <th>行数</th> 7 <th>状態</th> 8 </tr> 9 </thead> 10 <tbody> 11 {[...Array(5).keys()].map((i) => { 12 return ( 13 <tr key={i}> 14 <td>{i}</td> 15 <td>眠い</td> 16 </tr> 17 ) 18 })} 19 </tbody> 20 </table> 21 ) 22}

案2)

JavaScript

1const Table = () => { 2 const tbody = []; 3 for(let i = 0; i < 5; i++){ 4 tbody.push( 5 <tr key={i}> 6 <td>{i}行目</td> 7 <td>眠い眠い</td> 8 </tr> 9 ); 10 } 11 12 return ( 13 <table> 14 <thead> 15 <tr> 16 <th>行数</th> 17 <th>状態</th> 18 </tr> 19 </thead> 20 <tbody> 21 {tbody} 22 </tbody> 23 </table> 24 ) 25} 26

投稿2021/07/31 06:13

編集2021/07/31 06:15
mmmsjsmsms

総合スコア11

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

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

taro_bird

2021/07/31 06:30

とりあえず型をつけてpushするという 発想が無しであることがわかりました。 そしてこの書き方がしっくりくるので ベストアンサーとさせていただきます。 ありがとうございました。
guest

0

そもそも論として、React内でdocument.createElementを行うのは適当ではありません。JSXに<tbody>を書いて、その中身をmapで生成するような形で進めてください。

投稿2021/07/31 04:50

maisumakun

総合スコア146018

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

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

taro_bird

2021/07/31 05:18

ご返答ありがとうございます。 mapで書くと const indexes:number[] = [0, 1, 2, 3, 4]; と const make_tr = (num: number) => { return ( <tr> <td>{num}回</td> <td>{calc(num)}</td> </tr> ) } というものを用意して return は <tbody> {indexes.map(index => make_tr(index))} </tbody> このようになります。 正直、最初はこうしていたのですが、 indexesという配列を用意するのが 変で仕方ありませんでした。 こうするしかないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問