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

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

新規登録して質問してみよう
ただいま回答率
85.49%
React.js

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

Q&A

解決済

1回答

11790閲覧

Reactのイベントが発火しない

susiyaki

総合スコア39

React.js

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

0グッド

0クリップ

投稿2019/06/09 17:00

編集2019/06/10 08:58

問題点

onClickイベントでinputのvalueを取得し、stateを更新したいが、onClickイベントが発火しない

実際のコード

export default class SeartchInput extends React.Component { constructor(props) { super(props); this.state = { textValue: 'ini' }; } changeText(e) { console.log('called') console.log(this.state.textValue) this.setState({textValue: this.refs.inputText.value}) this.refs.inputText.value = '' } render() { return ( <Wrapper> <Flex justify="center"> <Input width="150px" height="25px" placeholder="キーワード検索..." type="text" ref="inputText" /> {this.state.textValue} <SearchBtn type="submit" onClick={() => this.changeText()} /> </Flex> </Wrapper> ) } }

試したこと

とりあえずイベントが発火しているか試すために、

onClick={() => alert('clicked')}

なども試しましたが、動いていませんでした。
また、input内でonChengeを試しましたが、そちらも発火しませんでした。

SearchBtn.js.jsx

1import styled, { css } from "styled-components"; 2import React from 'react' 3 4import { BtnIcon } from '../Atoms/Icon.js.jsx' 5import { Text } from '../Utils/Text.js' 6import { Flex } from '../Utils/Flex.js' 7 8import Color from '../const/Color.js' 9import Size from '../const/Size.js' 10 11export class SearchBtn extends React.Component { 12 render () { 13 return ( 14 <Wrapper> 15 <Flex hs="100%" align="center" justify="center"> 16 <BtnIcon url="SEARCH" type /> 17 </Flex> 18 </Wrapper> 19 ) 20 } 21} 22...略... 23 24const Wrapper = styled.div` 25 height: 14px 26 width: 30px; 27 padding: 5px; 28 background-color: ${ Color.MAIN }; 29 border: 1px solid ${ Color.MAIN_SHADOW }; 30 cursor: pointer; 31 border-radius: 4px; 32 border-bottom: 3px solid ${ Color.MAIN_SHADOW }; 33 34 &:active { 35 transform: translateY(2px); 36 border-bottom: 1px solid ${ Color.SUB1 }; 37 } 38` 39...略...

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

以下のように、constructor の中で this.changeText = this.changeText.bind(this); を追加してみるといかがでしょうか?

修正前:

javascript

1constructor(props) { 2 super(props); 3 this.state = { 4 textValue: 'ini' 5 }; 6}

修正後:

javascript

1constructor(props) { 2 super(props); 3 this.state = { 4 textValue: 'ini' 5 }; 6 7 this.changeText = this.changeText.bind(this); // この行を追加 8}

追記

ご質問に追記いただきました SearchBtn を拝読しましたが、SeartchInput 側で

jsx

1<SearchBtn 2 type="submit" 3 onClick={() => this.changeText()} 4/>

として渡している2つの props 、 typeonClick が、 SearchBtn で使われていないようです。渡された onClickを使っていなければ、ボタンをクリックしても何も起きないです。

理解の確認のために、これらの props を受け取って反映させる簡単なボタン SimpleBtn を作るとすれば、例えば以下のようになるかと思います。(※state不要なコンポーネントなので、Functional Component として書くべきところですが、説明のため、Class Component で書きます)

SimpleBtn.jsx

jsx

1import React from 'react' 2 3class SimpleBtn extends React.Component { 4 render() { 5 const { type, onClick } = this.props; 6 return ( 7 <button type={type} onClick={onClick}> 8 検索 9 </button> 10 ); 11 } 12} 13 14export default SimpleBtn;

上記のような SimpleBtn を作って SeartchInput の中で SearchBtn の替わりに、

jsx

1<SimpleBtn 2 type="button" 3 onClick={() => this.changeText()} 4/>

とすれば、SimpleBtn がrender されたことによる [検索] ボタンをクリックすれば、SeartchInput から onClick として渡した、 changeText が呼ばれると思います。

上記の SimpleBtnonClick に設定されたイベントハンドラが呼ばれることを確認した後、SearchBtn でも同様に、 onClickthis.props から取得して、それを、しかるべきコンポーネント、(詳しくいえば、Wrapper, Flex, BtnIcon のいずれか)に渡すようにすればよいかと思います。

注意すべきことはSeartchInput から渡された onClick が、子コンポーネントに引き継がれていって、最終的には、どこかの HTML要素がクリックされたときのハンドラに設定されることになっているか、という点を点検するとよいかと思います。

投稿2019/06/09 23:41

編集2019/06/10 10:14
jun68ykt

総合スコア9058

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

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

susiyaki

2019/06/10 07:46

こんにちは 回答有り難うございます。 そちらも試してみたのですが、イベント発火しませんでした。
jun68ykt

2019/06/10 08:13

なるほどです。それでは SearchBtn のソースコードも、ご質問のほうに追記いただけますでしょうか?
susiyaki

2019/06/10 08:58

追記しました。 よろしくおねがいします
jun68ykt

2019/06/10 10:06

ありがとうございます。 回答のほうに追記しました。ご一読頂きさらなる不明点あればまたコメントからお知らせください。
susiyaki

2019/06/10 11:08

ありがとうございます! onClickはpropsと別物だと考えていたため動くと勘違いしていました... propsで受け継いで、bindした関数を呼び出すという感じなのですね。 また、stateのありなし関係なくすべてFunctional Componentを使わず書いていたので、そこも変更していこうと思います
jun68ykt

2019/06/10 11:11

どういたしまして。解決されたようで、よかったです ????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問