摘要:傳統(tǒng)與對比開發(fā)時,我們需要,等文件,并且需要自行分類,不太清晰。因?yàn)榈臄?shù)據(jù)流是單向的,用戶行為視圖變化視圖更新,組件可以在鉤子中決定是否允許當(dāng)前組件內(nèi)的數(shù)據(jù)流動,函數(shù)式組件只能被動接收數(shù)據(jù)流動。這是第三方登陸,如果是內(nèi)部登陸使用跳轉(zhuǎn)。
什么是dva
dva 是一個基于 redux 和 redux-saga 的數(shù)據(jù)流方案.
為什么使用dva因?yàn)樗喕藃eact引入redux的過程。
傳統(tǒng)redux與dva對比redux:
開發(fā)時,我們需要action,reducer等文件,并且需要自行分類,不太清晰。
dva:
開發(fā)時,把 store 及 saga 統(tǒng)一為一個 model 的概念, 寫在一個 js 文件里面,分類清晰。
增加了一個 Subscriptions, 用于收集其他來源的 action。
HelloWorldModel.js
export default { namespace: "HelloWorldModel", state: {str:"hi"}, reducers: { }, };
這是react組件的創(chuàng)建:
class HelloWorld extends Component { constructor() { super() this.state = { } } sayHi () { alert("this.props.HelloWorldModel.str) } render () { return (Hello World) } } export default connect(({ HelloWorldModel }) => ({ HelloWorldModel, }))(HelloWorld);
函數(shù)式組件
const HelloWorld = (props) => { const sayHi = (event) => alert(this.props.HelloWorldModel.str) return (屬性與狀態(tài)Hello World) } export default connect(({ HelloWorldModel }) => ({ HelloWorldModel, }))(HelloWorld);
頁面的數(shù)據(jù)分為2大類:
1.頁面屬性:Modal打開或者關(guān)閉,與用戶行為相關(guān),與后臺數(shù)據(jù)無關(guān)
2.頁面狀態(tài):Table展示的數(shù)據(jù)內(nèi)容,與用戶行為無關(guān),與后臺數(shù)據(jù)相關(guān)
我通常在react組件中直接使用state作為頁面屬性,將頁面狀態(tài)存在model中,
而函數(shù)式組件,則將頁面屬性和狀態(tài)全部存放在model中。
上面是react組件和函數(shù)式組件的寫法區(qū)別,
通過react組件寫法聲明的組件繼承了“react.Component”的一些屬性及方法,如生命周期鉤子函數(shù)等。
而函數(shù)式組件只是個返回dom節(jié)點(diǎn)的方法,所以不具備生命周期函數(shù)。
因?yàn)閐va的數(shù)據(jù)流是單向的,
用戶行為=》視圖=》model.Effect=>model.Reducer=>store變化=>視圖更新,
react組件可以在“componentWillReceiveProps”鉤子中決定是否允許當(dāng)前組件內(nèi)的數(shù)據(jù)流動,
函數(shù)式組件只能被動接收數(shù)據(jù)流動。
如上述代碼,頁面與model的綁定,是通過connect方法實(shí)現(xiàn)的,在connect方法中,入?yún)⒖梢宰ト〉剿袑?dǎo)入的model文件,我們可以在每個組件中(需要關(guān)聯(lián)model的)“重載”connect方法,只獲取我們當(dāng)前頁面所需的model,展示在頁面上。而頁面的事件則可以使用dispatch觸發(fā)model的Effect事件與服務(wù)端交互之后執(zhí)行reducer,store(model數(shù)據(jù))變化后,頁面因?yàn)閏onnect了model,相當(dāng)于訂閱了model的變化,數(shù)據(jù)流入,頁面更新。
公共狀態(tài)抽離一些公用的狀態(tài)是可以抽離到同一個model中的,如登錄態(tài),上一次查詢參數(shù)等。
實(shí)際應(yīng)用中的一些解決方案 動態(tài)組件dva提供dynamic方法支持動態(tài)加載組件和model,
import dynamic from "dva/dynamic"; const UserPageComponent = dynamic({ app, models: () => [ import("./models/users"), ], component: () => import("./routes/UserPage"), });
通過動態(tài)加載后,build出來的文件將index.js切割成index.js(體積變小) + 1.async.js等等,
但是index.js默認(rèn)是通過"./"來加載1.async.js的,對于前端靜態(tài)資源與服務(wù)端應(yīng)用不在同一臺服務(wù)器的情況,如
java boot應(yīng)用 發(fā)布在http://xxx.com/a =》 a.ftl 中引用 dva build之后的靜態(tài)資源,而靜態(tài)資源發(fā)布卻是在另一臺服務(wù)器上http://zzz.com/dvaBuild/dist,
index.js還是去訪問默認(rèn)的"./1.async.js" 其實(shí)訪問的是http://xxx.com/a/1.async.js,...。
可以直接在頁面script標(biāo)簽中,
window.__webpack_public_path__ = "http://zzz.com/dvaBuild/dist";路由跳轉(zhuǎn) 權(quán)限判斷(接入第三方登陸)
1.是否登陸
在GlobalModel中保存著登錄態(tài),路由中使用AuthComponent替換Route,在渲染路由組件的時候就會判斷是否登陸,如果沒有登陸渲染正在登陸loading頁面,等待第三方登陸接口判斷已經(jīng)登陸,頁面會自動更新為路由組件。
這是第三方登陸,如果是內(nèi)部登陸使用react-router跳轉(zhuǎn)。
AuthComponent
@connect(({GlobalModel}) => GlobalModel) export default class AuthComponent extends PureComponent { render() { const { component: Component, isLogin, ...rest } = this.props; return (isLogin == 1 ? ( ) : ( ) } /> ) } }
GlobalModel
effects: { *CheckLogin({payload,callback}, {call,select,put}) { const loginfoResult = yield call(getLoginInfo); if(loginfoResult && loginfoResult.ResponseStatus && loginfoResult.ResponseStatus.Ack == "Success" && loginfoResult.userBasicInfoDTO){ if(loginfoResult.userBasicInfoDTO && loginfoResult.userBasicInfoDTO.userAccount && checkPermission(loginfoResult.userBasicInfoDTO.userAccount)){ yield put({type:"save",loginInfo:loginfoResult}) callback(); }else{ yield put( routerRedux.push("/NoPermission") ); //沒有權(quán)限 } }else{ window.location.href = getLoginUrl(); } },
需要在各個路由頁面綁定的model的路由切換訂閱方法中做登陸判斷,
頁面切換就要判斷是否登陸或鑒權(quán)
subscriptions: { setup({ dispatch, history }) { // eslint-disable-line return history.listen((location) => { dispatch({ type: "GlobalModel/onShow", callback: () => { dispatch({type:"BaseInfoQuery",payload:{}}); } }) }) },
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74185.html
摘要:傳統(tǒng)與對比開發(fā)時,我們需要,等文件,并且需要自行分類,不太清晰。因?yàn)榈臄?shù)據(jù)流是單向的,用戶行為視圖變化視圖更新,組件可以在鉤子中決定是否允許當(dāng)前組件內(nèi)的數(shù)據(jù)流動,函數(shù)式組件只能被動接收數(shù)據(jù)流動。這是第三方登陸,如果是內(nèi)部登陸使用跳轉(zhuǎn)。 什么是dva dva 是一個基于 redux 和 redux-saga 的數(shù)據(jù)流方案. 為什么使用dva 因?yàn)樗喕藃eact引入redux的過程。 ...
摘要:是一個用開發(fā)的一個企業(yè)級中后臺管理包含常用的業(yè)務(wù),組件,及數(shù)據(jù)流轉(zhuǎn)方案,前后端分離的開發(fā)方式,按業(yè)務(wù)劃分的目錄結(jié)構(gòu),可以大大提高我們的開發(fā)效率下面是整體的介紹,感興趣的同學(xué)可以去官網(wǎng)詳加了解。 dva-boot-admin 是一個用React開發(fā)的一個企業(yè)級中后臺管理UI,包含常用的業(yè)務(wù),組件,及數(shù)據(jù)流轉(zhuǎn)方案,前后端分離的開發(fā)方式,按業(yè)務(wù)劃分的目錄結(jié)構(gòu),可以大大提高我們的開發(fā)效率 下面...
摘要:快速開始下載碼云高速下載安裝執(zhí)行包安裝,如無,請先執(zhí)行自動創(chuàng)建數(shù)據(jù)庫配置必須使用必須使用必須使用運(yùn)行更新月報年月年月年月年月年月年月年月年月年月下載地址碼云一點(diǎn)說明月將發(fā)布用戶中心模塊和模塊,月月后續(xù)還會有商城模塊微信模塊 前言 大多數(shù) node.js 框架都沒解決架構(gòu)問題,使得 node.js 沒能像 spring 一樣的適合大型項(xiàng)目開發(fā)和維護(hù)的框架。 nest.js 出現(xiàn)改變了這種...
摘要:官方推薦結(jié)合使用更配哦,其實(shí)他們都是同一位開發(fā)者開發(fā)的,屬于阿里內(nèi)部開源框架。但是名字必須為,不然不能自動注冊。只有一個的話,可以不用建目錄。可能是我理解有誤。 umi官方推薦結(jié)合dva使用更配哦,其實(shí)他們都是同一位開發(fā)者開發(fā)的,屬于阿里內(nèi)部開源框架。 1 修改.umirc.js,開啟dva支持 // ref: https://umijs.org/config/ export def...
閱讀 3692·2021-09-07 10:19
閱讀 3637·2021-09-03 10:42
閱讀 3591·2021-09-03 10:28
閱讀 2559·2019-08-29 14:11
閱讀 816·2019-08-29 13:54
閱讀 1603·2019-08-29 12:14
閱讀 423·2019-08-26 12:12
閱讀 3621·2019-08-26 10:45