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