React從零開始(2)——一個(gè)詳細(xì)的范例

范例說明

接下來我們要通過一個(gè)簡(jiǎn)單的案例覆劈,詳細(xì)的學(xué)習(xí)React的內(nèi)容


1-1

如上圖所示,兩個(gè)按鈕沛励,點(diǎn)擊加號(hào)按鈕责语,數(shù)字加一,點(diǎn)擊減號(hào)按鈕侯勉,數(shù)字減一

代碼結(jié)構(gòu)

使用create-react-app創(chuàng)建一個(gè)工程,將其中的代碼結(jié)構(gòu)刪減到最簡(jiǎn)單的模式

1-2

修改index.js

index.js中的代碼就很簡(jiǎn)單了铝阐,只要引入App組件址貌,執(zhí)行渲染即可

import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App'

ReactDOM.render(<App/>, document.getElementById('root'));

組件的基本內(nèi)容

App.js中的內(nèi)容才是我們要真正實(shí)現(xiàn)的邏輯,我們將使用ES6的方式創(chuàng)建一個(gè)React的組件,步驟如下

  1. 引入react
import React from 'react'

2.創(chuàng)建組件徘键,并讓組件繼承React.Component,同時(shí)實(shí)現(xiàn)render函數(shù)

class App extends React.Component{

    render(){
        return (
            <div>

            </div>
        )
    }
}

3.為組件指定默認(rèn)輸出

export default App

完整代碼如下:

import React from 'react';

class App extends React.Component{

    render(){
        return (
            <div>

            </div>
        )
    }
}

export default App;
  • React.Component是react的一個(gè)抽象基類练对,單獨(dú)引用它毫無意義,我們通常用其來實(shí)現(xiàn)子類吹害,實(shí)現(xiàn)子類的時(shí)候必須要實(shí)現(xiàn)其render函數(shù)
  • render函數(shù)的所用是返回組件的內(nèi)容螟凭,而渲染的過程是有 react框架來完成的,在return()中只能有一個(gè)頂級(jí)的標(biāo)簽元素
  • export default指定了當(dāng)前組件輸出的默認(rèn)模塊

功能實(shí)現(xiàn)

范例中的內(nèi)容可分為四個(gè)部分

1.加號(hào)按鈕
2.減號(hào)按鈕
3.簡(jiǎn)單文本
4.鼠標(biāo)點(diǎn)擊按鈕變化的數(shù)字

其中按鈕和文本都非常簡(jiǎn)單它呀,但是數(shù)字需要鼠標(biāo)點(diǎn)擊進(jìn)行改變的螺男,假如我們沒有學(xué)習(xí)過任何的前端框架棒厘,我們就要使用document對(duì)象,獲取頁面的內(nèi)容下隧,然后將其裝換為數(shù)字奢人,再對(duì)數(shù)字進(jìn)行計(jì)劃,然后將計(jì)算結(jié)果寫入頁面淆院。而使用react來實(shí)現(xiàn)何乎,我們需要知道,react的核心目標(biāo) 組件化土辩,組件中可變換的內(nèi)容稱之為狀態(tài)

組件中的數(shù)據(jù)來源有兩種支救,內(nèi)部聲明外部傳入,分別用state和prop進(jìn)行區(qū)別和表示拷淘,在es6組件中各墨,可以通過constructor構(gòu)造函數(shù)中接收外部傳來的prop和聲明內(nèi)部使用的狀態(tài)數(shù)據(jù),在本文的范例中辕棚,我們需要用到一個(gè)在鼠標(biāo)點(diǎn)擊后不斷變化的數(shù)字

constructor(props){
    super(props);
    this.state = {
        count:0
    }
}

我們已經(jīng)聲明了內(nèi)部狀態(tài)欲主,并接收了外部傳入的數(shù)組,下面我實(shí)現(xiàn)頁面的展示內(nèi)容,即實(shí)現(xiàn)render函數(shù)中的內(nèi)容

    render(){
        return (
            <div>
                <button>+</button>
                <button>+</button>
                <span>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span>{this.state.count}</span>
            </div>
        )
    }
1-3

渲染效果如圖1-3所示

內(nèi)容美化

從頁面效果來看逝嚎,各個(gè)元素緊靠在一起扁瓢,不太好看,我們通過簡(jiǎn)單的css對(duì)其進(jìn)行美化补君,要達(dá)到的目標(biāo)是:

  • 整個(gè)內(nèi)容增加上邊距和左邊距
  • 按鈕引几、文本、數(shù)字相互之間有一定的間距

在react中挽铁,使用css的方式與傳統(tǒng)的方式有不同的地方

  • 引入外部樣式文件
    新建style/App.css
.box{
    margin-left: 50px;
    margin-top: 50px;
}
.box *{
    margin:auto 5px;
}

在App.js引入這個(gè)css文件

import '../style/App.css'

在這里要值得注意的是伟桅,在react中,class屬性要寫成className叽掘,因?yàn)閏lass是 JavaScript 的保留字

    render(){
        return (
            <div className="box">
                <button>+</button>
                <button>-</button>
                <span>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span>{this.state.count}</span>
            </div>
        )
    }
1-4
  • 使用JavaScript對(duì)象來聲明樣式
    render(){
        const style={
            marginLeft:'50px',
            marginTop:'50px'
        }
        const item = {
            margin:'auto 5px'
        }
        return (
            <div style={style}>
                <button style={item}>+</button>
                <button style={item}>-</button>
                <span style={item}>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span style={item}>{this.state.count}</span>
            </div>
        )
    }

運(yùn)行效果與圖1-4一樣

使用對(duì)象聲明樣式時(shí)楣铁,要使用camelCase,也就是駝峰式命名法

  • 將樣式對(duì)象直接寫到html中
    render(){
        return (
            <div style={{marginLeft:'50px',marginTop:'50px'}}>
                <button style={{margin:'auto 5px'}}>+</button>
                <button style={{margin:'auto 5px'}}>-</button>
                <span style={{margin:'auto 5px'}}>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span style={{margin:'auto 5px'}}>{this.state.count}</span>
            </div>
        )
    }

可以看到更扁,style屬性中的內(nèi)容使用了兩層大括號(hào)盖腕,其中外層的大括號(hào)是React表達(dá)式,內(nèi)層的大括號(hào)是JavaScript對(duì)象

上述三種css的書寫方式的效果是一樣的浓镜,在后續(xù)的范例中溃列,為了讓代碼簡(jiǎn)單直觀,采用引入外部css文件的方式

按鈕事件

接下來為兩個(gè)按鈕增加點(diǎn)擊事件膛薛,react中的點(diǎn)擊事件為onClick听隐,它與html中的onclick有一些區(qū)別,在這里不進(jìn)行詳細(xì)描述哄啄。我們?yōu)榧犹?hào)按鈕增加事件處理函數(shù)increment雅任,為減號(hào)增加事件處理函數(shù)decrement风范。在increment,讓state中的count的值加1,在decrement中,讓state中count的值減1

注意點(diǎn):

事件函數(shù)綁定this
修改state的方式

import React from 'react';
import '../style/App.css'

class App extends React.Component{

    constructor(props){
        super(props);
        this.state = {
            count:0
        }
        this.increment = this.increment.bind(this);
        this.decrement = this.decrement.bind(this);
    }

    increment(){
        this.setState({count:this.state.count+1})
    }

    decrement(){
        this.setState({count:this.state.count-1})
    }

    render(){
        return (
            <div className="box">
                <button onClick={this.increment}>+</button>
                <button onClick={this.decrement}>-</button>
                <span>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span>{this.state.count}</span>
            </div>
        )
    }
}

export default App;

  • 修改state中的數(shù)據(jù)椿访,要調(diào)用setState函數(shù)來進(jìn)行設(shè)置
  • 定義普通的的函數(shù)來處理事件乌企,需要在構(gòu)造函數(shù)中與this進(jìn)行綁定,否則在函數(shù)內(nèi)部成玫,thisundefined

此時(shí)我們?cè)陧撁纥c(diǎn)擊按鈕加酵,就能看到效果了

讓綁定this的方式完美一些

在上面的代碼中,我們可以看到哭当,事件處理函數(shù)要在構(gòu)造函數(shù)中調(diào)用bind函數(shù)來綁定this猪腕,在這里我們只有兩個(gè)函數(shù),在復(fù)雜引用中可能有更多的函數(shù)钦勘,要是每一個(gè)函數(shù)都要這么綁定一次陋葡,對(duì)于有強(qiáng)迫癥或者潔癖的開發(fā)人員來說是一件非常鬧心且痛苦的事情。因此我們要使用更加簡(jiǎn)潔的方式

請(qǐng)看代碼

import React from 'react';
import '../style/App.css'

class App extends React.Component{

    constructor(props){
        super(props);
        this.state = {
            count:0
        }

    }

    increment  = () => {
        this.setState({count:this.state.count+1})
    }

    decrement = () => {
        this.setState({count:this.state.count-1})
    }

    render(){
        return (
            <div className="box">
                <button onClick={this.increment}>+</button>
                <button onClick={this.decrement}>-</button>
                <span>當(dāng)前點(diǎn)擊次數(shù)</span>
                <span>{this.state.count}</span>
            </div>
        )
    }
}

export default App;

點(diǎn)擊按鈕效果完全一樣彻采,整個(gè)世界都干凈了腐缤!

從外部傳入數(shù)據(jù)

在前面我們說到,props是用來從外部傳遞數(shù)據(jù)的肛响,那么它是如何傳遞的呢岭粤?

在index.js中我們?yōu)锳pp標(biāo)簽添加屬性name

ReactDOM.render(<App name="當(dāng)前點(diǎn)擊次數(shù)"/>, document.getElementById('root'));

然后修改App.js中的render函數(shù)

    render(){
        return (
            <div className="box">
                <button onClick={this.increment}>+</button>
                <button onClick={this.decrement}>-</button>
                <span>{this.props.name}</span>
                <span>{this.state.count}</span>
            </div>
        )
    }

運(yùn)行效果與之前是一樣的!

到這里呢特笋,這個(gè)簡(jiǎn)單而又覆蓋到react的大部分內(nèi)容的范例就說完了剃浇!上手試試,其實(shí)很簡(jiǎn)單的猎物!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虎囚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蔫磨,更是在濱河造成了極大的恐慌淘讥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤如,死亡現(xiàn)場(chǎng)離奇詭異蒲列,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煤惩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嫉嘀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼邀,“玉大人魄揉,你說我怎么就攤上這事∈媚” “怎么了洛退?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瓣俯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我兵怯,道長(zhǎng)彩匕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任媒区,我火速辦了婚禮驼仪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袜漩。我一直安慰自己绪爸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布宙攻。 她就那樣靜靜地躺著奠货,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座掘。 梳的紋絲不亂的頭發(fā)上递惋,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音溢陪,去河邊找鬼萍虽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嬉愧,可吹牛的內(nèi)容都是我干的贩挣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼没酣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼王财!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裕便,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤绒净,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后偿衰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挂疆,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年下翎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤言。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡视事,死狀恐怖胆萧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俐东,我是刑警寧澤跌穗,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布订晌,位于F島的核電站,受9級(jí)特大地震影響蚌吸,放射性物質(zhì)發(fā)生泄漏锈拨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一羹唠、第九天 我趴在偏房一處隱蔽的房頂上張望奕枢。 院中可真熱鬧,春花似錦佩微、人聲如沸验辞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跌造。三九已至,卻和暖如春族购,著一層夾襖步出監(jiān)牢的瞬間壳贪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工寝杖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留违施,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓瑟幕,卻偏偏與公主長(zhǎng)得像磕蒲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子只盹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南辣往,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出殖卑,比目前大...
    leonaxiong閱讀 2,835評(píng)論 1 18
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,140評(píng)論 25 707
  • 項(xiàng)目地址 從頭開始建立一個(gè)React App - 項(xiàng)目基本配置 npm init 生成 package.json ...
    瘦人假嚕嚕閱讀 89,533評(píng)論 33 78
  • 勵(lì)志小故事:樂觀者與悲觀者 父親欲對(duì)一對(duì)孿生兄弟作性格改造站削,因?yàn)槠渲幸粋€(gè)過分樂觀,而另一個(gè)則過分悲觀孵稽。一天许起,他買了...
    藝趣書苑閱讀 1,842評(píng)論 0 1
  • 最美不過四月天,恰逢天清氣朗菩鲜,邀上幾位好友孩子們驅(qū)車前來感受龍井水庫(kù)風(fēng)釆园细。湖水一波萬頃,卻也不曾見識(shí)過如此靜謐秀麗...
    小房子梅子姐姐閱讀 1,523評(píng)論 0 2