React 是個單向數據流的框架,因此在表單元素與其它 DOM 元素有所不一樣,並且和雙向綁定的框架在操做上也有很大不同。因此在這裏單獨拿出來講。javascript
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
事件來完成。因此上面的案例應該是這樣的html
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> ) } }
效果預覽java
在普通 HTML 中,textarea
元素是節點文本值react
<textarea> Hello there, this is some text in a text area </textarea>
但在 React 中,該元素須要使用 value
屬性。git
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> ) } }
在普通 HTML 中, select
元素要指定默認選中值,就得在對應的option
中加上屬性selected
github
<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 type="file">
是特殊的元素,它是隻讀的,因此在 React 中須要用ref
來進行特殊處理dom
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> ) } }