表單
React 是個單向資料流的框架,所以在表單元素與其它 DOM 元素有所不同,而且和雙向繫結的框架在操作上也有很大不一樣。所以在這裡單獨拿出來說。
輸入受控
import React from `react`
import ReactDOM from `react-dom`
class Component1 extends React.Component{
constructor(props){
super(props)
this.state = {
text: `Hello React`
}
}
render(){
return (
<div>
<p><label>寫死value-鎖定狀態</label><input type="text" value="hello react"/></p>
<p><label>動態value-鎖定狀態</label><input type="text" value={this.state.text}/></p>
<p><label>不指定value-沒鎖狀態</label><input type="text"/></p>
</div>
)
}
}
ReactDOM.render(<Component1 />, document.getElementById(`div1`));
這個案例說明了在 React 在表單元素因單向資料流所以在 value 給定後就無法再次修改,所以需要配合 onChange
事件來完成。所以上面的案例應該是這樣的
class Component1 extends React.Component{
constructor(props){
super(props)
this.state = {
text: `Hello React`
}
}
change = (e) => {
this.setState({text: e.target.value})
}
render(){
return (
<div>
<p><label>寫死value-鎖定狀態</label><input type="text" value="hello react" onChange={this.change}/></p>
<p><label>動態value-沒鎖狀態</label><input type="text" value={this.state.text} onChange={this.change}/></p>
<p><label>不指定value-沒鎖狀態</label><input type="text"/></p>
</div>
)
}
}
textarea 元素
在普通 HTML 中,textarea
元素是節點文字值
<textarea>
Hello there, this is some text in a text area
</textarea>
但在 React 中,該元素需要使用 value
屬性。
class Component1 extends React.Component{
constructor(props){
super(props)
this.state = {
text: `Hello React`
}
}
change = (e) => {
this.setState({text: e.target.value})
}
render(){
return (
<div>
<textarea value={this.state.text} onChange={this.change}/>
</div>
)
}
}
select 元素
在普通 HTML 中, select
元素要指定預設選中值,就得在對應的option
中加上屬性selected
<select>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option selected value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
但在 React 中,只需要給定屬性value
即可
class Component1 extends React.Component{
constructor(props){
super(props)
this.state = {
text: `lime`
}
}
change = (e) => {
this.setState({text: e.target.value})
}
render(){
return (
<div>
<select value={this.state.text} onChange={this.change}>
<option value="grapefruit">Grapefruit</option>
<option value="lime">Lime</option>
<option value="coconut">Coconut</option>
<option value="mango">Mango</option>
</select>
</div>
)
}
}
input file 元素
因為<input type="file">
是特殊的元素,它是隻讀的,所以在 React 中需要用ref
來進行特殊處理
class Component1 extends React.Component{
submit = (e) => {
console.log(this.file.files)
}
render(){
return (
<div>
<input type=`file` ref={input => {this.file = input}}/>
<input type="button" value="submit" onClick={this.submit} />
</div>
)
}
}