vue 項目總結一組件開發

上一篇文章?http://www.lxweimin.com/p/674e75b41642?介紹了項目里文件夾的作用分類和作用,這次主要說明 src 文件夾里具體的文件分類和內容。



先上 src 文件夾的結構圖:


src



App.vue: 根組件,pages 里的組件會被插入此組件中,此組件再插入 index.html 文件里,形成單頁面應用

根組件里面是這樣子的:


App.vue

其中,<router-view>?組件是一個 functional 組件,渲染路徑匹配到的視圖組件。渲染的組件還可以內嵌自己的,根據嵌套路徑,渲染嵌套組件。這樣,就實現了單頁面下,根據不同路由,渲染不同組件的目的。

基本上根組件沒什么交互要做,底部的樣式其實也可以放在全局的樣式表里。



main.js: 入口 js 文件,影響全局,作用是引入全局使用的庫、公共的樣式和方法、設置路由等。

這個是負責配置影響全局的內容的文件,具體會有以下幾種作用:

????1、引入vue 以及相關的庫

? ??import Vue from 'vue'? //引入 vue

????import store from './store'? //引入 vuex

????import router from './router';? //引入路由配置文件

????import App from './App'? //引入根組件

? ??2、引入需要用到的第三方庫

????// 引入element-ui

????import ElementUI from 'element-ui';

????import 'element-ui/lib/theme-default/index.css';

????Vue.use(ElementUI);

????// 引入字體圖標樣式,這里使用了阿里媽媽的 iconfont 字體庫

????import '@assets/iconfont/iconfont.css';

????import '@assets/iconfont/iconfont.js';

????// 引入copy 信息組件

????import VueClipboards from 'vue-clipboards';

????Vue.use(VueClipboards);

????// 引入 axios 庫

????import axios from 'axios'

????// 引入 d3 圖形庫

????import * as d3 from 'd3'

????// 引入國際化的庫

????import VueI18n from 'vue-i18n';

????Vue.use(VueI18n);

????//引入自定義的 json 格式中英文對照文件

????import zh from '@assets/lang/zh-CN'

????import en from '@assets/lang/en-US'

????Vue.config.lang = 'zh-cn'? //設置默認中文

????Vue.locale('zh-cn', zh)

????Vue.locale('en', en)

????// 引入時間轉換模塊

????import moment from 'moment';

????moment.locale('zh-cn');

????Vue.prototype.$moment = moment;? //將 moment 模塊轉換成 Vue 的原型方法,在組件里可以直接使用 this.$moment(time)

????// 引入圖表

????import ECharts from 'vue-echarts';

????Vue.component('chart', ECharts);? //注冊 Echarts 成為全局組件,在組件里可以直接調用 <chart></chart>

? ??3、引入自定義的庫

????// 引入銀行卡圖標樣式

????import '@assets/icon-bank/iconfont.js';? // iconfont 上收集的銀行卡圖標

????// 引入自定義的http模塊

????import { AjaxApi } from '@http/AjaxApi.js';? //http 文件夾里自定義的處理 api 接口的文件,導出一個包含所有與后臺接口交流的函數的對象

????Vue.prototype.$axios = AjaxApi;? //加入 Vue 原型方法,組件里通過 this.$axios.xxx() 調用

????// 引入公共方法

????import commonMixins from '@mixins/common-mixins.js';? //mixins 文件夾里自定義的通用函數的集合

????Vue.mixin(commonMixins);? //全局注冊混合

? ??4、引入自定義的公共樣式,使得組件內可以用scoped定義自身的樣式

????// 引入公共樣式以及修改過的 element 樣式

????import '@assets/css/common.less'

????import '@assets/css/theme.less'

? ??5、定義一些簡短的不需要單獨引入的修改

????// 在html5 history 模式下,在form表單的組件(input輸入框等)里點擊enter,會自動將表單數據以get的方式發送到后臺,需要阻止默認事件

????document.onkeydown = function(e) {

????????var e = e || event;

????????if(e.keyCode == 13) {

????????????????e.preventDefault ? e.preventDefault() : (e.returnValue = false);

????????}

? ? };

????// 格式化金額,每三位加逗號,可選保留幾位小數

????Number.prototype.format = function(n, x) {

????????var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\.' : '$') + ')';

????????return this.toFixed(Math.max(0, ~~n)).replace(new RegExp(re, 'g'), '$&,');

????};

????6、設置vue的全局配置,在啟動應用前應用

????Vue.config.productionTip = false;? // 阻止 vue 在啟動時生成生產提示

????7、指定渲染的文件

????new Vue({

????????el: '#app',

????????template: '<App/>' ,

????????router,

????????store,

????????components: { App }

????})



assets: 放置靜態資源,包括公共的 css 文件、 js 文件、iconfont 字體文件、img 圖片文件以及其他資源類文件。

結構如下:


assets

css 文件夾里會有重置 css 樣式的文件以及其他全局樣式文件。

js 文件夾里放置了包含銀行字典和全國省市的字典文件,在組件里引用之后遍歷獲取數據。



components: 放置通用模塊組件。項目里總會有一些復用的組件,例如彈出框、發送手機驗證碼、圖片上傳等,將它們作為通用組件,避免重復工作;

結構如下:


components

可以根據功能模塊建立文件夾,放置本功能會用到的通用組件。例如 login 文件夾里可以放置注冊、登錄、重置密碼這幾個功能會用的共同模塊文件(賬號、密碼、圖形驗證碼、短信驗證碼); account-center 文件夾放置修改賬號相關的模塊。

全局通用的公共模塊可以不需要建立文件夾。



http: 放置與后臺 api 相關的文件。這里面有 axios 庫的實例配置文件、使用配置的 axios 實例接入 api 獲取數據的函數的集合的文件;

結構如下:


http

config.js 是根據項目需求配置的 axios 實例文件,通過 axios.create([config]) 創建,可以配置諸如指定成功的狀態碼、序列化 params、設置 headers 、修改 token 、設置全局請求/響應攔截器、設置 baseURL 等。

AjaxApi.js 是通過導入 config.js 實例,傳入 API 和其他參數,給每個 API 配置一個專屬函數,再集合導出成對象的文件。例子如下:


AjaxApi



mixins: 放置混合選項的文件。具體來說,相當于是公用函數的集合,在組件中引用時,可以作用于組件而不必書寫重復的方法

實際上相當于是沒有 <template/> 和 <style/> 的組件,例子如下:


mixins



pages: 放置主要頁面的組件。例如登錄頁、用戶信息頁等。通常是這里的組件本身寫入一些結構,再引入通用模塊組件,形成完整的頁面

這里面就是會被插入根組件的 <router-view/> 節點里的文件,根據路由變化,根組件渲染不同的文件。



router: 放置路由設置文件,指定路由對應的組件

結構如下:

import Vue from 'vue';

import Router from 'vue-router';

import Tab from '@pages/tab';

import { MessageBox } from 'element-ui';

Vue.use(Router);

const router = new Router({? //新建路由

????routes: [

????????{

????????????path: '/',

????????????redirect: '/signin'? //重定向路由

????????},

????????{

????????????path: '/signin',

????????????name: 'signIn',? //命名路由

????????????component: (resolve) => {? //按需加載

????????????????require(['@pages/sign-in'], resolve);

? ? ? ? ? ? ? }

? ? ? ? ? },

????????{

? ? ? ? ? ? path: '/signup',

????????????name: 'signUp',

????????????component: (resolve) => {

????????????????require(['@pages/sign-up'], resolve);

????????????????}

????????????},

????????????{

????????????????path: '/tab',

????????????????component: Tab,

????????????????children: [? //嵌套路由

????????????????????{

????????????????????????path: 'index',

????????????????????????name: 'index',

????????????????????????component: (resolve) => {

????????????????????????require(['@pages/index'], resolve);

????????????????????????}

????????????????????}

????????????????]

????????????}

????????]

????});

router.beforeEach((to, from, next) => {? //檢測 token ,跳轉登錄頁

? ? if (checkPathRequiredAuth(to.path) && !sessionStorage.token) {

????????sessionStorage.clear();

????????MessageBox({

????????????title: '跳轉提示',

????????????message: '用戶認證已過期或不存在,確認后跳轉到登錄頁',

????????????confirmButtonText: '確定',

????????????type: 'warning',

????????????callback: action => {

????????????????next({

????????????????????path: '/signin'

????????????????});

????????????}

????????});

????} else {

????????next();

????}

});

export default router;



store: 放置 vuex 需要的狀態關聯文件,設置公共的 state、mutations 等

結構如下:


store

根據需要,可以加上 getter.js 或者將 store 分割成 modules , 在每個 modules 文件夾里創建對應的 js 文件。



下次會總結項目里的到的經驗,怎樣解決問題之類的。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容

  • 少時遠游心倉促 風撼浪涌無回路 回首渺茫跡無數 身影兩雙亦相顧
    一樹山閱讀 200評論 0 1
  • 風有些大 雨也不見停 夜深了 你來了 你總來我的夢里 夢里總有你 突然驚醒 原來是夢 現在外面風很大 被子里很冷 ...
    仙妒芮菈閱讀 201評論 1 0
  • 文/創意家居研發生產廠家紐比家居熊山村 看了最短小說《誰“病”的不輕》,我苦苦的笑了: 一位小伙騎車上...
    山村熊閱讀 490評論 0 1