[解決済み】イベントハンドラ内のReactインスタンス(this)にアクセスできない【重複あり
2022-04-04 15:07:05
質問
ES6 (BabelJS)で簡単なコンポーネントを書いているのですが、関数
this.setState
が動作しない。
典型的なエラーは次のようなものです。
未定義のプロパティ 'setState' を読み取ることができません。
または
this.setStateは関数ではありません。
なぜかわかりますか?以下はそのコードです。
import React from 'react'
class SomeClass extends React.Component {
constructor(props) {
super(props)
this.state = {inputContent: 'startValue'}
}
sendContent(e) {
console.log('sending input content '+React.findDOMNode(React.refs.someref).value)
}
changeContent(e) {
this.setState({inputContent: e.target.value})
}
render() {
return (
<div>
<h4>The input form is here:</h4>
Title:
<input type="text" ref="someref" value={this.inputContent}
onChange={this.changeContent} />
<button onClick={this.sendContent}>Submit</button>
</div>
)
}
}
export default SomeClass
解決方法は?
this.changeContent
を介してコンポーネントのインスタンスにバインドする必要があります。
this.changeContent.bind(this)
として渡される前に
onChange
プロップ、さもなければ
this
は、コンポーネントのインスタンスではなく
window
. 参照
関数::バインド
.
を使用する場合
React.createClass
ES6 クラスの代わりに、コンポーネント上で定義されたすべての非ライフサイクルメソッドは、自動的にコンポーネントのインスタンスにバインドされます。参照
自動バインディング
.
関数をバインドすると、新しい関数が作成されることに注意してください。render で直接バインドすると、コンポーネントがレンダリングするたびに新しい関数が作成されます。また、コンストラクタでバインドすると、一度だけ実行されます。
constructor() {
this.changeContent = this.changeContent.bind(this);
}
対
render() {
return <input onChange={this.changeContent.bind(this)} />;
}
Refはコンポーネントのインスタンスに設定されます。
React.refs
を変更する必要があります。
React.refs.someref
から
this.refs.someref
. また
sendContent
メソッドをコンポーネントインスタンスに追加することで
this
を参照する。
関連
-
[解決済み】パッシブイベントリスナー内部でpreventDefaultができない
-
[解決済み] Uncaught TypeError: 未定義のプロパティ 'top' を読み込めない
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】Uncaught ReferenceError。Reactが定義されていない
-
[解決済み】SyntaxError: ChromeのJavascriptコンソールでUnexpected Identifierが発生する。
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] React JSX内のループ
-
[解決済み】React JSXで引用符内のpropsにアクセスする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 Uncaught TypeError: data.push is not a function
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】JavaScriptのボタンonclickが機能しない
-
[解決済み】Redux TypeError: 未定義のプロパティ 'apply' を読み取れない
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み】Vueが定義されていない
-
[解決済み] React with ES7: Uncaught TypeError: 未定義のプロパティ 'state' を読み取ることができない [重複] 。
-
[解決済み] コールバック内で正しい `this` にアクセスする方法