一、常用的幾個目錄:
config :配置文件
config.js :路由定義文件&&代理路徑文件
defaultSettings.js :主題顏色以及標題配置文件
plugin.config.js :沒怎么用過的配置文件
mock:mock數據文件,用於本地開發使用
public:靜態圖片資源
src :開發項目文件(主要在此目錄下進行發)
assets :存放平台logo
components :全局組件文件夾
layouts :全局布局文件
locales:國際化文件
models :數據倉庫,每個文件都需要一個命名空間 ,定義全局請求函數
pages:頁面文件
service : 全局service 發起請求文件
utils :工具文件 其中會有自定義request.js
平時主要用4個文件:mock、page、models、services
二、module內容具體分析
在model中存在 namespace(命名空間,用來區分不同的頁面之間的數據),state(該命名空間下的數據),effects(一些異步請求的api方法定義在這里),reducers(用來修改state的一些函數定義在reducers下)
文件包含以下幾個模塊(實際上都是javascript對象):
state => 數據構成
effects => 處理異步action,采用generator的相關概念,將異步轉化成同步寫法。
reducers => 處理同步action,相當於redux中的reducer函數,純函數(即相同的輸入得到相同的輸出)
routes 業務組件,通常是需要連接數據倉庫的組件。我們通過connect連接數據倉庫之后可以通過this.props獲取到數據和dispatch方法,並使用dispatch派發action來達到更新state(即更新數據倉庫)的操作。
components 通用組件(純組件),通常是一些復用性很強的組件,不需要連接數據倉庫。通過props傳遞數據,父組件傳遞相同的props,會渲染相同的頁面。不做任何業務上的處理。
services 所有的請求都寫在這里,官方已經為我們封裝了request方法,我們只需要傳入參數即可。
三、整體的一個運行流程如下:
進入頁面,在頁面的componentDidMount鈎子函數中調用model的effect中的方法,該方法調用service文件夾下的統一管理的請求函數。
獲取到服務器返回值,在model的effect中拿到,並且調用model下的reducer,調用model的reducers對請求的數據進行處理,將model的state進行改變,頁面自動進行渲染。
四、在工作中的例子
mock(一開始使用假數據模式)
1 let list = [],//所有數據 2 id = 123; 3 4 //初始化 5 for(let i =1,i<21;i++){ 6 const item = { 7 appId:"T"+(100+i), 8 appName:`應用${i}`, 9 status:(i % 3).toString() 10 }; 11 list.unshift(item); 12 } 13 const OK = { 14 domain:null, 15 type:"s", 16 code:"AAAAA" 17 }; 18 const createApplication = (req,res) =>{ 19 const newData = {...req.body.tAtpApplication,appId:"T" +id++}; 20 list.unshift(newData); 21 res.json:{ 22 reply:{ 23 returnCode:ok, 24 tAtpApplication:newData 25 } 26 }); 27 } 28 const deleteApplication = (req,res) =>{ 29 list.forEach((item,index)=>{ 30 if(item.appId == req.body.appId){ 31 list.splice(index,1) 32 } 33 }); 34 res.json:{ 35 reply:{ 36 returnCode:ok, 37 tAtpApplication:req.body 38 } 39 }); 40 } 41 . 42 . 43 . 44 export default { 45 "POST /api/queryApplicationList" :queryApplicationList, 46 "POST /api/createApplicationList" :createApplicationList, 47 "POST /api/deleteApplicationList" :deleteApplicationList, 48 }
module
1 import{ 2 queryApplicationList, 3 createApplication, 4 deleteApplication 5 } form "@/services/autotest/application"; 6 7 export default { 8 namespace:"autotestApplication", 9 state:{ 10 data:{} 11 } 12 } 13 14 effects:{ 15 *queryApplicationList({payload,callback},{call,put}){ 16 const response = yieId call (queryApplicationList,payload); 17 if (response.returnCode.type ==="s"){ 18 yieId put({ 19 type:"save", 20 data:response.tAtpApplication, 21 //data:response 22 }); 23 if (callback) callback(); 24 } 25 . 26 . 27 . 28 reducers:{ 29 save(state,action){ 30 return {...state,data:action.data || {} }; 31 }, 32 }
service
1 import request from "@/utils/request"; 2 3 export async function queryApplicationList(payload){ 4 return request("/api/queryApplicationList",{ 5 method:"POST", 6 data:payload 7 }): 8 } 9 export async function createApplicationList(payload){ 10 return request("/api/createApplicationList",{ 11 method:"POST", 12 data:payload 13 }): 14 } 15 export async function deleteApplicationList(payload){ 16 return request("/api/deleteApplicationList",{ 17 method:"POST", 18 data:payload 19 }): 20 }
pages
1 ...略 2 @connect (({autotestApplication}) =>({ 3 data:autotestApplication.data 4 })) 5 class Application extends Component { 6 constructor (props){ 7 super(props); 8 this.state = { 9 data:[] 10 } 11 } 12 } 13 14 componentDidMount(){ 15 this.queryAppList(this.state.param); 16 } 17 18 //刪除應用 19 handleDelete = key =>{ 20 const {dispatch} = this.props; 21 dispatch({ 22 type:"autotestApplication/deleteApplication", 23 payload:{appId:key}, 24 callback:()=>{ 25 } 26 this.queryAppList 27 }