摘要:設計思想應用是一個狀態機試圖與狀態是一一對應的所有的狀態保存在一個對象里基本改變和就是保存數據的地方你可以把它看成一個容器整個應用只能有一個提供這個函數用來生成函數接受另一個函數作為參數返回新生成的對象對象包含所有數據如果想得到某個時點的數
設計思想
1.web應用是一個狀態機,試圖與狀態是一一對應的.
2.所有的狀態,保存在一個對象里.
1.Store
Store就是保存數據的地方,你可以把它看成一個容器,整個應用只能有一個Store.
Redux提供createStore這個函數,用來生成Store.
import { createStore } from "redux"; const store = createStore(reducer); createStore函數接受另一個reducer函數作為參數,返回新生成的Store對象.
2.State
State對象包含所有數據,如果想得到某個時點的數據,就要對Store生成快照,這種時點的數據集合,
就叫做State.當前時刻的State,可以通過store.getState()拿到.
const state = store.getState();
3.Action
state的變化,會導致view的變化,但是,用戶接觸不到state,只能接觸到view,所以.stated的變化必須是view導致的.Action就是view發出的通知,表示state應該要發生變化了.
Action是一個對象,其中的type屬性是必須的,表示Action的名稱,其他屬性可以自由設置.
const action = { type: "ADD_TODO", payload: "learn Redux" };
Action的名稱是ADD_TODO,它攜帶的信息是字符串Learn Redux.
可以這樣理解,Action描述當前發生的事情,改變State的唯一方法,就是使用Action,它會運送數據到Store.
4.Action Creator
View要發送多少種信息,就會有多少種Action,可以定義一個函數生成Action,這個函數就叫ActionCreator.
const ADD_TODO = "添加 TODO"; function addToDo(text) { return { type: ADD_TODO, text } }
5.store.dispatch()
store.dispatch()是view發出Action的唯一方法.
store.dispatch(addTODO("Learn Redux"));
6.reducer
store收到Action以后,必須給出一個新的State,這樣view才會發生變化.
這種State的計算過程就叫做Reducer.
Reducer是一個函數,他接受Action和當前State作為參數,返回一個新的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函數收到名為ADD的action以后,就返回一個新的state,作為加法的計算結果,其他計算的邏輯,
也可以根據Action的不同來實現.
實際應用中,Reducer函數不用像上面這樣手動調用,store.dispatch方法會觸發Reducer的自動執行.
為此,Store需要知道Reducer函數,做法就是生成Store的時候,將Reducer傳入createStore方法.
const store = createStore(reducer);
createStore接受Reducer作為參數,生成一個新的Store.以后每當store.dispatch發送過來一個新的Action,
就會自動調用Reducer,得到新的State.
7.純函數
Reducer函數最重要的特征是,它是一個純函數,也就是說,只要是同樣的輸入,必須得到同樣的輸出.
由于Reducer是純函數,就可以保證同樣的State,必定得到同樣的view,但正因為這一點,Reducer函數里面不能改變
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方法設置監聽函數,一旦State發生變化,就自定執行這個函數.
store.subscribe(listener);
顯然,只要把view的更新函數(render或this.setState)放入listen,就會實現view的自動渲染.
let unsubscribe= store.subscribe(() => console.log(store.getState()));
unsubscribe();
1.store.getState(),store.dispatch(),store.subscribe()
let { subscribe, dispatch, getState } = createStore(reducer);Reducer的拆分
Reducer函數負責生成State,由于整個應用只有一個state對象,包含所有數據,對于大型應用來說,這個State
必然十分龐大,導致Reducer函數也十分龐大.
Redux提供了一個combineReducers方法,用于Reducer的拆分,你只要定義各個子Render函數,
然后用這個方法,將它們合成一個大的Reducer.
import { combineReducers } from "redux"; const chatReducer = combineReducers({ chatLog, statusMessage, userName })工作流程
1.用戶發出Action
store.dispatch(action);
2.Store自動調用Reducer,并且傳入兩個參數,當前State和收到的Action.Reducer會返回新的State.
let nextState = todoApp(previousState, action);
3.State一旦有變化,Store就會調用監聽函數.
store.subscribe(listener);
4.listener可以通過store.getState()得到當前狀態,如果使用的是React,這時可以觸發重新渲染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 } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84211.html
摘要:寫在前頭簡介隨著單頁應用開發日趨復雜,需要管理比任何時候都要多的狀態。如果一個的變化會引起另一個變化,那么當變化時,就可能引起對應以及另一個的變化,依次地,可能會引起另一個的變化。一些庫如試圖在視圖層禁止異步和直接操作來解決這個問題。 寫在前頭 redux 簡介 ? 隨著 JavaScript 單頁應用開發日趨復雜,JavaScript 需要管理比任何時候都要多的 state (...
摘要:主要用于構建,被認為是中的視圖。高效通過對的模擬,最大限度地減少與的交互。也就是說,用戶負責視覺層,狀態管理則是全部交給它。該回調函數必須返回一個純對象,這個對象會與組件的合并。 React 定義: React 是一個用于構建用戶界面的 JAVASCRIPT 庫。React主要用于構建UI,React 被認為是 MVC 中的 V(視圖)。 特點: 聲明式設計 ?React采用聲明范式...
摘要:我們可以為元素添加屬性然后在回調函數中接受該元素在樹中的句柄,該值會作為回調函數的第一個參數返回。使用最常見的用法就是傳入一個對象。單向數據流,比較有序,有便于管理,它隨著視圖庫的開發而被概念化。 面試中問框架,經常會問到一些原理性的東西,明明一直在用,也知道怎么用, 但面試時卻答不上來,也是挺尷尬的,就干脆把react相關的問題查了下資料,再按自己的理解整理了下這些答案。 reac...
摘要:要求通過要求數據變更函數使用裝飾或放在函數中,目的就是讓狀態的變更根據可預測性單向數據流。同一份數據需要響應到多個視圖,且被多個視圖進行變更需要維護全局狀態,并在他們變動時響應到視圖數據流變得復雜,組件本身已經無法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態管理的相關方案。 前幾篇文章在掘金首發基本石沉大海, 沒什么閱讀量. 可能是文章篇幅太長了?掘金值太低了? ...
摘要:兄弟組件之間無法直接通信,它們需要利用同一層的上級作為中轉站。在兩個地方會用到,一是通過提交后需要拿到里面的數據,二是利用監聽到發生變化后調用它來獲取新的數據。 前言 在學習react的過程中,深深的被react的函數式編程的模式所吸引,一切皆組件,所有的東西都是JavaScript。React框架其實功能很單一,主要負責渲染的功能,但是社區很活躍,衍生出了很多優秀的庫和工具。個人覺得...
摘要:而函數式編程就不一樣了,這是模仿我們人類的思維方式發明出來的。數據流在中,數據的流動是單向的,即從父節點傳遞到子節點。數據流嚴格的單向數據流是架構的設計核心。 前言 總括: 本文采用react+redux+react-router+less+es6+webpack,以實現一個簡易備忘錄(todolist)為例盡可能全面的講述使用react全家桶實現一個完整應用的過程。 代碼地址:Re...
閱讀 2784·2021-11-23 09:51
閱讀 3542·2021-10-08 10:17
閱讀 1275·2021-10-08 10:05
閱讀 1329·2021-09-28 09:36
閱讀 1849·2021-09-13 10:30
閱讀 2190·2021-08-17 10:12
閱讀 1683·2019-08-30 15:54
閱讀 2013·2019-08-30 15:53