2015-11-30 12 views
42

私はReact.jsの最初のビットを試していて、早すぎました...私は<div id="search"></div>に検索フォームをレンダリングする以下のコードを持っています。しかし、検索ボックスに入力することは何もしません。React入力テキストフィールドに入力できません

おそらく、何かが小道具を通過して上下することがなくなり、これは一般的な問題のようです。しかし、私は困惑しています - 何が欠けているのか分かりません。あなたが入力フィールドに入力することはできませんのでvalue={whatever}を使用

var SearchFacet = React.createClass({ 
    handleChange: function() { 
    this.props.onUserInput(
     this.refs.searchStringInput.value 
    ) 
    }, 
    render: function() { 
    return (
     <div> 
     Search for: 
     <input 
      type="text" 
      value={this.props.searchString} 
      ref="searchStringInput" 
      onchange={this.handleChange} /> 
     </div> 
    ); 
    } 
}); 

var SearchTool = React.createClass({ 
    render: function() { 
    return (
     <form> 
     <SearchFacet 
      searchString={this.props.searchString} 
      onUserInput={this.props.onUserInput} 
     /> 
     <button>Search</button> 
     </form> 
    ); 
    } 
}); 

var Searcher = React.createClass({ 
    getInitialState: function() { 
    return { 
     searchString: '' 
    } 
    }, 

    handleUserInput: function(searchString) { 
    this.setState({ 
     searchString: searchString 
    }) 
    }, 

    render: function() { 
    return (
     <div> 
     <SearchTool 
      searchString={this.state.searchString} 
      onUserInput={this.handleUserInput} 
     /> 
     </div> 
    ); 
    } 
}); 

ReactDOM.render(
    <Searcher />, 
    document.getElementById('searcher') 
); 

(結局、私はSearchFacet*の他のタイプがありますが、私はこの1つだけが動作して取得しようとしている。)

+0

テキストフィールドを入力するときに 'this'を記録するようにしてください。 'this 'は' Searcher'コンポーネントではなくなっている可能性があります。 – FaureHu

+0

ありがとうFaureHu - コードのどの時点で 'this'を記録していますか? 'Searcher.handleUserInput()'や 'SearchFacet.handleChange()'からログを記録しようとしても何もしません。 –

+0

あなたは私の答えを似たような質問で見ることができます。私にはhttp://stackoverflow.com/questions/34713718/input-field-doesnt-receive-keyboard-events-when-rendering-with-value-property/36871399?noredirect=1#comment61310144_36871399 –

答えて

35

render: function() { 
    return (
    <div> 
     Search for: 
     <input 
     type="text" 
     value={this.props.searchString} 
     ref="searchStringInput" 
     onchange={this.handleChange} /> 
    </div> 
); 
} 

ではあなたは正しく onchangeプロパティを同棲していません。それは onChangeである必要があります - それを試み、今それがハンドラを呼び出すかどうかを確認してください。

更新この質問は意見をたくさん持っていると、余分なコンテキストのビットを提供すること価値があるので、:

<input>value小道具を渡すの話題、その後、何らかの形で渡された値を変更しますユーザがonChangeハンドラを使用して対話したことに応答して、the official docsでかなりよく考慮されます。

これらの入力はControlled Componentsのような入力を参照し、入力を参照して、DOMの入力値とそれに続くユーザからの変更をネイティブでUncontrolled Componentsというように変更します。

108

はそれを行います。 defaultValue="Hello!"を使用してください。

は@davnicwilが指摘するようにまた、onchangeonChangeをする必要があります

https://facebook.github.io/react/docs/uncontrolled-components.html#default-valuesを参照してください。

+1

:あなたは詳細な説明を見つけることができます要件私は入力を有効にしてフィールドを入力したいだけでなく、デフォルト値に設定する必要があるので、状態変数から来ました。 defaultValue属性は正常でしたが、状態の変更に応じてデフォルト値を更新する際に問題がありますが、デフォルト値を変更するような方法がいくつかありますか? – semira

+1

Stackoverflowの別の質問としてその問題を投稿する必要があります。 – Ivan

+1

@GeoffreyHale私はあなたが誤解を招くようなことをどういう意味かはっきりしていません。状態を使用しないこの例を参照してください:https://codepen.io/anon/pen/BQJZwr?editors=0010。または、これはそうです:https://codepen.io/anon/pen/JbMJMX?editors=0010 – Ivan

2

これは、onChange関数が入力に記載されている適切な値を更新していないために発生している可能性があります。

例のonChange関数で

<input type="text" value={this.state.textValue} onChange = {this.changeText}></input> 

changeText(event){ 
     this.setState(
      {this.state.textValue : event.target.value} 
     ); 
    } 

が挙げ値フィールドを更新します。

+0

ありがとう、非常に役立ちます。あなたの答えだけが、問題の解決方法を完全に説明しています。 – Andras

1

私も同じ問題を抱えています。私の場合、レデューサーを正しく注入しましたが、まだフィールドに入力できませんでした。 immutableを使用している場合は、redux-form/immutableを使用する必要があります。

import {reducer as formReducer} from 'redux-form/immutable'; 
const reducer = combineReducers{ 

    form: formReducer 
} 
import {Field, reduxForm} from 'redux-form/immutable'; 
/* your component */ 

あなたの状態がそうでなければ、あなたが明示的に状態の名前がformする必要がありますまた、ライブラリを設定へきstate->formのようでなければならないことに注意してください。 これを参照してくださいissue

関連する問題