2016-11-10 39 views
0

這裏的一個SSCCE來說明我的問題:爲什麼ReactJS會抑制<input>元素的變化,但不會在例如<select>元件

const React = require('react'); 

const App = React.createClass({ 
    getInitialState: function() { 
     return { 
      text: 'foo', 
      selection: 'apples' 
     }; 
    } 
    , render: function() { 
     return (
      <div> 
       <div>     
        <input type='text' value={this.state.text}/> 
       </div> 
       <select> 
        <option value='bananas' selected={this.state.selection==='bananas'}>bananas</option>     
        <option value='apples' selected={this.state.selection==='apples'} >apples </option>      
        <option value='onions' selected={this.state.selection==='onions'} >onions </option>     
       </select> 
      </div> 
     ); 
    } 
}); 

呈現時將上述陣營部件,顯示器(不出所料)以下觀點:

enter image description here

該模型考慮到如預期。

當您嘗試鍵入<input>元素時,什麼都不會發生。解釋是ReactJS使用單向流程,並且您必須添加onchange監聽器來更新模型等。這很好。

我不明白的是爲什麼ReactJS防止<input>元素更改,並迫使其始終反映向下流動到它的模型值,而在同一時間,它可以讓我改變<select>元素:

enter image description here

enter image description here

顯然,我的心智模式是缺乏。我錯過了什麼?

回答

1

你在這裏什麼是控制<input>元素和不受控制<select>元素。請參閱controlled components

它可能通過未指定value prop來創建不受控制的文本輸入。

通過指定value prop可以創建受控的select元素。

<select value={this.state.value}> 
    <option value="bannanas">bananas</option> 
    <option value="apples">apples</option> 
    <option value="onions">onions</option> 
</select> 

有具體解釋這個的文件。請參閱here

+0

您鏈接的頁面描述了在'select'元素中使用'value'屬性(與在'option'選項元素中使用'selected'屬性相反)它「更方便[..],因爲你只需要在一個地方更新它」。沒有解釋或指示你的答案建議的事實,在'select'元素中硬編碼'value'屬性會創建一個受控組件,而在'option'元素中'selected'屬性的硬編碼則不會。 –

4

你很難編碼valuethis.state.text,所以它在每次擊鍵時總是相同的。請參閱forms documentation

+0

同理,我也對'option'元素中的'selected'屬性進行了硬編碼。您鏈接的頁面僅包含一個input元素的受控組件的定義:'一個輸入表單元素,其值由React以這種方式控制的稱爲「受控組件」。我應該從上面理解'value '屬性是特殊的,當用在任何組件中(而不僅僅是'input')使它成爲一個「受控」組件?措辭不是很清楚,並且幾乎是圓形的(「React控制其值的元素是一個受控組件」) –

+0

React設置select值的正確方法是'