D2 --- project 顯示界面

D2

Fixed Bugs

昨天我就說邊距怎么那么難調(diào)蛹疯,今天發(fā)現(xiàn)了木人,App.js<Main />要放在<Content>里。


主要內(nèi)容

  • projects-project 顯示頁面
  • react-redux 入門

地址


React-Redux

即使官方文檔說到Redux,總是說由action、store和component組成的MVC模型镀首,但在我看到過
一些人的實(shí)現(xiàn)后,我的理解應(yīng)該是以下五部分:

component - api - action - reduce -store 

邏輯是這樣的:component的用戶處得到一個事件鼠次,調(diào)用API的函數(shù)產(chǎn)生一個action對象更哄,reducer
根據(jù)當(dāng)前store的狀態(tài)和action對象計(jì)算一個新的狀態(tài)給store芋齿,store再為component提供數(shù)據(jù)

安裝

npm install redux react-redux 

Projects

Reducer

我個人理解吧,reduce 就是連接store和action的中間部分成翩,從action中獲取類型和參數(shù)觅捆、
從store里獲取狀態(tài),根據(jù)這些信息計(jì)算下一個狀態(tài)麻敌,再提供給store.

所以所謂reduce其實(shí)就是一個函數(shù)栅炒,函數(shù)體是一個switch函數(shù),大概像:


export default function(state, action) {
    switch(state) {
        case : 
            return action.payload;
        ...
        default : 
            return state;
    }
}

Store

store就更簡單了术羔,獲取一個reduce赢赊,用redux自己的組件包裝一下,像 :

import projectsReducer from  '../reducers/projectsReducer';

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';

export default createStore(projectsReducer, applyMiddleware(thunk));

Action

action也是單純的像邏輯一樣的東西级历,會export一系列的函數(shù)释移,這些函數(shù)產(chǎn)生一個action對象,
提供給reduce寥殖。type基本就是增刪查改玩讳,payload就是看你覺得你的reduce在計(jì)算下一個狀態(tài)的時候需要哪些東西了。

比如:


export const fetchProjectsBegin = () => ({
    type : FETCH_PROJECTS,
});

export const fetchProjectsSuccess = (projects) => ({
    type : FETCH_PROJECTS_SUCCESS,
    payload : {
        projects : projects
    }
});

export const fetchProjectsError = (error) => ({
    type : FETCH_PROJECTS_ERROR,
    payload : {
        projects : error
    }
});

API

API是真的要做點(diǎn)什么了嚼贡,基本就是用來跟component交互的熏纯,component調(diào)用(dispatch)某個函數(shù),函數(shù)根據(jù)component給的參數(shù)做些什么(可能跟后端交互编曼、可能生成新的參數(shù))豆巨,然后產(chǎn)生一個action,類似:

export function fetchProjects() {
    return dispatch => {
      dispatch(fetchProjectsBegin());   /* 產(chǎn)生一個action */
      return fetch(`${API_URL}`,{headers : API_HEADERS})
        .then(handleErrors)         /* 拋出異常掐场,讓catch捕獲 */
        .then(res => res.json())    /* 把得到的數(shù)據(jù)轉(zhuǎn)成json對象 */
        .then(res => {
          dispatch(fetchProjectsSuccess(res));  /* 產(chǎn)生一個action */
        })
        .catch(error => dispatch(fetchProjectsError(error)));   /* 產(chǎn)生一個action */
    };
}

Component

組件是兩層的往扔,每個組件先有一個container用來連接store吆录,內(nèi)部組件使用container提供的數(shù)據(jù)奈偏。container就一個組件

<Provider store={projectStore}>
    <Projects />
</Provider>

然后組件里使用connect連接到store。

const mapStateToProps = (state) => {
    return {projects: state};       /* 把state映射到props里 */
};
  
export default connect(
    mapStateToProps
)( Projects );          /* 連接store和component */

注:其實(shí)還有一個mapStateToDispatch擅羞,但我不會用嚷堡。

我不想貼太多代碼蝗罗,Projects的html代碼還是用react-mdl的一些組件湊的,可以再源代碼自取蝌戒。至此串塑,projects頁面就已經(jīng)寫好了。

效果

我在寫上一個項(xiàng)目的時候是直接跳到后端做了一個簡單的API之后聯(lián)調(diào)的北苟,但這次我想把前后端徹底分開桩匪,所以就再引入一個簡單的工具 ——
json-server

編輯static/db.json文件:

{
    "projects" : [

        {
            "id" : 1,
            "title" : "The First Project",
            "brief" : "The First Project"
        },
    
        {
            "id" : 2,
            "title" : "The Second Project",
            "brief" : "The Second Project"
        },
    
        {
            "id" : 3,
            "title" : "The Third Project",
            "brief" : "The Third Project"
        }
    
    ] 
}

然后查看http://localhost:3000/就可以找到你的數(shù)據(jù)了

jsonserver

然后把API的url改成json數(shù)據(jù)庫的url友鼻,配置路由傻昙,啟動開發(fā)服務(wù)器闺骚,看到如下界面

projects

那個紅線看起來有點(diǎn)emmm,所以調(diào)整樣式讓整個看起來舒適一些妆档,編輯App.css僻爽,就變成

projects_css

project

用類似的一整套過程,可以再寫出一個project的界面贾惦,如下

project

這次的應(yīng)該再主頁上是看不到了胸梆,我也不想再去搞一個遠(yuǎn)程的json-server,太麻煩了须板,估計(jì)等后面后端搭的時候這部分才能顯示吧乳绕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逼纸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌济蝉,老刑警劉巖杰刽,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異王滤,居然都是意外死亡贺嫂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門雁乡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第喳,“玉大人,你說我怎么就攤上這事踱稍∏ィ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵珠月,是天一觀的道長扩淀。 經(jīng)常有香客問我,道長啤挎,這世上最難降的妖魔是什么驻谆? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮庆聘,結(jié)果婚禮上胜臊,老公的妹妹穿的比我還像新娘。我一直安慰自己伙判,他們只是感情好象对,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澳腹,像睡著了一般织盼。 火紅的嫁衣襯著肌膚如雪杨何。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天沥邻,我揣著相機(jī)與錄音危虱,去河邊找鬼。 笑死唐全,一個胖子當(dāng)著我的面吹牛埃跷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邮利,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼弥雹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了延届?” 一聲冷哼從身側(cè)響起剪勿,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎方庭,沒想到半個月后厕吉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡械念,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年头朱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄减。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡项钮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出希停,到底是詐尸還是另有隱情烁巫,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布脖苏,位于F島的核電站程拭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棍潘。R本人自食惡果不足惜恃鞋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亦歉。 院中可真熱鬧恤浪,春花似錦、人聲如沸肴楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赛蔫。三九已至砂客,卻和暖如春泥张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞠值。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工媚创, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彤恶。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓钞钙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親声离。 傳聞我的和親對象是個殘疾皇子芒炼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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