React狀態(tài)層使用要點(diǎn)

vuex :state-->getters-->組件---dispatch-->action----commit-->mutations--mutate-->state-->getters(計(jì)算屬性)--->組件-.....

Flux

state--->組件---dispatch-->action---->派發(fā)器收到action,修改state---->組件

1.安裝

cnpm i flux --save

2.使用

import { Dispatcher } from "flux"
import events from "events"

//1.初始化數(shù)據(jù) :這樣的state汤功,具備name悲敷、age,而且還有emit() on()
class State extends events{
    constructor(){
        super()
        this.name="妲己";
        this.age=20;
    }
}
const state = new State()

//3.定義派發(fā)器
const dispatcher = new Dispatcher();
//4.注冊(cè)任務(wù):約定規(guī)則

//action={type:"changeName",payload:"王昭君"}
//action={type:"changeAge",payload:100}
dispatcher.register((action) => {
    switch (action.type) {
        case "changeName":
            state.name = action.payload;
            state.emit("change")
            return;
        case "changeAge":
            state.age = action.payload;
            state.emit("change")
            return;
        default:
            return;
    }
})

//2.導(dǎo)出
export default {
    state: state,
    dispatcher
}

組件

import React, { Component } from 'react'
import store from "../store/index"
export default class A extends Component {
    componentDidMount() {
        store.state.on("change", () => {
            this.setState({})
        })
    }
    changeName(name) {
        //修改倉(cāng)庫(kù)的數(shù)據(jù)咨油,所以要去派發(fā)提前約定的任務(wù)
        store.dispatcher.dispatch({
            type: "changeName",
            payload: name
        })
    }
    changeAge(age) {
        store.dispatcher.dispatch({
            type: "changeAge",
            payload: age
        })
        console.log(store);
    }
    render() {
        return (
            <div className="box">
                <h1>this is A</h1>
                <p>name:{store.state.name}</p>
                <button onClick={() => this.changeName('王昭君')}>王昭君</button>
                <p>age:{store.state.age}</p>
                <button onClick={() => this.changeAge(100)}>年齡-100</button>
            </div>
        )
    }
}

state變了况脆,希望組件自動(dòng)渲染

//組件
export default class A extends Component {
    componentDidMount() {
        store.state.on("change", () => {
            this.setState({})
        })
    }
  }

當(dāng)state變了,觸發(fā)自定義事件

    case "changeName":
            state.name = action.payload;
            state.emit("change")
            return;

Redux

react---------> react-redux <----------redux---------> redux-thunk<-------------服務(wù)端

1.原則

1.單一數(shù)據(jù)源 store根悼。
2.state是只讀的凶异。
3.修改state只能通過(guò)純函數(shù)進(jìn)行修改。

2.安裝

cnpm i redux --save

3.創(chuàng)建倉(cāng)庫(kù)

import { createStore } from "redux"

//2.初始數(shù)據(jù)
const initState = {
    name: "妲己",
    age: 20
}

//3.定義reducer函數(shù)
//state:上一次修改完成的state
//action:任務(wù)信息 {type:"changeName",payload:"參數(shù)"}
function reducer(state = initState, action) {
    switch(action.type){
        case "changeName":
            state.name=action.payload;
            return state;
        case "changeAge":
            state.age=action.payload;
            return state;
        default:
            return state;
    }
}

//4.創(chuàng)建倉(cāng)庫(kù)
const store = createStore(reducer)

export default store;

4.基礎(chǔ)語(yǔ)法

組件使用倉(cāng)庫(kù)

import store from "../store"

取數(shù)據(jù)

store.getState()

派發(fā)動(dòng)作

store.dispatch({
    type:"changeName",
    payload:"王昭君"
})

添加監(jiān)聽

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

取消監(jiān)聽

this.unsubscribe()

5.redux 狀態(tài)層需要一下幾個(gè)模塊

state挤巡、reducer剩彬、action creator、導(dǎo)出

import { createStore } from "redux"

//1.初始數(shù)據(jù)
const initState = {
    name: "妲己",
    age:10
}

//2.定義reducer函數(shù)
function reducer(state = initState, action) {
    //reducer函數(shù): mutations 修改數(shù)據(jù)
    switch (action.type) {
        case "changeName":      
            return {
                ...state,
                name:action.payload
            };
        case "changeAge":
            return {
                ...state,
                age:action.age
            }
        default:
            return state;
    }
}
//3.action creator
export const changeNameAction = (name) => {
    return {
        type: "changeName",
        payload: name
    }
}
export const changeAgeAction= age =>{
    return {
        type:"changeAge",
        age:age
    }
}
//4.reselector函數(shù) 導(dǎo)出數(shù)據(jù) getters
export const getName = (state) => {
    return state.name;
}
export const getAge = (state) => {
    return state.age;
}
//5.創(chuàng)建倉(cāng)庫(kù)
const store = createStore(reducer)


//監(jiān)聽數(shù)據(jù)
store.subscribe(() => {
    console.log(store.getState());
})


export default store;

6.狀態(tài)層 連接 組件層 react-redux

1.安裝

cnpm i react-redux --save

2.在入口文件將store注入到Provider組件中

import store from "./store"
import {Provider} from "react-redux"

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>
  ,
  document.getElementById('root')
);

3.將組件定義為容器型組件矿卑,容器型組件只能是類定義組件喉恋。

import React,{Component} from "react"
import {connect} from "react-redux"
class D extends Component {
    render(){
        const {name,changeName}=this.props
        return (
            <div>
                <p>{name}</p>
                <button onClick={()=>changeName('貂蟬')}>貂蟬</button>
            </div>
        )
    }
}
const mapStateToProps=(state)=>{
    return {
        name:getName(state),
    }
}
const mapDispatchToProps=(dispatch)=>{
    return {
        changeName:(name)=>dispatch(changeNameAction(name))
    }
}
export default connect(mapStateToProps,mapDispatchToProps)(D)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轻黑,更是在濱河造成了極大的恐慌谦炒,老刑警劉巖屁柏,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異淀零,居然都是意外死亡潭兽,警方通過(guò)查閱死者的電腦和手機(jī)撤缴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門雀鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诫睬,“玉大人,你說(shuō)我怎么就攤上這事态罪∝眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵向臀,是天一觀的道長(zhǎng)巢墅。 經(jīng)常有香客問(wèn)我诸狭,道長(zhǎng)券膀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任驯遇,我火速辦了婚禮芹彬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叉庐。我一直安慰自己舒帮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布陡叠。 她就那樣靜靜地躺著玩郊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枉阵。 梳的紋絲不亂的頭發(fā)上译红,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音兴溜,去河邊找鬼侦厚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拙徽,可吹牛的內(nèi)容都是我干的刨沦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼膘怕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼想诅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤来破,失蹤者是張志新(化名)和其女友劉穎裁眯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讳癌,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穿稳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌坤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逢艘。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骤菠,靈堂內(nèi)的尸體忽然破棺而出它改,到底是詐尸還是另有隱情,我是刑警寧澤商乎,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布央拖,位于F島的核電站,受9級(jí)特大地震影響鹉戚,放射性物質(zhì)發(fā)生泄漏鲜戒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一抹凳、第九天 我趴在偏房一處隱蔽的房頂上張望遏餐。 院中可真熱鬧,春花似錦赢底、人聲如沸失都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)粹庞。三九已至,卻和暖如春洽损,著一層夾襖步出監(jiān)牢的瞬間庞溜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工趁啸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留强缘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓不傅,卻偏偏與公主長(zhǎng)得像旅掂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子访娶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348