vue 项目总结一组件开发

上一篇文章 //www.greatytc.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阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 少时远游心仓促 风撼浪涌无回路 回首渺茫迹无数 身影两双亦相顾
    一树山阅读 193评论 0 1
  • 风有些大 雨也不见停 夜深了 你来了 你总来我的梦里 梦里总有你 突然惊醒 原来是梦 现在外面风很大 被子里很冷 ...
    仙妒芮菈阅读 191评论 1 0
  • 文/创意家居研发生产厂家纽比家居熊山村 看了最短小说《谁“病”的不轻》,我苦苦的笑了: 一位小伙骑车上...
    山村熊阅读 467评论 0 1