React 教程第七篇 —— 表單

表單

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

textarea 元素

在普通 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>
        )        
    }
}

select 元素

在普通 HTML 中, select元素要指定默認選中值,就得在對應的option中加上屬性selectedgithub

<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來進行特殊處理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>
        )        
    }
}
相關文章
相關標籤/搜索