React-redux與redux

Redux中文文檔https://www.redux.org.cn/ React-redux中文文檔https://www.redux.org.cn/docs/react-redux/ ReduxJavaScript 狀態(tài)容器,提供可預測化的狀態(tài)管理删壮,如果通俗地一點來講,那么Redux可以看做是一個數(shù)據(jù)倉庫炎咖。 ReduxReact-redux不是同一個庫,Redux可以用在客戶端、服務器乘盼、原生應用升熊,而React-reduxReact官方提供的只作用于React的綁定庫。

Redux

Redux三大原則

  1. 單一數(shù)據(jù)源:整個應用的state被存儲在一棵object tree中绸栅,并且這個object tree只存在于一個store中级野,即使數(shù)據(jù)很多也沒關系,可以根據(jù)需要自定義的拆分數(shù)據(jù)阴幌。
  2. State是只讀的:唯一改變state的方法就是觸發(fā)action
  3. 使用純函數(shù)來執(zhí)行修改:為了改變state勺阐,action描述事務“發(fā)生了什么”卷中,而真正的數(shù)據(jù)操作交給reducer

基礎

Action

Action是把數(shù)據(jù)從應用傳到store的有效載荷矛双,它是store數(shù)據(jù)的唯一來源,一般來說會通過store.dispatch()action傳到store蟆豫,簡潔的概括就是action描述了事務"發(fā)生了什么"议忽,而真正更新state的是Reducer

Reducer

Reducer指定了應用狀態(tài)的變化如何響應actions并發(fā)送到store的,記住actions只是描述了事務"發(fā)生了什么"十减,并沒有描述應用是如何更新state栈幸,此外Reducer是一個純函數(shù),接收舊的state并返回新的state帮辟,簡潔地概括就是根據(jù)actions更新state

Store

Store是將ActionReducer聯(lián)系到一起的對象速址,Store有以下職責:
1、維持應用的state
2由驹、提供getState()方法獲取state
3芍锚、提供dispatch(action)方法更新state
4、通過subscribe(listener)注冊監(jiān)聽器
5蔓榄、通過subscribe(listener)返回的函數(shù)注銷監(jiān)聽器

示例

reducer.js

//定義狀態(tài)
const initState = {
    count: 100
}

const reducer = (state = initState, action) => {
    switch (action.type) {
        case 'increment':
            return Object.assign({},state,{
                count:state.count + 1
            })
        case 'decrement':
            return Object.assign({},state,{
                count:state.count - 1
            })
        default:
            return state
    }
}

export default reducer

定義了三個事件并炮,增加count、減少count和返回state

action.js

   return {
       type:'increment'
   }
}

export const handleDecrement=()=>{
   return {
       type:'decrement'
   }
} 

定義了兩種事務

store.js

import {createStore} from "redux";
import reducer from "./reducer";
const store = createStore(reducer)
export default store

action甥郑、reducerstore都已定義,在react中使用

import React,{Component} from 'react'
import {
    handleIncrement,
    handleDecrement
} from '../redux/action'    //解構action定義的兩種事務

import store from '../redux/store'

export default class Redux1Comp extends Component {
    handleAdd=()=>{
        const action = handleIncrement()//發(fā)布
        store.dispatch(action)//更新
    }
    handleReduce=()=>{
        const action = handleDecrement()
        store.dispatch(action)
    }

    componentDidMount() {
        store.subscribe(()=>{
            this.setState({})
        })
    }

    render() {
        const {count} = store.getState()
        //store.getState()獲取數(shù)據(jù)
        return (
            <>
                <h1>redux</h1>
                <h2>count:{count}</h2>
                <button onClick={this.handleAdd}>+1</button>
                <button onClick={this.handleReduce}>-1</button>
            </>
        )
    }
}

以上是一個使用redux簡單的小例子實現(xiàn)逃魄,react-reduxredux一脈相承,只不過react-redux的使用更為簡單

React-redux

依然使用上面的這個例子的action.js澜搅、reducer.jsstore.js

import React, {Component} from 'react';

//+16增幅組件
import {connect} from 'react-redux';

import {
    handleIncrement,
    handleDecrement,
    handleAsyncUpdataState
} from "../redux2/action2";

class ComA extends Component {
    handleAdd=()=>{
        console.log(this.props)
        const {add} = this.props
        add()
    }
    handleReduce=()=>{
        console.log(this.props)
        const {reduce} = this.props
        reduce()
    }
    handleAddAsync=()=>{
        console.log(this.props)
        const {addAsync} = this.props
        addAsync()
    }
    render() {
        return (
            <div className={'comA'}>
                <button onClick={this.handleAdd}>+1</button>
                <button onClick={this.handleReduce}>-1</button>
                <button onClick={this.handleAddAsync}>async +1</button>
            </div>
        );
    }
}
const mapDispatchToProps = (dispatch)=>{
    return {
        add(){
            const action = handleIncrement()
            console.log(action)
            dispatch(action)
        },
        reduce(){
            const action = handleDecrement()
            dispatch(action)
        },
        addAsync(){
            const action = handleAsyncUpdataState()
            console.log(action)
            dispatch(action)
        }
    }
}
//connect   第一個參數(shù):允許我們將store中的數(shù)據(jù) 作為props綁定到組件
//          第二個參數(shù):將action作為props綁定到我們自己的函數(shù)中
export default connect(null,mapDispatchToProps)(ComA);

在組件中獲取狀態(tài)

import React, {Component} from 'react';
import {connect} from 'react-redux'

class ComB extends Component {
    render() {
        const {count} = this.props
        return (
            <div className={'comB'}>
                <h2>count:{count}</h2>
            </div>
        );
    }
}
//connect   第一個參數(shù):允許我們將store中的數(shù)據(jù) 作為props綁定到組件
//          第二個參數(shù):將action作為props綁定到我們自己的函數(shù)中
const mapStateToProps=(state)=>{
    return state
}
export default connect(mapStateToProps)(ComB);

與redux比較伍俘,React-redux更為簡潔,只要在mapStateToProps中綁定的state或者action就直接可以在組件的props中獲取到勉躺,這樣state與action在mapStateToProps統(tǒng)一管理养篓,使用起來很方便。更重要的是赂蕴,React-redux自己會監(jiān)聽state的變化進行更新柳弄,而redux需要手動的在生命周期componentDidMount進行訂閱事件來更新state。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碧注,隨后出現(xiàn)的幾起案子嚣伐,更是在濱河造成了極大的恐慌,老刑警劉巖萍丐,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轩端,死亡現(xiàn)場離奇詭異,居然都是意外死亡逝变,警方通過查閱死者的電腦和手機基茵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳影,“玉大人拱层,你說我怎么就攤上這事⊙邕郑” “怎么了根灯?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掺栅。 經常有香客問我烙肺,道長,這世上最難降的妖魔是什么氧卧? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任桃笙,我火速辦了婚禮,結果婚禮上沙绝,老公的妹妹穿的比我還像新娘搏明。我一直安慰自己,他們只是感情好宿饱,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布熏瞄。 她就那樣靜靜地躺著,像睡著了一般谬以。 火紅的嫁衣襯著肌膚如雪强饮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天为黎,我揣著相機與錄音邮丰,去河邊找鬼冠摄。 笑死译秦,一個胖子當著我的面吹牛碉考,可吹牛的內容都是我干的特恬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吁系,長吁一口氣:“原來是場噩夢啊……” “哼煤惩!你這毒婦竟也來了戈稿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泉沾,失蹤者是張志新(化名)和其女友劉穎捞蚂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跷究,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡姓迅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俊马。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁存。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柴我,靈堂內的尸體忽然破棺而出解寝,到底是詐尸還是另有隱情,我是刑警寧澤屯换,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布编丘,位于F島的核電站与学,受9級特大地震影響彤悔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜索守,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一晕窑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卵佛,春花似錦杨赤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衙解,卻和暖如春阳柔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚓峦。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工舌剂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暑椰。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像一汽,于是被迫代替她去往敵國和親避消。 傳聞我的和親對象是個殘疾皇子委造,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354