摘要:傳統(tǒng)框架的缺陷傳統(tǒng)框架的缺陷模型視圖控制器的縮寫即視圖用戶看到并與之交互的界面。即模型是管理數(shù)據(jù)很多業(yè)務(wù)邏輯都在模型中完成。在的三個(gè)部件中,模型擁有最多的處理任務(wù)。所有的狀態(tài),保存在一個(gè)對(duì)象里面唯一數(shù)據(jù)源。
模型(model)-視圖(view)-控制器(controller)的縮寫
V
即View視圖:用戶看到并與之交互的界面。
M
即Model模型是管理數(shù)據(jù):很多業(yè)務(wù)邏輯都在模型中完成。在MVC的三個(gè)部件中,模型擁有最多的處理任務(wù)。
C
即Controller控制器:接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型構(gòu)件去處理請(qǐng)求,然后再確定用哪個(gè)視圖來顯示返回的數(shù)據(jù)。
缺點(diǎn)
MVC框架的數(shù)據(jù)流很理想,請(qǐng)求先到Controller, 由Controller調(diào)用Model中的數(shù)據(jù)交給View進(jìn)行渲染.
但是在實(shí)際的項(xiàng)目中,又是允許Model和View直接通信的。
在2013年,F(xiàn)acebook讓React
亮相的同時(shí)推出了Flux框架,React
的初衷實(shí)際上是用來替代jQuery
的,Flux
實(shí)際上就可以用來替代Backbone.js
,Ember.js
等一系列MVC
架構(gòu)的前端JS框架。
其實(shí)Flux
在React
里的應(yīng)用就類似于Vue
中的Vuex
的作用,但是在Vue
中,Vue
是完整的mvvm
框架,而Vuex
只是一個(gè)全局的插件。
React
只是一個(gè)MVC中的V(視圖層),只管頁面中的渲染,一旦有數(shù)據(jù)管理的時(shí)候,React
本身的能力就不足以支撐復(fù)雜組件結(jié)構(gòu)的項(xiàng)目,在傳統(tǒng)的MVC
中,就需要用到Model和Controller。Facebook對(duì)于當(dāng)時(shí)世面上的MVC
框架并不滿意,于是就有了Flux
, 但Flux
并不是一個(gè)MVC
框架,他是一種新的思想
Flux的流程:
注意:flux、redux都不是必須和react搭配使用的,因?yàn)閒lux和redux是完整的架構(gòu),在學(xué)習(xí)react的時(shí)候,只是將react的組件作為redux中的視圖層去使用了。
React 只是 DOM 的一個(gè)抽象層,并不是 Web 應(yīng)用的完整解決方案。
有兩個(gè)方面,它沒涉及:
2013年 Facebook 提出了 Flux 架構(gòu)的思想,引發(fā)了很多的實(shí)現(xiàn)。2015年,Redux 出現(xiàn),將 Flux 與函數(shù)式編程結(jié)合一起,很短時(shí)間內(nèi)就成為了最熱門的前端架構(gòu)。
不需要redux情況
需要redux情況
從組件層面考慮,什么樣子的需要Redux:
Redux的設(shè)計(jì)思想:
Redux的使用的三大原則:
Reducer必須是一個(gè)純函數(shù)
純函數(shù)遵守以下一些約束。
步驟1:創(chuàng)建統(tǒng)一數(shù)據(jù)源
//引入創(chuàng)建倉庫方法import {createStore} from "redux"http://默認(rèn)數(shù)據(jù)源數(shù)據(jù),不能直接修改const defaultStore={ count:1}//reducer出函數(shù) function reducers(state=defaultStore,action){ if(action.type=="incr"){ return{ count:state.count+1 } } return state}//創(chuàng)建唯一倉庫const store = createStore( reducers,)export default store
步驟2:組件中獲取數(shù)據(jù)并設(shè)置數(shù)據(jù)
import React,{Component} from "react"import store from "./store"export default class App extends Component{ constructor(props){ super(props) this.state = store.getState() store.subscribe(()=>{ this.setState(state=>store.getState()) }) } render(){ return( ) } incr=()=>{ const actionCreator=>{ type:"incr", payLoad:1 } store.dispatch(actionCreator) }}
劃分reducer
原因:一個(gè)應(yīng)用只有一個(gè)state,單個(gè)reducer對(duì)數(shù)據(jù)操作很臃腫,so需要按照不同功能去拆分
注意:
- 分離reducer的時(shí)候,每一個(gè)reducer維護(hù)的狀態(tài)都應(yīng)該不同
- 通過store.getState獲取到的數(shù)據(jù)也是會(huì)按照reducers去劃分的
- 劃分多個(gè)reducer的時(shí)候,默認(rèn)狀態(tài)只能創(chuàng)建在reducer中,因?yàn)閯澐謗educer的目的,就是為了讓每一個(gè)reducer都去獨(dú)立管理一部分狀態(tài)
React-Redux是Redux的官方針對(duì)React開發(fā)的擴(kuò)展庫。
你可以理解為react-redux就是redux給我們提供一些高階組件
安裝
npm i -S redux react-redux
兩個(gè)核心的api
語法格式為:
connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)(component)
一般來說只會(huì)用到前面兩個(gè),它的作用是:
store.getState()
轉(zhuǎn)化為展示組件的props
actionCreators
轉(zhuǎn)化為展示組件props
上的方法使用
步驟1:定義Provider
import React from "react"import ReactDOM from "react-dom"import { Provider } from "react-redux"import store from "./store"import App from "./App"ReactDOM.render( ,document.getElementById("root"))
步驟2:子程序中使用connect
store.getState()
轉(zhuǎn)化為展示組件的props
actionCreators
轉(zhuǎn)化為展示組件props
上的方法傳統(tǒng)使用方式
import React ,{Component} from "react"import {connect} from "react-redux"import * as actions frm "./countAction"class App exteds Component{ render(){ return ( {this.props.count} ) } incr=()=>{ this.props.incr() }}const mapStateProps=state=>{ return {count:state.count}}const mapPropsToDIspatch=dispatch=>{ return{ incr(){ dispatch(actions.incr()) } }}export default connect(mapStateProps,mapPropsToDIspatch)(App)
裝飾器使用方式(推薦使用)
import React ,{Component} from "react"import {connect} from "react-redux"import * as actions frm "./countAction"const mapStateProps=state=>{ return {count:state.count}}const mapPropsToDIspatch=dispatch=>{ return{ incr(){ dispatch(actions.incr()) } }}@connect(mapStateProps,mapPropsToDIspatch)class App exteds Component{ render(){ return ( {this.props.count} ) } incr=()=>{ this.props.incr() }}
通常情況下,action只是一個(gè)對(duì)象,不能包含異步操作,這導(dǎo)致了很多創(chuàng)建action的邏輯只能寫在組件中,代碼量較多也不便于復(fù)用,同時(shí)對(duì)該部分代碼測(cè)試的時(shí)候也比較困難.
常見的異步庫:
基于Promise的異步庫:
安裝
npm i -S redux-thunk
使用
在createStore實(shí)例store中使用
import {createStore, applyMiddleware} from "redux"import thunk from "redux-thunk"import reducer from "./countReducer"const store = createStore( reducer, applyMiddleware(thunk))export default store
countReducer.js
const incrAction = num=>({ type:"incr", payload:num})export const incr=>90=>dispatch=>{ setTimeout(()=>{ let num=10 dispatch(incrAction(num)) },1000)}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/123996.html
摘要:我現(xiàn)在寫的這些是為了解決和這兩個(gè)狀態(tài)管理庫之間的困惑。這甚至是危險(xiǎn)的,因?yàn)檫@部分人將無法體驗(yàn)和這些庫所要解決的問題。這肯定是要第一時(shí)間解決的問題。函數(shù)式編程是不斷上升的范式,但對(duì)于大部分開發(fā)者來說是新奇的。規(guī)模持續(xù)增長的應(yīng) 原文地址:Redux or MobX: An attempt to dissolve the Confusion 原文作者:rwieruch 我在去年大量的使用...
摘要:想學(xué)習(xí)下全家桶中的,剛好看到了阮一峰老師的入門文章,受益匪淺。官方的解釋是是容器,提供可預(yù)測(cè)化的狀態(tài)管理。和,寓意為派遣。這是發(fā)出的唯一方法。另外方法會(huì)返回一個(gè)函數(shù),我們?nèi)绻獬O(jiān)聽,就可以調(diào)用這個(gè)函數(shù)。 背景 我:您好!我對(duì)此職位感興趣,可以聊聊嗎? 招聘者:您好!感謝關(guān)注。方便發(fā)一份您的簡歷嗎? 幾分鐘后。。。 招聘者:請(qǐng)過用過react嗎? 我:只看過一些項(xiàng)目,...
摘要:但這樣做的缺點(diǎn)很多,不利于狀態(tài)在組件之間共享。所以本篇使用作為狀態(tài)管理器來實(shí)現(xiàn)時(shí)間旅行。并且從中可以看出過程不僅僅向?qū)ο笾刑砑右粋€(gè)狀態(tài)對(duì)象,還對(duì)進(jìn)行了加一操作,這是為了保證狀態(tài)與保持同步。 距離上一次更新已經(jīng)有半個(gè)月了,這半個(gè)月來主要在忙兩件事:一個(gè)是最近老板給了個(gè)自動(dòng)化測(cè)試任務(wù),另一個(gè)是和學(xué)校的弟弟一起搞一個(gè)微信小游戲...emmmm!其實(shí)主要是懶!!! 本篇是作為上篇的續(xù)集,不知道...
摘要:前端每周清單半年盤點(diǎn)之與篇前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實(shí)踐深度閱讀開源項(xiàng)目巔峰人生等欄目。與求同存異近日,宣布將的構(gòu)建工具由遷移到,引發(fā)了很多開發(fā)者的討論。 前端每周清單半年盤點(diǎn)之 React 與 ReactNative 篇 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為...
閱讀 4032·2021-11-22 13:53
閱讀 3627·2021-11-19 11:29
閱讀 1282·2021-09-08 09:35
閱讀 3175·2020-12-03 17:26
閱讀 520·2019-08-29 16:06
閱讀 2118·2019-08-26 13:50
閱讀 1189·2019-08-23 18:32
閱讀 2159·2019-08-23 18:12