當前位置:
首頁 > 知識 > react and redux教程學習實踐,淺顯易懂的實踐學習方法

react and redux教程學習實踐,淺顯易懂的實踐學習方法

前言

前幾天,我在博文【前端】一步一步使用webpack+react+scss腳手架重構項目中搭建了一個react開發環境。然而在實際的開發過程中,或者是在對源碼的理解中,感受到react中用的最多的,就是redux了,於是打開文檔學習了一番。在這裡做一些記錄。

redux概念

redux是什麼?它是用來管理狀態的。在react開發中,我們經常會遇到一種情況,組件與父組件之間的通信,組件與組件之間的通信,

其中組件與父組件的通信通過props來完成。

/***********parent****************/
<Number
value={this.state.number}
/>

/***********number****************/
<div >{this.props.value}</div>

number內部使用props獲取父組件自己的state,通過setState更改父組件的state.number可以實現number組件的實時更新。

那麼組件與組件之間的通信呢?例如我們有a,b兩個組件,現在a要給b轉發一個激活狀態active,一般思路是,在同一個父組件下,使用props傳遞迴調函數的方式。

/*********組件 a**********/
class A{
.....
changeActive{
this.props.changebActive;
}
render{
return <button onClick={this.changeActive}></button>
}
}
/*********組件 b**********/
class B{
render{
return <div>狀態:{this.props.active}</div>
}
}
/*********組件 parent**********/
class parent{
......
changebActive{
this.setState({
active:"開啟"
})
}
render{
return <div>
<A
changebActive={this.changebActive.bind(this)}
/>
<B
active={this.state.active}
/>
</div>
}
}

通過A點擊調用到parent的 changebActive方法,設置state更新b,這種方式非常容易使項目變得不可預測,並且state管理複雜,沒錯,redux很大程度就是用來解決這個問題的,它在react中的思想是:

將組件狀態統一放到同一個超級父組件,再由這個超級父組件用更專業的方法分發props給所有的子組件,無論嵌套多少層。由超級父組件統一管理應用中所有的state。

---這就是redux。無論api名詞如何晦澀難懂,它的核心思想是在開發中浮現的。

redux的API

一、所有的狀態,保存在一個對象裡面。

所有的狀態都保存在一個對象裡面,redux基本三大原則之一,單一數據源,一個應用所有的狀態被保存在一個對象里,這個對象通過store管理,想像一下,整個頁面的狀態被存儲在一個對象裡面,其實類似一個配置文件,你可以從伺服器讀取,可以從任何地方改變。view則是同步的,這看起來更精鍊不是么。

二、store

Store 就是保存狀態數據對象的地方,你可以把它看成一個容器。整個應用只能有一個 Store。

Redux 提供createStore這個函數,用來生成 Store。createStore傳入了一個函數這個函數將接收到兩個參數,一個state,一個action,action就是由子組件發出的更改請求,state就是那個單一的state對象。

import { createStore } from "redux";
const store = createStore(fn);

、action

發起狀態改變的起點是action,由子組件發出action,子組件通過props調用回調函數,通知父組件發出action。

觸發:

store.dispatch(action);

四、store.dispatch

這個方法就是發出action的方法,一般傳入action,調用這個方法之後,會觸發在createStore中傳入的函數。

五、store.getState

它用來獲取當前的state對象

六、reducer

這個就是createStore中傳入的函數的名詞解釋,這個函數的執行必須返回一個新的state:

export default (state={number:0},action)=>{//每次調用都會傳入state和當前通知的action
switch(action.type){
case "NUMBER_ADD": //發過來的action如果是NUMBER_ADD 就返回number++
state.number++;
break;
case "NUMBER_LESS":
state.number--;
break;
}
return Object.assign({},state); //必須返回一個新的state ,可以使用assign合併
}

注意這裡用了es6,給state添加了一個默認值,{number:0}。

六、store.subscribe

Store 允許使用store.subscribe方法設置監聽函數,一旦 State 發生變化,就自動執行這個函數。

import { createStore } from "redux";
const store = createStore(reducer);

store.subscribe(render);

比如上面我在生成store傳入reducer函數之後,使用store.subscribe設置監聽函數為render,則每次state改變了,就會執行render函數,刷新視圖。

概念名詞太多,不如實踐

實踐一個number輸入框的加減組件,你就能大概知道redux究竟是怎麼工作的。

一、準備

首先你需要搭建一個react的開發環境,需要一個index.html 輸出目錄等。詳見我的另一篇博文:【前端】一步一步使用webpack+react+scss腳手架重構項目。

然後你需要一定的react開發實踐,React有props和state兩個屬性: props意味著父組件分發下來的屬性,state意味著組件內部可以自行管理的狀態,並且整個React沒有數據向上回溯的能力,也就是說數據只能單向向下分發,或者自行內部消化。

理解這個是理解React和Redux的前提。

你需要npm安裝redux:

num install redux react-redux --save-dev

二、代碼

1.number.js

import React,{Component} from "react";

const propTypes = {
add:React.PropTypes.func.isRequired,
less:React.PropTypes.func.isRequired,
value:React.PropTypes.object.isRequired
}
class Number extends Component{
add{
this.props.add({type:"NUMBER_ADD"}) //調用app.js中傳過來的箭頭函數,傳入了type為NUMBER_ADD的action
}
less{
this.props.less({type:"NUMBER_LESS"})
}
render{
return <div>
<input type="text" value={this.props.value.number}/>
<button onClick={this.add.bind(this)}>
+
</button>
<button onClick={this.less.bind(this)}>
-
</button>
</div>
}
}
Number.propTypes = propTypes;
export {Number};

注意那兩個click回調,發出了action,以及那個this.props.value.number的引用,props傳入了state,獲取了state.number

2.app.js

import React from "react";
import ReactDOM from "react-dom";

import {createStore} from "redux"; //導入createStore

import {Number} from "./number.js";
import reducers from "./reducers.js";
const store = createStore(reducers); //生成store

const content = document.querySelector(".content");
const render = => ReactDOM.render(
<div>
<Number
value={store.getState}
add={(action)=>store.dispatch(action)} //傳入一個函數,傳入發送過來的action,由reducers處理之後返回state,
less={(action)=>store.dispatch(action)}
/>
</div>,
content
);
render;
store.subscribe(render); //在reducers處理之後,返回了state,然後觸發了render,更新視圖

3.reducers.js

這就是createStore傳入的函數,當發出action,store會自動調用它傳入state,action 返回了一個新的state.

Redux 的基本用法就介紹到這裡,下一篇介紹它的高級用法:中間件和非同步操作。為什麼是下一篇?因為我也還沒學。

資源--------------------------------
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

MySQL優化-性能分析與查詢優化
基於三台主機部署phpwind
聊聊synchronized的鎖問題
yii2 隊列 shmilyzxt/yii2-queue 簡介
LayUI分頁,LayUI動態分頁,LayUI laypage分頁

TAG:科技優家 |

您可能感興趣

深度學習之CapsuleNets理論與Python實踐!
從選擇到實踐——It』s now or never
conda最佳實踐
第55期:Python機器學習實踐指南、Tensorflow 實戰Google深度學習框架
讓事件飛——Linux eventfd 原理與實踐
谷歌發布機器學習規則 (Rules of Machine Learning):關於機器學習工程的最佳實踐(上)
谷歌發布機器學習規則 (Rules of Machine Learning):關於機器學習工程的最佳實踐(下)
TalkingData的Spark On Kubernetes實踐
基於Gatsby的React靜態化實踐
技術解析系列PouchContainer Goroutine Leak 檢測實踐
BGP Confederation原理實踐
你需要的Scikit-learn中文文檔:步入機器學習的完美實踐教程
從Paxos到zookeeper分散式一致性原理與實踐-Zookeeper與Paxos
Android模塊化實踐
Apache Storm流計算模型 及WordCount源碼實踐
word2vec理論與實踐
Georgia Tech-真正的理論與實踐結合
GemFire與Greenplum的最佳集成實踐之實施經驗談
Spring Cloud Contract 在永輝雲創的研發實踐
Uber Hadoop 文件系統最佳實踐