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

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

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

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

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

Q&A

解決済

1回答

703閲覧

(Gatsby.js) Functions are not valid as a React childエラーが出てしまう。

kisukegotyou

総合スコア1

Gatsby

Gatsbyとは、Reactベースの静的サイトジェネレータ。最新のフロントエンド技術を活かし、機能豊富なWebサイトやアプリケーションを作ることが可能です。GraphQLを用いてあらゆるソースからサイトのデータを取得。指定した設定に基づいて静的サイトを構築することができます。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

React.js

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

0グッド

0クリップ

投稿2021/11/23 14:45

前提・実現したいこと

初質問で至らないところがあればすみません。自分は趣味でwebページなどを作っています。

gatsby.jsにてwebページを作っていますが、変数で横幅や縦幅を決めることができる表テーブルをコンポーネントできないか試していたところ、以下のようなエラーメッセージが出てしまいました。解決方法はわかりますでしょうか。アロー関数の部分が怪しいとは思うのですが。

自分は初心者なため、for文の中の記述も非常に怪しいです。LastTableにfilterメソッドでできた配列を格納しようとしているところも上手くif文の条件式がかけているか自信がありません。

発生している問題・エラーメッセージ

Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.

該当のソースコード

js

1//(Table.js) 2import * as React from "react" 3import PropTypes from "prop-types" 4 5 6const Table = ({ WidthTable,textarray,ElementinTable,JoinTable,LastTable }) => ( 7 ElementinTable = textarray.map((textarray) => 8 <td> 9 {textarray} 10 </td>), 11 (()=>{ 12 for(let i = 0;i<(textarray.length-1);i++){ 13 if(i%(WidthTable-1) === 0 && i!==0 || i===0){ 14 LastTable = ElementinTable.filter(ElementinTable => ElementinTable.length-1 <= i && ElementinTable.length%WidthTable < WidthTable ) 15 JoinTable = 16 <tr> 17 {LastTable} 18 </tr> 19 } 20 if(i===(textarray-1)){ 21 return(<table><tbody> 22 {JoinTable} 23 </tbody></table>); 24 } 25 } 26 }) 27) 28 29 30 31Table.propTypes = { 32 WidthTable: PropTypes.number, 33 textarray: PropTypes.arrayOf(PropTypes.string), 34 ElementinTable: PropTypes.arrayOf(PropTypes.string), 35 JoinTable: PropTypes.arrayOf(PropTypes.string), 36 CompletedTable: PropTypes.arrayOf(PropTypes.string), 37} 38 39Table.defaultProps = { 40 text: `デフォルト`, 41} 42 43export default Table

js

1//(index.js内で渡している変数の値) 2<Table WidthTable={2} textarray={["aaa","aaa"]} /> 3

試したこと

JSXの中で、for文をかこうとして、アロー関数を使ったのが原因だと思うのですが、地の文で書いてもエラーが出てしまうため、弱っています。

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

gatsby.js

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Reactの書き方から逸脱していて何がしたいのかわかりませんが、今の状態でとりあえずエラーをなくしたいならこんな感じです。シンプルなコンポーネントから見直してみてください。

const Table = ({ WidthTable, textarray, ElementinTable, JoinTable, LastTable }) => (() => { ElementinTable = textarray.map((textarray) => <td>{textarray}</td>); for (let i = 0; i < textarray.length - 1; i++) { if ((i % (WidthTable - 1) === 0 && i !== 0) || i === 0) { LastTable = ElementinTable.filter( (ElementinTable) => ElementinTable.length - 1 <= i && ElementinTable.length % WidthTable < WidthTable ); JoinTable = <tr>{LastTable}</tr>; } if (i === textarray - 1) { return ( <table> <tbody>{JoinTable}</tbody> </table> ); } else { return <>"HOGE"</>; } } })();

投稿2021/11/24 01:19

k4a

総合スコア983

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

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

kisukegotyou

2021/11/24 07:50 編集

ご回答ありがとうございます。エラー解決致しました。 非常に汚いコードで申し訳ないです。 Reactやコンポーネントのシンプルな書き方を1から見直して書き直していきたいと思います。
k4a

2021/11/24 08:26

嫌味な書き方になってしまいましたが、汚いコードというよりReactの書き方ではない、という印象です。 `Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.` 上記エラーはコンポーネントの返り値がReact Elementとして成立していないという意味です。 元のコードだと返り値が式になっています。回答はそれを即時関数化して一応React Elementを返すようにしたというだけの処置です。 データの加工部分(代入やfilter等)はuseEffects等のHookを利用し、リターン部はReact Elementの構築に専念するのが良いと思います。 今回程度の計算だとコストはかからないと思いますが、この書き方だと上位コンポーネントの再レンダリング毎に計算が走ってしまいます。 また計算部分とリターン部分が曖昧になり今回のようなエラーを起こす原因にもなります。
kisukegotyou

2021/11/24 18:32 編集

ご丁寧にありがとうございました。ご親切な解説痛み入ります。 元々JavaScriptを少し学習したのみで、Reactの書き方については、ほぼ知識がないまま書き進めてしまった事が今回のようなエラーの原因だとご指摘を読んで分かりました。 Hookの存在もお恥ずかしながら今知った位でして、ネットを参考にしながら騙し騙し書いていた事が露呈してしまったなという印象です。 今回のような前提知識のないままの書き方では、後々負債が溜まるであろうことが分かりましたのでご指摘を参考にしながら書き直していきたいと思います。 質問に対する回答とreactの書き方について根本的な部分からご丁寧に教えて頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問