React進(jìn)階(2)-上手實(shí)踐Redux,如何獲取store中的數(shù)據(jù)

前言

在前面的一文理解Redux中,已經(jīng)知道了Redux的工作流程以及Redux的設(shè)計(jì)基本原則,它就是一個(gè)用于管理組件的公共數(shù)據(jù)狀態(tài)的數(shù)據(jù)層框架,包括了Store,Reducer,React Component,Actions Creators四個(gè)部分

其中核心是Store,他們彼此之間的關(guān)系對(duì)于寫Redux是非常重要的,宏觀上講:也可以將Redux=reducer+Flux的組合,代碼就是文字描述的最佳的體現(xiàn),解釋

你將在本文學(xué)習(xí)到

  • 編寫Redux的的基本流程

  • 如何獲取store中公共的數(shù)據(jù),并展示到頁面上

  • 如何更改store的公共數(shù)據(jù),實(shí)現(xiàn)組件的數(shù)據(jù)與store的同步更新

....更多的細(xì)節(jié)見下文
下面就一起來編寫Redux代碼的,以下是最終實(shí)現(xiàn)的效果圖,添加,刪除列表操作


todolist操作,最終效果.gif

使用Ant-design布局todolist

對(duì)于初學(xué)者,一個(gè)簡(jiǎn)單的todolist例子對(duì)于入門redux是一個(gè)非常好的實(shí)踐,這就好比剛寫程序時(shí)的Hello-world的,雖然麻雀雖小,但是五脹俱全
在React中要使用Redux時(shí),必須先要在命令行終端下進(jìn)行安裝

  • 使用npm或者cnpm,yarn(使用它時(shí),需要先安裝它,然后才可以使用)進(jìn)行安裝
yarn add redux
或者
npm install --save redux

安裝完后,可以在根目錄下package.json查看到redux,如果對(duì)應(yīng)有,說明已經(jīng)安裝成功了的

yarn add antd

然后在index.js中引入樣式

import 'antd/dist/antd.css'

當(dāng)然你也可以按需加載組件的方式,具體配置可以參照官方文檔
以下是index.js代碼

import React from 'react';
import ReactDOM from 'react-dom';
import { Input, Button, List } from 'antd'; // 引入antd組件庫
import 'antd/dist/antd.css'; // 引入antd樣式

// TodoList組件
class TodoList extends React.Component {
    constructor(props){
        super(props);
        // 組件內(nèi)部的初始化狀態(tài)數(shù)據(jù)
        this.state = {
            inputValue: 'itclanCoder',  // input表單初始值
            list: ['itclanCoder', '川川', '學(xué)習(xí)Redux']         // 下方列表展示的數(shù)據(jù)
        }
    }
    render() {
        return (
            <div style={{ margin: "10px 0 0 10px"}}>
                    <div>
                        <Input value={this.state.inputValue} style={{ width:"300px",marginRight:"10px"}}  placeholder="請(qǐng)輸入內(nèi)容..." />
                        <Button type="primary">提交</Button>
                    </div>
                    <List
                      style={{ width: '300px',marginTop:'10px'}}
                      bordered
                      dataSource={this.state.list}
                      renderItem={item => <List.Item>{item}</List.Item>}/>
            </div>
        )
    }
}
const container = document.getElementById('root');

ReactDOM.render(<TodoList />, container);

最終渲染的UI效果如下所示:


展示的效果.png

在控制臺(tái)中可以多查看組件state的各個(gè)狀態(tài)的,有助于理解React的
在上面的代碼中,我們發(fā)現(xiàn)組件內(nèi)部的狀態(tài)數(shù)據(jù)是放在當(dāng)前組件的state進(jìn)行存儲(chǔ)管理的,對(duì)于這種小的demo例子,殺雞焉用宰牛刀使用Redux未免有些大才小用,但是如果組件非常的業(yè)務(wù)邏輯非常復(fù)雜,狀態(tài)特別多,那么使用Redux的優(yōu)點(diǎn)就非常明顯了的

下面引入redux,同樣能夠達(dá)到同樣的效果


深刻理解Redux工作流.png
import React from 'react';
import ReactDOM from 'react-dom';
import { Input, Button, List } from 'antd'; // 引入antd組件庫
import 'antd/dist/antd.css'; // 引入antd樣式

// 1. 創(chuàng)建一個(gè)store管理倉庫,從redux庫中引入一個(gè)createStore函數(shù)
import { createStore } from 'redux';

// 2. 引入createStore后,store并沒有創(chuàng)建,需要調(diào)用createStore()后才有store
const store = createStore(reducer); // 創(chuàng)建好reducer后,需要將reducer作為參數(shù)傳到createStore當(dāng)中去,這樣store才能拿到reducer的state數(shù)據(jù)

// 3. 創(chuàng)建reducer函數(shù),管理組件共享的數(shù)據(jù)狀態(tài)以及一些動(dòng)作
// reducer是一個(gè)純函數(shù),返回一個(gè)新的state給store
// 4. 初始化state值,將原先組件內(nèi)部的狀態(tài)的數(shù)據(jù),移除到reducer里面去管理
function reducer(state = {
    inputValue: 'itclanCoder',
    list: ['itclanCoder', '川川', '學(xué)習(xí)Redux']
}, action){
    return state;
}

// TodoList組件
class TodoList extends React.Component {
    constructor(props){
        super(props);
        // 5. 在組件內(nèi)部通過getState()方法就可以拿到store里面的數(shù)據(jù),該方法能夠獲取到store上存儲(chǔ)的所有狀態(tài)
        this.state = store.getState();
        
    }
    render() {
        return (
            <div style={{ margin: "10px 0 0 10px"}}>
                    <div>
                        <Input value={this.state.inputValue} style={{ width:"300px",marginRight:"10px"}}  placeholder="請(qǐng)輸入內(nèi)容..." />
                        <Button type="primary">提交</Button>
                    </div>
                    <List
                      style={{ width: '300px',marginTop:'10px'}}
                      bordered
                      dataSource={this.state.list}
                      renderItem={item => <List.Item>{item}</List.Item>}/>
            </div>
        )
    }
}
const container = document.getElementById('root');

ReactDOM.render(<TodoList />, container);

上面的實(shí)例代碼中,完成了將原先定義在組件內(nèi)部的狀態(tài)數(shù)據(jù)抽離到Redux中的reducer去管理,在當(dāng)前組件內(nèi)部通過getState()方法拿到state數(shù)據(jù),最終渲染到頁面上

梳理一下Redux的使用流程:

  1. 命令行終端下安裝redux第三方庫
yarn add redux
  1. 在項(xiàng)目中引入redux庫,同時(shí)創(chuàng)建一個(gè)store倉庫,這是通過調(diào)用createStore函數(shù)實(shí)現(xiàn)的
import { createStore } from 'redux';
const store = createStore();   // 調(diào)用createStore函數(shù)才會(huì)真正的創(chuàng)建一個(gè)store
  1. 創(chuàng)建reducer函數(shù),用于存儲(chǔ)公共組件的數(shù)據(jù)狀態(tài),它是一個(gè)純函數(shù),用于返回組件的狀態(tài)
/*
 reducer是一個(gè)純函數(shù),接收兩個(gè)參數(shù),state和action其中state存儲(chǔ)的就是組件的公共狀態(tài)的,而action就是組件派發(fā)的動(dòng)作,reducer的最終結(jié)果是由state和action共同決定的,后面會(huì)接著講action
*/
function reducer(state, action){
    return state
}
  1. 在reducer創(chuàng)建好之后,需要把reducer傳遞給createStore函數(shù)當(dāng)中去,這樣store就拿到了reducer里面的數(shù)據(jù),這一步是必須要做的,否則就會(huì)拿不到reducer中state的數(shù)據(jù)
const store = createStore(reducer);
  1. 組件內(nèi)如何獲取store中數(shù)據(jù),通過調(diào)用getState方法獲取store中的數(shù)據(jù),該方法能夠獲取到store上存儲(chǔ)的所有狀態(tài)
this.state = store.getState();
  1. 組件的渲染
<Input value={ this,sate,inputValue }>
<List dataSource={this.state.list} />

上面的過程:其實(shí)完成的就是Redux工作流中的右邊的內(nèi)容


Redux工作流-store創(chuàng)建與獲取.png

整個(gè)過程總結(jié)一句話就是:引入redux庫,并調(diào)用createStore函數(shù),從而創(chuàng)建了store,緊接著創(chuàng)建reducer函數(shù),用于管理組件公共的狀態(tài)數(shù)據(jù),返回組件公共數(shù)據(jù)的最新的狀態(tài)給store,然后將創(chuàng)建的reducer函數(shù)作為參數(shù),讓createStore函數(shù)接收.

進(jìn)而store就獲取到了reducer函數(shù)里面的公共存儲(chǔ)數(shù)據(jù),當(dāng)組件外部想要拿store的公共數(shù)據(jù)時(shí),于是引入store,并通過getState這個(gè)函數(shù)就可以獲取store中的數(shù)據(jù),最終可將數(shù)據(jù)渲染到頁面上

總結(jié)

本文并不是什么高大上的內(nèi)容,主要是對(duì)學(xué)習(xí)Redux的一個(gè)小小的初探

用幾句簡(jiǎn)單歸納下:組件如何獲取store中的數(shù)據(jù)

  • 安裝redux,然后從redux中引入createStore這個(gè)方法,并調(diào)用它,從而創(chuàng)建store,

  • 緊著在創(chuàng)建reducer純函數(shù),在reducer里面進(jìn)行state的邏輯操作,reducer的返回值取決于state與action這個(gè)的決定,最終該函數(shù)返回最新結(jié)果會(huì)返回給store,完成新舊數(shù)據(jù)的替換,

  • 而在組件中如何獲取store的數(shù)據(jù),是通過getState方法進(jìn)行獲取store中的所有狀態(tài)

那么如何保持頁面的組件與store數(shù)據(jù)同步更新?添加,刪除列表怎么實(shí)現(xiàn)呢?

將在下一節(jié)當(dāng)中揭示了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市采缚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件件豌,死亡現(xiàn)場(chǎng)離奇詭異筹淫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)培漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胡本,“玉大人牌柄,你說我怎么就攤上這事〔喔Γ” “怎么了珊佣?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)披粟。 經(jīng)常有香客問我咒锻,道長(zhǎng),這世上最難降的妖魔是什么守屉? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任惑艇,我火速辦了婚禮,結(jié)果婚禮上胸梆,老公的妹妹穿的比我還像新娘敦捧。我一直安慰自己,他們只是感情好碰镜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布兢卵。 她就那樣靜靜地躺著,像睡著了一般绪颖。 火紅的嫁衣襯著肌膚如雪秽荤。 梳的紋絲不亂的頭發(fā)上甜奄,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音窃款,去河邊找鬼课兄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晨继,可吹牛的內(nèi)容都是我干的烟阐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼紊扬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜒茄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐屎,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤檀葛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腹缩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屿聋,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年藏鹊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了润讥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伙判,死狀恐怖象对,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宴抚,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布甫煞,位于F島的核電站菇曲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抚吠。R本人自食惡果不足惜常潮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楷力。 院中可真熱鬧喊式,春花似錦、人聲如沸萧朝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽检柬。三九已至献联,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背里逆。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工进胯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人原押。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓胁镐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親诸衔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盯漂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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