摘要:只要是同樣的輸入,必定得到同樣的輸出。純函數(shù)是函數(shù)式編程的概念,必須遵守以下一些約束。中的概念執(zhí)行的動(dòng)作,包括動(dòng)作所需要的數(shù)據(jù),改變數(shù)據(jù)的唯一來(lái)源,一般是通過(guò)將傳到。只是描述了有事情發(fā)生了這一事實(shí),并沒(méi)有指明應(yīng)用如何更新。
1.什么是Redux
管理Web應(yīng)用全局狀態(tài)的框架。
單頁(yè)面應(yīng)用,顧名思義,和傳統(tǒng)項(xiàng)目的最明顯區(qū)別就是項(xiàng)目只有一個(gè)頁(yè)面,頁(yè)面有一個(gè)根元素,我們寫的每一個(gè)頁(yè)面是一個(gè)大的組件,前端接管路由來(lái)渲染不同的頁(yè)面組件。
隨著應(yīng)用的復(fù)雜,前端需要存儲(chǔ)更多的state,包括緩存的全局?jǐn)?shù)據(jù),本地生成尚未持久化到服務(wù)器的數(shù)據(jù),也包括 UI 狀態(tài),如激活的路由,被選中的標(biāo)簽,是否顯示加載動(dòng)效或者分頁(yè)器等等。
如果是單純的數(shù)據(jù)緩存 也沒(méi)什么需要考慮的東西,放到內(nèi)存就可以了, 重點(diǎn)是還要讓state和view有綁定的關(guān)系。state的變化能夠觸發(fā)view的變化。
在我們的項(xiàng)目中,沒(méi)有用redux之前,我們都是頁(yè)面組件管理state,出現(xiàn)以下需求的時(shí)候,寫起來(lái)就比較復(fù)雜
某個(gè)組件的狀態(tài),需要共享
某個(gè)狀態(tài)需要在任何地方都可以拿到
一個(gè)組件需要改變?nèi)譅顟B(tài)
一個(gè)組件需要改變另一個(gè)組件的狀態(tài)
2.Redux的原則和設(shè)計(jì)思想 2.1 三大原則單一數(shù)據(jù)源:整個(gè)應(yīng)用的 state 被儲(chǔ)存在一棵 object tree 中,并且這個(gè) object tree 只存在于唯一一個(gè) store 中
State 是只讀的:惟一改變 state 的方法就是觸發(fā) action,action 是一個(gè)用于描述已發(fā)生事件的普通對(duì)象。
使用純函數(shù)來(lái)執(zhí)行修改: 為了描述 action 如何改變 state tree ,你需要編寫 reducers。只要是同樣的輸入,必定得到同樣的輸出。
純函數(shù)是函數(shù)式編程的概念,必須遵守以下一些約束。
不得改寫參數(shù)
不能調(diào)用系統(tǒng) I/O 的API
不能調(diào)用Date.now()或者M(jìn)ath.random()等不純的方法,因?yàn)槊看螘?huì)得到不一樣的結(jié)果
(1)Web 應(yīng)用是一個(gè)狀態(tài)機(jī),視圖與狀態(tài)是一一對(duì)應(yīng)的。
(2)所有的狀態(tài),保存在一個(gè)對(duì)象里面。
3.Redux中的概念 3.1 Action執(zhí)行的動(dòng)作,包括動(dòng)作所需要的數(shù)據(jù),改變store數(shù)據(jù)的唯一來(lái)源,一般是通過(guò)store.dispatch() 將 action 傳到 store。
Action 本質(zhì)上是 JavaScript 普通對(duì)象。
flux-standard-action FSA標(biāo)準(zhǔn)
type,必須,string或者Symbol
payload,可選,執(zhí)行action所需要的數(shù)據(jù),任何類型
error,可選,標(biāo)識(shí)這個(gè)action是否有錯(cuò)誤,true or false
meta,可選,任何類型,payload之外的其他數(shù)據(jù)。
3.2 Reducer根據(jù)action 做更新state的操作。
Action 只是描述了有事情發(fā)生了這一事實(shí),并沒(méi)有指明應(yīng)用如何更新 state。而這正是 reducer 要做的事情。
3.3 StoreStore就是保存全局state的容器,保存三個(gè)常用的api
getState,獲取當(dāng)前的state
subscribe,給store變化添加監(jiān)聽函數(shù)
dispatch,用于接受action的方法,觸發(fā)reducer和監(jiān)聽函數(shù)
3.4 單項(xiàng)數(shù)據(jù)流用戶通過(guò)View,dispatch 相應(yīng)的action,store調(diào)用reducer獲取最新的state,并觸發(fā)通過(guò)subscribe訂閱的監(jiān)聽函數(shù),監(jiān)聽函數(shù)中我們通過(guò)store的getState方法獲取最新的state,更新view。
工作流程圖
)
simpleredux/index.js
import {createStore} from "redux"; export function createAction(type, payload) { return { type, payload } } const initialState = { time: new Date().getTime() } function reducer(state = initialState, action) { switch (action.type) { case "NOW_TIME": return { ...state, time: action.payload } default: return state; } } let store; export function getStore() { if(store) return store; return store = createStore(reducer); }
TestRedux.js
"use strict"; import React, { Component } from "react"; import { StyleSheet, View, Text } from "react-native"; import MtButton from "@scfe/react-native-button"; import {getStore, createAction} from "../../simpleredux/index"; const store = getStore(); class TestRedux extends Component { constructor(props) { super(props); let state = store.getState(); this.state = { time: state.time }; store.subscribe(()=>{ let state = store.getState(); this.setState({ time: state.time }); }); } _sendAction() { let action = createAction("NOW_TIME", new Date().getTime()); store.dispatch(action); } render() { return (); } } const styles = StyleSheet.create({ container: { flex: 1, padding: 40 } }); export default TestRedux; {this.state.time}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80726.html
摘要:描述這個(gè)插件可以讓我們的代碼更加的簡(jiǎn)潔和美觀。安裝使用提供了兩個(gè)重要的接口使用了這個(gè)插件,的和就可以忘記來(lái),它們就用不著了。現(xiàn)在有美女個(gè)。 可先查看我的redux簡(jiǎn)單入門 react-redux簡(jiǎn)介 react-redux是使用redux開發(fā)react時(shí)使用的一個(gè)插件,另外插一句,redux不是react的產(chǎn)品,vue和angular中也可以使用redux;下面簡(jiǎn)單講解,如何使用rea...
摘要:概述之前寫的所有關(guān)于的文章都是純粹的,是和框架無(wú)關(guān)環(huán)境無(wú)關(guān)的,所以我沒(méi)有將和一起講,為的是吧和分開,作為獨(dú)立的個(gè)體來(lái)分析,提現(xiàn)的是一種思想,而不是一個(gè)思維定式。而現(xiàn)在我們可以嘗試在中來(lái)使用了。 0x000 概述 之前寫的所有關(guān)于redux的文章都是純粹的redux,是和框架無(wú)關(guān)、環(huán)境無(wú)關(guān)的redux,所以我沒(méi)有將redux和react一起講,為的是吧redux和react分開,作為獨(dú)立...
摘要:我的入門到放棄之路最近看到很多相關(guān)的問(wèn)題跟討論,越來(lái)越多的小伙伴喜歡這個(gè)框架了,同時(shí)也在看到了有些入門的小伙伴遇到了各種各樣的問(wèn)題,本人也是框架使用都一枚,公司是騰訊阿里平安三巨頭合資的一家公司,分別上海深圳杭州北京廣州等多個(gè)分部,前端人員 showImg(https://segmentfault.com/img/bVbhonB?w=1278&h=722); 我的react入門到放棄之...
摘要:中定義來(lái)各個(gè)要做的事情。代碼定義把封裝成一個(gè)方法,這樣用的時(shí)候不用每次定義,避免出錯(cuò)入口文件封裝成方法,方便下面的的訂閱調(diào)用每當(dāng)時(shí),訂閱的函數(shù)就會(huì)執(zhí)行現(xiàn)在有機(jī)關(guān)槍把。通過(guò)的來(lái)觸發(fā),中訂閱的事件就會(huì)執(zhí)行。觸發(fā),獲取的值。 環(huán)境準(zhǔn)備 為了方便,這里使用create-react-app搭建react環(huán)境 create-react-app mydemo 彈出配置 如果需要自定義react的配置...
摘要:具體了解此方法可以請(qǐng)戳這里最后把對(duì)象暴露給在主入口進(jìn)行調(diào)用我們通過(guò)提供的頂層組件傳入然后把要展示的寫入頂層組件就行了,提供了整個(gè)全局的供所有的子組件進(jìn)行調(diào)用具體代碼實(shí)現(xiàn)請(qǐng) 項(xiàng)目目錄 showImg(https://segmentfault.com/img/bVTGs8?w=214&h=571); 整個(gè)項(xiàng)目目錄分為圖中所示: Redux分為{Action,Reducer,Store} 入...
閱讀 2224·2021-11-22 09:34
閱讀 1334·2021-10-11 10:59
閱讀 4427·2021-09-22 15:56
閱讀 3270·2021-09-22 15:08
閱讀 3401·2019-08-30 14:01
閱讀 773·2019-08-30 11:16
閱讀 1129·2019-08-26 13:51
閱讀 2906·2019-08-26 13:43