2017-11-29 6 views
0

私は反応フレームワークの初心者ですから、私の質問はあなたの多くにとって基本的に見えるかもしれません。しかし、私はこの部分に立ち往生していると私を信じてください。 私は、ボタンのクリックでテキストボックスの値を取得し、その値を他の関数に小道具として送信しようとしています。 私はtextboxフィールドの値を抽出できますが、clickイベントでは、 'プロパティを読み取れません'というプロンプト 'undefined'が表示されます。ここでReact.js onclickイベント:未定義のプロパティ 'props'を読み取ることができません

は重要なポイントである: - )

  1. termchange(テキスト入力値を抽出するために使用されます。
  2. handleclickは、テキストボックス値onclickイベントの抽出に使用されます。
  3. oncitychangeは、テキストボックス (oncitychange()関数は別のコンポーネントの内部にあります)の値を送信した関数です。

ありがとうございます。ここ

は私のコードです: -

import React,{ Component } from 'react'; 
import ReactDom from 'react-dom'; 
class SearchBar extends Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     cityname:'' 
    } 
    } 

    render(){ 
    return(
     <div> 
     <span>Enter the city: </span> 
     <input type="text" id="txtbox" value={this.state.cityname} 
      onChange={event=>this.termchange(event.target.value)} /> 
     <input type="submit" onClick={this.handleclick} /> 
     </div> 
    ); 
    } 

    termchange(cityname){ 
    this.setState({cityname}); 
    } 

    handleclick(){ 
    this.props.oncitychange(cityname); 
    } 
} 

export default SearchBar; 
+0

にタイトになりますスタイルのヒント –

+3

また、あなたのコンストラクタであなたのメソッドをバインドしようとすると、単にコンストラクタに新しい行を追加してうまくいけば、あなたの問題を解決するはずです 'this.handleclick = this.handleclick.bind(this)'と言う、問題は 'this 'あなたのコンポーネントではなくあなたのメソッドを指しているので、' this'をバインドしてあなたのcomを指すようにする必要があります代わりにポポント。クリックハンドラで状態を参照する必要があります。また、 'cityname'は' this.state.cityname'でなければなりません。状態を設定するときは 'this.setState {cityname:cityname} 'にする必要があります –

答えて

1

this.handleClick = this.handleClick.bind(this)を追加します。あなたの機能は何がthisか分からない。コンストラクタにthisをバインドすることも、環境に応じて他のオプションを簡単にすることもできます。

は、修正するために、あなたのコンストラクタにこれを追加します。

this.termchange = this.termchange.bind(this); this.handleclick = this.handleclick.bind(this);

それとも何が起こっているのより詳細な説明についてはhttps://blog.andrewray.me/react-es6-autobinding-and-createclass/をお読みください。

私は個人的にES7太鼓のクラスのメソッドを使いますが、私はほとんどの開発者がその方向に動いていると思います。

+1

' use ES7 fat arrow'で待ってください 'handleClick =()=> {}'のような意味ですか?私はそれがうまくいくかどうかは分かりませんでした。 –

+0

はい、あなたがそれを発見した後で振り返っていません –

+0

ありがとう、これは私の問題を解決するのを助けました。私のコードにあなたの部分を挿入した後、私は 'this.props.oncitychange(this.state.cityname);' handleClick()関数とその働きの下で。 –

2

は、それはすべての範囲についてですコンストラクタ

+0

これは動作しますなぜ誰かがそれを落としたのか知っている。私はそれをあなたのために0に戻しました。追加の説明は参考になりますが、それは質問 –

+0

のコメントに説明されていますが、あなたの応答はありがたいですが、うまくいきません。 'Uncaught ReferenceError:cityname is not defined'これはエラーが発生したonClickイベントです。 –

+0

あなたが 'handleClick'メソッドのスコープで宣言されていない' cityname'変数を使用しているためです。[Cory Danielson](https://stackoverflow.com/users/749622/cory-danielsonll) – SALEH

0

だけでonClick={this.handleClick}を置き換える:

onClick={this.handleClick.bind(this)} 

その方法を技術的には必須ではありませんが、関数スコープはただ、一般的にrenderメソッドが定義された最後のメソッドである必要があり、リアクトオブジェクト

+0

私はこれが正しいとは思わない、あなたがその時点でバインドするなら、 'this'は入力要素を指し示すだろうか?あなたはコンストラクタでバインドする必要があります –

+2

それは動作しますが、私はすべての再レンダリングが発生するので、非効率的だと思う。 –

+0

@ TravisWhiteええ、あなたはおそらく正しいでしょう。コンストラクタのバインドはもっと良いかもしれません。 – pablopunk

関連する問題