[英]React controlled component input value with empty string
我在下面為測試React
controlled component
input
功能編寫了一個演示。 但是似乎有一個錯誤。
class TestComponent extends React.Component{ constructor() { super(); this.state = {value: 'beef'}; this.handleValueChange = this.handleValueChange.bind(this); } handleValueChange(e) { this.setState({value: e.target.value}); } render() { return <div> <div><input type='text' value={'hello world'} onChange={this.handleValueChange}/></div> <div><input type='text' value={''} onChange={this.handleValueChange}/></div> <div><input type='text' value={this.state.value} onChange={this.handleValueChange}/></div> <div><input type='text' value={null} onChange={this.handleValueChange}/></div> <div><input type='text' value={undefined} onChange={this.handleValueChange}/></div> <hr/> <div><input type='text' defaultValue={this.state.value} onChange={this.handleValueChange}/></div> <p>{this.state.value}</p> </div> } } ReactDOM.render( <TestComponent />, document.body )
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
第一個input
具有指定的字符串值屬性。 當我鍵入內容時,調用handleValueChange
函數,結果是hello world
+ your type thing's first character
。
第二個input
具有空字符串值屬性。 當我鍵入內容時,它會調用handleValueChange
函數,但最后,它總是給我一個字符。
有點奇怪。
更新! 我添加了帶有defaultValue
的input
,與value={this.state.value}
,我的頭被弄亂了。
如您的問題下面的評論中所述:請刪除value={''}
因為這將在每次呈現輸入時清空輸入。
根據react docs ,正確的方法是
return <div>
<input type='text' value={this.state.value} onChange={this.handleValueChange}/>
<p>{this.state.value}</p>
</div>
這樣,無論何時在輸入區域中鍵入內容,都將更新狀態中設置的值。
如果要使用狀態值設置渲染組件,則可以使用:
getInitialState() {
return { value: 'Your default value'}
}
或者,如已經建議的那樣,使用defaultValue
。
在此處閱讀更多信息: https : //facebook.github.io/react/docs/forms.html
更新:
根據您更新的問題,我認為您必須了解在渲染功能期間設置值的實際作用。 只要在渲染功能期間設置一個值,就將輸入字段“鎖定”為該特定值。 意味着用戶輸入將不會對渲染的元素產生任何影響。 從文檔中: "User input will have no effect on the rendered element because React has declared the value"
。
要解決此問題,您必須將value設置為可以動態更改的值,在這種情況下,它將是value
或this.state.value
。 就像您在第三個示例中所做的那樣:
<input type='text' value={this.state.value} onChange={this.handleValueChange}/>
這樣,React接受用戶輸入提供的值,然后在此之后將更新組件的值。
我仍然認為文檔對此進行了明確說明,並且我認為您應該閱讀原始答案中提供的文檔。
更新2
要稍微清除帶有controlled
和uncontrolled
組件的零件,請執行以下操作:
controlled
組件是分配了value
屬性的組件,它將反映來自用戶輸入的value prop
( value prop
)。
雖然uncontrolled
組件沒有分配任何value
屬性,並且不會反映用戶輸入的值(因為它不提供任何value prop
)。 但是,如果要使用值實例化uncontrolled
組件,則應使用defaultValue
。
在您的情況下(因為嘗試使用CONTROLLED組件),這意味着您不應使用defaultValue
,而應堅持正確實施controlled
組件。 那是使用value={this.state.value}
。
再次,我建議閱讀提供的文檔。 如果您能夠理解文檔,實際上並不難。
希望這可以解決您的一些問題! :)
使用defaultValue
代替value
render() {
return <div>
<div><input type='text' defaultValue={'hello world'} onChange={this.handleValueChange}/></div>
<div><input type='text' defaultValue={''} onChange={this.handleValueChange}/></div>
<div><input type='text' defaultValue={this.state.value} onChange={this.handleValueChange}/></div>
<div><input type='text' defaultValue={null} onChange={this.handleValueChange}/></div>
<div><input type='text' defaultValue={undefined} onChange={this.handleValueChange}/></div>
<p>{this.state.value}</p>
</div>
}
}
這里唯一正確的controlled component
是:
<input type='text' value={this.state.value} onChange={this.handleValueChange}/>
其他人不控制。 但是,由於其他對象也正在調用setState
並更改值,因此它們會影響第三個輸入。
走着瞧吧:
e.target.value = hello world + first character you typed
調用setState
。 這將是第三個輸入的新值 setState
只有一個字符,因為該輸入的值總是''
。 所以一個字符將是第三個輸入的新值 undefined
…就像您未在其中定義任何值一樣,因此第四個輸入將不受控制,但是每次鍵入時,它將其實際值復制到第三個輸入 結論:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.