React從零開始(4)——表單和列表

表單是前端開發(fā)中必不可少的組件拗踢,React作為前端框架会钝,如果不能處理表單,就會被億萬的前端工程師吐槽的火俄。然而React對于表單的處理犯建,還是有一些細(xì)節(jié)上的東西需要關(guān)注,接下來我們詳細(xì)的描述在React中如何使用表單組件。

為了讓頁面效果美觀一點瓜客,在頁面中引入bootstrap的css

npm install bootstrap --save

在react組件中引入外部css文件适瓦,直接可以使用import

import 'bootstrap/dist/css/bootstrap.css'

我們操作使用react,開發(fā)中最多的內(nèi)容就是操作state中的數(shù)據(jù),那么進(jìn)行表單開發(fā)谱仪,就是要將表單中的數(shù)據(jù)與state中的數(shù)據(jù)關(guān)聯(lián)起來玻熙,也就是說,當(dāng)用戶改變表單中的數(shù)據(jù)時疯攒,state中的數(shù)據(jù)也會相應(yīng)的發(fā)生修改嗦随,當(dāng)state中的數(shù)據(jù)發(fā)生了修改,form中的數(shù)據(jù)也會進(jìn)行相應(yīng)的變化敬尺。這種變化枚尼,以Angularjs的雙向綁定最為著名,然而砂吞,react并沒有使用雙向綁定姑原,而是使用了單向數(shù)據(jù)流。

單向數(shù)據(jù)流

在這里描述單向數(shù)據(jù)流呜舒,并不采用一些比較正規(guī)的說法锭汛,我所說的是在開發(fā)中的直觀感受。在前端開發(fā)過程中袭蝗,數(shù)據(jù)最終展示在頁面中唤殴,需要經(jīng)過一個渲染過程,即改變?yōu)g覽器頁面中的DOM結(jié)構(gòu)或者DOM中的內(nèi)容,從而瀏覽器進(jìn)行了解析渲染哪轿,如果要開發(fā)人員手動寫原生的JS代碼操作DOM稚虎,在開發(fā)復(fù)雜應(yīng)用時,那將是一個極其痛苦的過程配名。單向數(shù)據(jù)流的作用就是,當(dāng)內(nèi)存中的數(shù)據(jù)發(fā)生變化時晋辆,在頁面的相應(yīng)位置上渠脉,會自動的渲染這些數(shù)據(jù),這就意味著開發(fā)人員不再寫DOM操作的代碼瓶佳。

所謂單向數(shù)據(jù)流芋膘,意味著數(shù)據(jù)從一個地方流向另一個地方,即從瀏覽器內(nèi)存頁面DOM樹

單向數(shù)據(jù)流

這就是react的強(qiáng)大之處,同時也是其短板之處为朋,從內(nèi)存到DOM臂拓,可以自動渲染,但是從DOM到內(nèi)存习寸,就需要開發(fā)人員手動處理胶惰。

創(chuàng)建表單

import React from 'react';
import 'bootstrap/dist/css/bootstrap.css'

class App extends React.Component{


    constructor(props){
        super(props);
        this.state = {
            name:''
        };
    }
    render(){
        return (
            <div className="container" style={{marginTop:'20px'}}>
                <div className="row">
                    <div className="col-md-5">
                        <form className="form-horizontal">
                            <div className="form-group">
                                <label className="col-sm-2 control-label">用戶名</label>
                                <div className="col-sm-10">
                                    <input type="email" className="form-control" id="name" name="name" placeholder="用戶名" />
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        );
    }
}

export default App;

此時的表單中,其內(nèi)部數(shù)據(jù)的狀態(tài)由其自身維持霞溪,當(dāng)用戶在表單中進(jìn)行輸入時童番,表單的數(shù)據(jù)狀態(tài)發(fā)生了變化,但是state中的狀態(tài)仍然保持原狀態(tài)威鹿,React只對表單組件進(jìn)行了渲染剃斧,但并未控制其后續(xù)輸入的變化,我們稱此時的表單組件為非受控組件忽你。

讓React渲染表單組件幼东,組件中的值由React賦予,并控制其因用戶輸入所帶來的變化科雳,即讓表單組件成為受控組件

  1. 表單組件的value值由React進(jìn)行初始化
<input type="text" className="form-control" id="name" value={this.state.name} name="name" placeholder="用戶名" onChange={this.handleChange}/>
  1. 監(jiān)聽組件change事件根蟹,將其變化的值修改保存到state中
handleChange = (event) =>{
    this.setState({
        [event.target.name]:event.target.value
    });
}

對于text,textarea,上述的方式均可糟秘,radio由于是單選简逮,所以仍舊可以按照text的方式進(jìn)行處理,但是對于checkbox尿赚,就需要做特殊的處理了

    <div className="form-group">
        <label className="col-sm-2 control-label">愛好</label>
        <div className="col-sm-10">
            <div className="checkbox">
                <label>
                    <input type="checkbox" name="hobby" value="1"/>音樂
                </label>
            </div>
            <div className="checkbox">
                <label>
                    <input type="checkbox" name="hobby" value="2"/>美術(shù)
                </label>
            </div>
            <div className="checkbox">
                <label>
                    <input type="checkbox" name="hobby" value="3"/>體操
                </label>
            </div>
        </div>
    </div>

checkbox組件為多選散庶,所以,state中就需要使用數(shù)組來存儲數(shù)據(jù)

  1. 使用onChange事件控制組件
  2. 修改state屬性凌净,要根據(jù)組件的checked屬性來判斷
    3.設(shè)置組件中的checked的值悲龟,需要根據(jù)state中的數(shù)據(jù)進(jìn)行判斷
  • 初始化state
    constructor(props){
        super(props);
        this.state = {
            music:false,
            draw:false,
            gymnastics:false
        };
    }
  • 為組件綁定onChange并對其checked進(jìn)行判斷
    <div className="form-group">
    <label className="col-sm-2 control-label">愛好</label>
    <div className="col-sm-10">
        <div className="checkbox">
            <label>
                <input type="checkbox" name="music" checked={this.state.music} onChange={this.handleChange}/>音樂
            </label>
        </div>
        <div className="checkbox">
            <label>
                <input type="checkbox" name="draw" checked={this.state.draw} onChange={this.handleChange}/>美術(shù)
            </label>
        </div>
        <div className="checkbox">
            <label>
                <input type="checkbox" name="gymnastics" checked={this.state.gymnastics} onChange={this.handleChange}/>體操
            </label>
        </div>
    </div>
</div>
  • 在onChange函數(shù)中進(jìn)行數(shù)據(jù)處理
    handleChange = (event) =>{
        var temp = {
            [event.target.name]:event.target.checked
        };
        this.setState(temp);
    }

列表

現(xiàn)在業(yè)內(nèi)流行的前端框架對于列表循環(huán)的支持,可以說是解放了廣大 前端開發(fā)人員冰寻,從前的jquery瘋狂拼接字符串须教,到后來使用一些插件,而現(xiàn)在斩芭,一切變得很簡單
1.定義一組數(shù)組

const users = [{
    id:1,
    name:'張三',
    age:10
},{
    id:2,
    name:'李四',
    age:10
},{
    id:3,
    name:'王五',
    age:10
},{
    id:4,
    name:'趙六',
    age:10
}];

2.在render函數(shù)中首先根據(jù)數(shù)組生成列表組件

const tbodys = users.map((user)=>{
            return (
                <tr key={user.id}>
                    <td>{user.id}</td>
                    <td>{user.name}</td>
                    <td>{user.age}</td>
                </tr>
            )
   });

tbodys就是一個我們需要的列表組件轻腺,然后將其添加到render函數(shù)中返回的結(jié)構(gòu)中

return (
            <div className="container" style={{marginTop:'30px'}}>
                <div className="row">
                    <div className="col-md-8 col-md-offset-2">
                        <table className="table table-bordered">
                            <thead>
                                <tr>
                                  <th>id</th>
                                  <th>名稱</th>
                                  <th>年齡</th>
                                </tr>
                              </thead>
                              <tbody>
                                {tbodys}
                              </tbody>
                        </table>
                    </div>
                </div>

            </div>
        );

此時就得到一個完美的列表

列表

返回值得結(jié)構(gòu)中的組件與前面使用map函數(shù)的遍歷結(jié)構(gòu)是等價的,因此划乖,我們可以直接JSX中使用map函數(shù)遍歷

render() {
        return (
            <div className="container" style={{marginTop:'30px'}}>
                <div className="row">
                    <div className="col-md-8 col-md-offset-2">
                        <table className="table table-bordered">
                            <thead>
                                <tr>
                                  <th>id</th>
                                  <th>名稱</th>
                                  <th>年齡</th>
                                </tr>
                              </thead>
                              <tbody>
                                {

                                    users.map((user)=>{
                                        return (
                                            <tr key={user.id}>
                                                <td>{user.id}</td>
                                                <td>{user.name}</td>
                                                <td>{user.age}</td>
                                            </tr>
                                        )
                                    })
                                }
                              </tbody>
                        </table>
                    </div>
                </div>

            </div>
        );
    }

寫到這里呢贬养,React從零開始系 學(xué)習(xí)的系列就要結(jié)束了

之后我要重新回歸java的學(xué)習(xí)中了!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迁筛,一起剝皮案震驚了整個濱河市煤蚌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌细卧,老刑警劉巖尉桩,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贪庙,居然都是意外死亡蜘犁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門止邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來这橙,“玉大人,你說我怎么就攤上這事导披∏” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵撩匕,是天一觀的道長鹰晨。 經(jīng)常有香客問我,道長止毕,這世上最難降的妖魔是什么模蜡? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮扁凛,結(jié)果婚禮上忍疾,老公的妹妹穿的比我還像新娘。我一直安慰自己谨朝,他們只是感情好卤妒,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著字币,像睡著了一般荚孵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纬朝,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天收叶,我揣著相機(jī)與錄音,去河邊找鬼共苛。 笑死判没,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隅茎。 我是一名探鬼主播澄峰,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辟犀!你這毒婦竟也來了俏竞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魂毁,沒想到半個月后玻佩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡席楚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年咬崔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦秩。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡垮斯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出只祠,到底是詐尸還是另有隱情兜蠕,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布抛寝,位于F島的核電站牺氨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏墩剖。R本人自食惡果不足惜猴凹,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岭皂。 院中可真熱鬧郊霎,春花似錦、人聲如沸爷绘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土至。三九已至购对,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陶因,已是汗流浹背骡苞。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留楷扬,地道東北人解幽。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像烘苹,于是被迫代替她去往敵國和親躲株。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南镣衡,這只是我在學(xué)習(xí)過程中的一些閱讀筆記霜定,個人覺得該教程講解深入淺出档悠,比目前大...
    leonaxiong閱讀 2,813評論 1 18
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 原文地址:CSS clear both清除浮動 DIV+CSS clear both清除產(chǎn)生浮動我們知道有時使用了...
    LOOK_LOOK閱讀 873評論 0 3
  • 今天已經(jīng)完成任務(wù)但還沒來的及發(fā)給他們看,誰知道手機(jī)竟然沒信號望浩,想在宿舍用WIFI發(fā)辖所,不巧的是停電了。這些情況的罪魁...
    承思而行閱讀 187評論 0 0
  • 第一次見到她的時候曾雕,她正咬牙切齒的呵斥一個男人奴烙,惡狠狠的短悍樣子把我嚇呆了助被,我不敢呼吸剖张,懦懦的移走,生怕被殃及揩环。 ...
    魚麗枝閱讀 305評論 0 0