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

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

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

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

React.js

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

Q&A

解決済

1回答

11337閲覧

React TypeError: X is not a functionのエラーが出てしまう

bellcrud

総合スコア22

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2019/03/24 10:54

##Reactで親のメソッドを孫までpropsで渡しでエラー
Reactで親のメソッドを孫までpropsで渡してsubmitボタンをクリックすると、子のコンポーネントのrenderメソッドに記載している孫のコンポーネントの記述箇所で下記のようなエラーになってしまいます。エラーになってしまう
TypeError: _this2.props.itemsSearch is not a function

コンパイルはできている

####エラー箇所
onSubmit
src/components/Header/Header.js:32
29 | <header className='Header'>
30 | <Logo/>
31 | <LogoutButton/>
32 | <SearchForm onSubmit={keyword =>this.props.itemsSearch(keyword)}/
| ^ 33 | <AddButton/>
34 | </header>
35 |

####ソースコード
親コンポーネント:App.js

~~~省略~~~ class App extends Component { ~~~省略~~~ itemsSearch(keyword){ axios({ method: 'GET', url: endPoint, params: {name: keyword}, headers: { 'Content-type': 'application/json', } }).then((results) => { console.log(results); this.setState({data: results.data}); }); } render() { const items = this.state.data.map((item) => { return <Item key={item.id} id={item.id} name={item.name} description={item.description} price={item.price} image={item.image} created_at={item.created_at} updated_at={item.updated_at}/> }); return ( <div className="App"> <Header onSubmit={keyword => this.itemsSearch(keyword)}/> <div>{items}</div> </div> ); } }

子コンポーネント:Header.js

~~~省略~~~ class Header extends Component{ constructor(props) { super(props); this.state = { } } render() { return ( <header className='Header'> <Logo/> <LogoutButton/> <SearchForm onSubmit={keyword =>this.props.itemsSearch(keyword)}/> <AddButton/> </header> ); } }

孫コンポーネント:SearchForm,js

import React, {Component} from 'react'; import SearchButton from './SearchButton'; class SearchForm extends Component { constructor(props) { super(props); this.state = { keyword: '', } } inputChange(event) { this.setState({keyword: event.target.value}); } itemSearch(event){ event.preventDefault(); this.props.onSubmit(this.state.keyword); } render() { return ( <form onSubmit={event => this.itemSearch(event)}> <input type='text' value={this.state.keyword} onChange={event => this.inputChange(event)} /> <SearchButton/> </form> ) } } export default SearchForm;

####確認したこと
・関数名の記述が間違っていないことを確認。
・孫コンポーネントではなく子コンポーネントで実行するとエラーにならないことを確認
・コンパイルはうまくいっていることを確認

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

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

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

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

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

guest

回答1

0

ベストアンサー

<Header>に対してitemsSearchを渡していないので、this.props.itemsSearchundefinedとなり、エラーとなっているものと思われます。

親コンポーネントのpropsは、子コンポーネントへ自動では引き継がれません

投稿2019/03/24 10:58

編集2019/03/24 13:26
maisumakun

総合スコア145183

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

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

bellcrud

2019/03/24 13:05

回答ありがとうございます! 申し訳ありません。 inputSearchとは一体なんなのか教えていただいてもよろしいでしょうか?
maisumakun

2019/03/24 13:25

すみません、itemsSearchの書き間違いです(回答はいま修正します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問