2015-09-09 9 views
7

私はReact Tutorialに従っていて、React.findDOMNodeの使い方に固執しました。TypeScriptでReact.findDOMNodeを使用

export class CommentForm extends React.Component<{}, {}> { 
    handleSubmit(e: React.FormEvent) { 
     e.preventDefault(); 
     console.log(React.findDOMNode(this.refs['author'])); 
    } 

    render() { 
     return <form className="commentForm" onSubmit={ e => this.handleSubmit(e) }> 
       <input type="text" placeholder="Your name" ref="author" /> 
       <input type="text" placeholder="Say something..." ref="text" /> 
       <input type="submit" value="Post" /> 
       </form>; 
    } 
} 

呼び出しconsole.log(React.findDOMNode(this.refs['author']));が私に戻って<input type="text" data-reactid=".0.2.0" placeholder="Your name"> コンソール内を与える:

は、ここに私のコードです。 しかし、入力要素の値(入力ボックスに入力したもの)を取得する方法を理解できません。

は、これまでのところ私はいくつか他の人と一緒に次のことを試してみた:インテリセンスで

React.findDOMNode(this.refs['author']).value; // "value" does not exist on type "Element" 
React.findDOMNode(this.refs['author']).getAttribute('value'); // null 
React.findDOMNode(this.refs['author']).textContent; // null 

を、私は以下を参照してくださいすることができますが、私はまだここにコールするかを把握することはできません。 enter image description here

私はDefinitedlyTypedの型定義を使用しています。 また、私はフロントエンドの開発に新しいので、多分私のアプローチは間違っています。

答えて

10

このチュートリアルは、TypeScriptではなくJavaScriptで書かれています。

しかし、私はこれを正しく行うための解決策を見つけました(OPの答えは非常に面倒です)。基本的には、チュートリアルコードから2つの変更を加える必要があります。

var author = React.findDOMNode(this.refs.author).value.trim(); 

最初の変更は、次のとおりです:参考のために、ここで私のようにこれを書いてチュートリアルからコードです

this.refs.author 

私は活字体に新たなんだ

this.refs["author"] 

になりは、実際のプロパティが前方宣言されていないオブジェクトの場合は、プロパティシンタックスよりもインデクサ構文を使用することをお勧めします。

第二に、そして最も重要なのは、

React.findDOMNode 

React.findDOMNode<HTMLInputElement> 

になりは基本的にここでは、具体的には、我々が要求している要素の種類活字体を伝える必要があります。利用可能な要素の完全なリストを見つけるには、コード補完を使用してください。私はそれがすべての内在的なコンポーネントをカバーしていると仮定します。ここで

は、コードの最後の作業、ラインである:便宜上

var author = React.findDOMNode<HTMLInputElement>(this.refs["author"]).value.trim(); 

、ここで二回findDOMNodeを呼び出す避けるために、この方法は、最初のチュートリアルに現れるポイント(少しリファクタリングまでに完了方法があります):

handleSubmit(e: React.FormEvent) { 
    e.preventDefault(); 

    var authorInput = React.findDOMNode<HTMLInputElement>(this.refs["author"]); 
    var textInput = React.findDOMNode<HTMLInputElement>(this.refs["text"]); 

    var author = authorInput.value.trim(); 
    var text = textInput.value.trim(); 

    if (!text || !author) 
     return; 

    authorInput.value = textInput.value = ""; 
} 
+0

ありがとう!私は実際に 'HTMLElement'と他のいくつかのタイプを試しましたが、うまくいきませんでした。 'value'を得るためには' HTMLInputElement'インターフェースを使わなければなりません。どのタイプが少し難しいかを知る。 –

+0

'React.findDOMNode 'を使用していて、 'findofDOMNode'が' typeof _React''に存在しません。何か案が? –

+2

自分自身に回答しています... 'react-dom'から 'ReactDOM 'を使用して' ReactDOM.findDOMNode 'が私の問題を解決しました –

-1

Reactの参考文献はこのようには機能しません。

let authorElement = this.refs.author.getDOMNode(); 
+0

こんにちは、あなたの例を試しましたが、 'getDOMNode'は' Component'にはありません。 [宣言](https://github.com/borisyankov/DefinitelyTyped/blob/master/react/react.d.ts#L134)です。私が使用していない 'ClassicComponent'には存在します。 –

+0

この質問は、JavaScriptではなくTypeScriptとしてマークされています。 tsdに含まれる.dtsファイルには、getDOMNodeメソッドは含まれていません。 – nlaq

0

EDIT:参照のDOM要素を取得するには、そのようにそれを依頼する必要がありnlaqは私の質問への答えを提供し、しかし、私は次のように読者のために役立つことができると思うので、私は意志この回答を残す。

Forms | React記事を読んだ後、私はonChangeイベントを処理することにより、値を取得することができました:

handleChange(e) { 
    e.preventDefault(); 
    console.log(e.target.value); // e.target.value gives the value in the input box 
} 

render() { 
    return <form className="commentForm" onSubmit={ e => this.handleSubmit(e) }> 
      <input type="text" onChange={ e => this.handleChange(e) } placeholder="Your name" /> 
      <input type="text" placeholder="Say something..." ref="text" /> 
      <input type="submit" value="Post" /> 
      </form>; 
} 

チュートリアルではfindDOMNodeの使用を示した理由は、私はまだ困惑しています。おそらくチュートリアルは古い方法を示していますか?私はまだReactには新しいので、もっと直感的な方法があれば教えてください。

完全な例として、this SO answerが私を助けました。

+0

私の答えをチェックしてください、それはおそらくこれを処理する適切な方法です。あなたが抱えている問題は、それが古い方法であるからではありません。なぜなら、TypeScriptはタイプ情報を正しく指定する必要があるからです。 – nlaq

0

この方法でこの問題を解決しました。

const author = (ReactDOM.findDOMNode(this.refs.author) as HTMLInputElement).value; 
+0

ようこそStackOverflow。その中のコードだけの回答は、「低品質」なので削除のフラグが立てられがちです。質問に答えるためのヘルプセクションを読んで、あなたの答えにいくつかの解説を加えることを検討してください。 – Graham

関連する問題