亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React Redux簡單實現(xiàn)

YPHP / 2748人閱讀

摘要:設(shè)計思想應(yīng)用是一個狀態(tài)機(jī)試圖與狀態(tài)是一一對應(yīng)的所有的狀態(tài)保存在一個對象里基本改變和就是保存數(shù)據(jù)的地方你可以把它看成一個容器整個應(yīng)用只能有一個提供這個函數(shù)用來生成函數(shù)接受另一個函數(shù)作為參數(shù)返回新生成的對象對象包含所有數(shù)據(jù)如果想得到某個時點的數(shù)

設(shè)計思想

1.web應(yīng)用是一個狀態(tài)機(jī),試圖與狀態(tài)是一一對應(yīng)的.
2.所有的狀態(tài),保存在一個對象里.

基本改變和API

1.Store
Store就是保存數(shù)據(jù)的地方,你可以把它看成一個容器,整個應(yīng)用只能有一個Store.
Redux提供createStore這個函數(shù),用來生成Store.

import { createStore } from "redux";
const store = createStore(reducer);
createStore函數(shù)接受另一個reducer函數(shù)作為參數(shù),返回新生成的Store對象.

2.State
State對象包含所有數(shù)據(jù),如果想得到某個時點的數(shù)據(jù),就要對Store生成快照,這種時點的數(shù)據(jù)集合,
就叫做State.當(dāng)前時刻的State,可以通過store.getState()拿到.

const state = store.getState();

3.Action
state的變化,會導(dǎo)致view的變化,但是,用戶接觸不到state,只能接觸到view,所以.stated的變化必須是view導(dǎo)致的.Action就是view發(fā)出的通知,表示state應(yīng)該要發(fā)生變化了.
Action是一個對象,其中的type屬性是必須的,表示Action的名稱,其他屬性可以自由設(shè)置.

const action = {
    type: "ADD_TODO",
    payload: "learn Redux"
};

Action的名稱是ADD_TODO,它攜帶的信息是字符串Learn Redux.
可以這樣理解,Action描述當(dāng)前發(fā)生的事情,改變State的唯一方法,就是使用Action,它會運送數(shù)據(jù)到Store.

4.Action Creator
View要發(fā)送多少種信息,就會有多少種Action,可以定義一個函數(shù)生成Action,這個函數(shù)就叫ActionCreator.

const ADD_TODO = "添加 TODO";
function addToDo(text) {
    return {
        type: ADD_TODO,
        text
    }
}

5.store.dispatch()
store.dispatch()是view發(fā)出Action的唯一方法.

store.dispatch(addTODO("Learn Redux"));

6.reducer
store收到Action以后,必須給出一個新的State,這樣view才會發(fā)生變化.
這種State的計算過程就叫做Reducer.
Reducer是一個函數(shù),他接受Action和當(dāng)前State作為參數(shù),返回一個新的State.

export default (state = 0, action) => {
    switch (action.type) {
        case "INCREMENT":
            return state + 1;
        case "DECREMENT":
            return state - 1;
        case "getSource":
            return "bbbb";
        default:
            return 0;
    }
}

reducer函數(shù)收到名為ADD的action以后,就返回一個新的state,作為加法的計算結(jié)果,其他計算的邏輯,
也可以根據(jù)Action的不同來實現(xiàn).
實際應(yīng)用中,Reducer函數(shù)不用像上面這樣手動調(diào)用,store.dispatch方法會觸發(fā)Reducer的自動執(zhí)行.
為此,Store需要知道Reducer函數(shù),做法就是生成Store的時候,將Reducer傳入createStore方法.

const store = createStore(reducer);

createStore接受Reducer作為參數(shù),生成一個新的Store.以后每當(dāng)store.dispatch發(fā)送過來一個新的Action,
就會自動調(diào)用Reducer,得到新的State.
7.純函數(shù)
Reducer函數(shù)最重要的特征是,它是一個純函數(shù),也就是說,只要是同樣的輸入,必須得到同樣的輸出.
由于Reducer是純函數(shù),就可以保證同樣的State,必定得到同樣的view,但正因為這一點,Reducer函數(shù)里面不能改變
State,必須返回一個全新的對象.

return Object.assign({}, state, { thingToChange })
export default (state = 0, action) => {
    switch (action.type) {
        case "INCREMENT":
            return state + 1;
        case "DECREMENT":
            return state - 1;
        case "getSource":
            return "bbbb";
        case "ajax":
            return action.data;
        case "ajaxError":
            return action.data
        default:
            return 0;
    }
}

8.store.subscribe()
Store允許使用store.subscribe方法設(shè)置監(jiān)聽函數(shù),一旦State發(fā)生變化,就自定執(zhí)行這個函數(shù).

store.subscribe(listener);

顯然,只要把view的更新函數(shù)(render或this.setState)放入listen,就會實現(xiàn)view的自動渲染.
let unsubscribe= store.subscribe(() => console.log(store.getState()));
unsubscribe();

Store的實現(xiàn)

1.store.getState(),store.dispatch(),store.subscribe()

let { subscribe, dispatch, getState } = createStore(reducer);
Reducer的拆分

Reducer函數(shù)負(fù)責(zé)生成State,由于整個應(yīng)用只有一個state對象,包含所有數(shù)據(jù),對于大型應(yīng)用來說,這個State
必然十分龐大,導(dǎo)致Reducer函數(shù)也十分龐大.
Redux提供了一個combineReducers方法,用于Reducer的拆分,你只要定義各個子Render函數(shù),
然后用這個方法,將它們合成一個大的Reducer.

import { combineReducers } from "redux";

const chatReducer = combineReducers({
  chatLog,
  statusMessage,
  userName
})
工作流程

1.用戶發(fā)出Action

store.dispatch(action);

2.Store自動調(diào)用Reducer,并且傳入兩個參數(shù),當(dāng)前State和收到的Action.Reducer會返回新的State.

let nextState = todoApp(previousState, action);

3.State一旦有變化,Store就會調(diào)用監(jiān)聽函數(shù).

store.subscribe(listener);

4.listener可以通過store.getState()得到當(dāng)前狀態(tài),如果使用的是React,這時可以觸發(fā)重新渲染view.

function listerner() {
  let newState = store.getState();
  component.setState(newState);   
}
實例
import React, { Component } from "react";
import { render } from "react-dom";
import reducer from "../reducers/reducer.js";
import { createStore } from "redux";

const store = createStore(reducer);

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0,
            source: "aaaa",
            ajaxSource: "ajax"
        };
    }
    handleAdd = () => {
        store.dispatch({
            type: "INCREMENT"
        });
    }
    handleDel = () => {
        store.dispatch({
            type: "DECREMENT"
        });
    }
    handleGet = () => {
        store.dispatch({
            type: "getSource"
        })
    }
    handleAjax = () => {
        fetch("../api/response.json")
        .then(response => response.json())
        .then((res) => {
            store.dispatch({
                type: "ajax",
                data: res
            });
        }).catch((err) => {
            store.dispatch({
                type: "ajaxError",
                data: err
            });
        })
    }
    render() {
        let _this = this;
        store.subscribe(() => {
            let o = store.getState();
            _this.setState({
                [o.type]: store.getState()[o.type]
            })
        });
        return (
            
{ this.state.count } { this.state.source } { this.state.ajaxSource.res }
); } } render(, document.getElementById("root"));
export default (state = 0, action) => {
    switch (action.type) {
        case "INCREMENT":
            return Object.assign({}, state, {
                count: state + 1,
                type: "count"
            });
        case "DECREMENT":
            return Object.assign({}, state, {
                count: state - 1,
                type: "count"
            });
        case "getSource":
            return Object.assign({}, state, {
                source: action.dada,
                type: "source"
            });
        case "ajax":
            return Object.assign({}, state, {
                ajaxSource: action.data,
                type: "ajaxSource"
            })
        case "ajaxError":
            return Object.assign({}, state, {
                ajaxSource: action.data,
                type: "ajaxSource"
            });
        default:
            return state
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/84211.html

相關(guān)文章

  • redux以及react-redux簡單實現(xiàn)

    摘要:寫在前頭簡介隨著單頁應(yīng)用開發(fā)日趨復(fù)雜,需要管理比任何時候都要多的狀態(tài)。如果一個的變化會引起另一個變化,那么當(dāng)變化時,就可能引起對應(yīng)以及另一個的變化,依次地,可能會引起另一個的變化。一些庫如試圖在視圖層禁止異步和直接操作來解決這個問題。 寫在前頭 redux 簡介 ? 隨著 JavaScript 單頁應(yīng)用開發(fā)日趨復(fù)雜,JavaScript 需要管理比任何時候都要多的 state (...

    elliott_hu 評論0 收藏0
  • react-redux

    摘要:主要用于構(gòu)建,被認(rèn)為是中的視圖。高效通過對的模擬,最大限度地減少與的交互。也就是說,用戶負(fù)責(zé)視覺層,狀態(tài)管理則是全部交給它。該回調(diào)函數(shù)必須返回一個純對象,這個對象會與組件的合并。 React 定義: React 是一個用于構(gòu)建用戶界面的 JAVASCRIPT 庫。React主要用于構(gòu)建UI,React 被認(rèn)為是 MVC 中的 V(視圖)。 特點: 聲明式設(shè)計 ?React采用聲明范式...

    sanyang 評論0 收藏0
  • React專題:reactredux以及react-redux常見一些面試題

    摘要:我們可以為元素添加屬性然后在回調(diào)函數(shù)中接受該元素在樹中的句柄,該值會作為回調(diào)函數(shù)的第一個參數(shù)返回。使用最常見的用法就是傳入一個對象。單向數(shù)據(jù)流,比較有序,有便于管理,它隨著視圖庫的開發(fā)而被概念化。 面試中問框架,經(jīng)常會問到一些原理性的東西,明明一直在用,也知道怎么用, 但面試時卻答不上來,也是挺尷尬的,就干脆把react相關(guān)的問題查了下資料,再按自己的理解整理了下這些答案。 reac...

    darcrand 評論0 收藏0
  • React組件設(shè)計實踐總結(jié)05 - 狀態(tài)管理

    摘要:要求通過要求數(shù)據(jù)變更函數(shù)使用裝飾或放在函數(shù)中,目的就是讓狀態(tài)的變更根據(jù)可預(yù)測性單向數(shù)據(jù)流。同一份數(shù)據(jù)需要響應(yīng)到多個視圖,且被多個視圖進(jìn)行變更需要維護(hù)全局狀態(tài),并在他們變動時響應(yīng)到視圖數(shù)據(jù)流變得復(fù)雜,組件本身已經(jīng)無法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態(tài)管理的相關(guān)方案。 前幾篇文章在掘金首發(fā)基本石沉大海, 沒什么閱讀量. 可能是文章篇幅太長了?掘金值太低了? ...

    ideaa 評論0 收藏0
  • React構(gòu)建個人博客

    摘要:兄弟組件之間無法直接通信,它們需要利用同一層的上級作為中轉(zhuǎn)站。在兩個地方會用到,一是通過提交后需要拿到里面的數(shù)據(jù),二是利用監(jiān)聽到發(fā)生變化后調(diào)用它來獲取新的數(shù)據(jù)。 前言 在學(xué)習(xí)react的過程中,深深的被react的函數(shù)式編程的模式所吸引,一切皆組件,所有的東西都是JavaScript。React框架其實功能很單一,主要負(fù)責(zé)渲染的功能,但是社區(qū)很活躍,衍生出了很多優(yōu)秀的庫和工具。個人覺得...

    lyning 評論0 收藏0
  • 實例講解react+react-router+redux

    摘要:而函數(shù)式編程就不一樣了,這是模仿我們?nèi)祟惖乃季S方式發(fā)明出來的。數(shù)據(jù)流在中,數(shù)據(jù)的流動是單向的,即從父節(jié)點傳遞到子節(jié)點。數(shù)據(jù)流嚴(yán)格的單向數(shù)據(jù)流是架構(gòu)的設(shè)計核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實現(xiàn)一個簡易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實現(xiàn)一個完整應(yīng)用的過程。 代碼地址:Re...

    RiverLi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<