前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端项目搭建实战(Vue)

前端项目搭建实战(Vue)

原创
作者头像
逃跑计划
发布于 2022-08-03 13:04:15
发布于 2022-08-03 13:04:15
1.8K00
代码可运行
举报
文章被收录于专栏:我的前端体系我的前端体系
运行总次数:0
代码可运行

网上开源的前端框架都写得很好,但是功能比较庞杂,于是着手搭建了一套自己的模板:

1.路由配置

首先我们要通过路由配置整体的页面结构(Home、About、Login)

代码语言:javascript
代码运行次数:0
运行
复制
Vue.use(VueRouter);

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue'),
  },
  {
    path: '/login',
    name: 'Login',
    component: () => import('../views/Login.vue'),
  },
];

const router = new VueRouter({
  routes,
});

同时我们需要对路由做一定的控制,比如未登录时只允许访问登录页,以及对页面跳转做一些样式上的优化。

代码语言:javascript
代码运行次数:0
运行
复制
router.beforeEach((to, from, next) => {
  // 虚拟进度条,采用 NProgress 组件
  NProgress.start();
  let token = cookies.get('token');
  // 如果没有 token 则跳到登录页
  if (!token) {
    if (to.fullPath !== '/login') {
      next({ path: '/login' });
    } else {
      next();
    }
    return NProgress.done();
  } else {
    // 如果有 token 访问登录页则跳到首页;刷新时自动获取角色信息保存在 vuex 中
    if (!store.state.role) {
      const role = GET_ROLE();
      store.commit('setState', role);
    }
    if (to.fullPath === '/login') {
      next({ path: '/' });
    } else {
      next();
    }
    NProgress.done();
  }
});

2.Vuex 全局状态管理

在路由配置中我们将角色信息存储在了 Vuex 中,Vuex 的配置如下:

代码语言:javascript
代码运行次数:0
运行
复制
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    // 角色信息
    role: '',
  },
  mutations: {
    setState(state, role) {
      state.role = role;
    },
  },
  actions: {},
  modules: {},
});

在页面中我们可以通过 mapState 访问 store 中的数据

代码语言:javascript
代码运行次数:0
运行
复制
import { mapState } from 'vuex';
computed: mapState(['role']),

<h3>我是:{{ role }}</h3>

3.组件库选用 Element-ui

组件库的选用纯看个人喜好

代码语言:javascript
代码运行次数:0
运行
复制
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

4.自定义过滤器

自定义时间过滤器,在 main.js 全局注册时间过滤器,传入模板字符串解析为对应格式

代码语言:javascript
代码运行次数:0
运行
复制
// 定义时间过滤器
Vue.filter('dateFormat', function (originDate, pattern) {
  // 根据给定的时间字符串,得到特定的时间
  var dt = new Date(originDate);
  var y = dt.getFullYear();
  var m = (dt.getMonth() + 1).toString().padStart(2, '0');
  var d = dt.getDate().toString().padStart(2, '0');
  var hh = dt.getHours().toString().padStart(2, '0');
  var mm = dt.getMinutes().toString().padStart(2, '0');
  var ss = dt.getSeconds().toString().padStart(2, '0');
  return eval('`' + pattern + '`');
});

在页面中使用

代码语言:javascript
代码运行次数:0
运行
复制
<h3>当前时间:{{ time | dateFormat('${y}-${m}') }}</h3>
time
time

5.自定义指令

在 main.js 中注册全局指令

代码语言:javascript
代码运行次数:0
运行
复制
// 权限指令
Vue.directive('perm', {
  // 绑定元素插入父节点时触发
  inserted: (el, binding) => {
    const hasPermission = (roleArr) => {
      return roleArr.includes(store.state.role);
    };
    if (!hasPermission(binding.value)) {
      // 如果不满足条件,则移除当前绑定节点
      el.parentNode.removeChild(el);
    }
  },
});

在页面中使用,当角色为 admin 时,第一行不显示

代码语言:javascript
代码运行次数:0
运行
复制
<h3>
学生可以看到: 我是<span v-perm="['student']">{{ role }}</span>
</h3>
<h3>大家可以看到: 我是<span v-perm="['student', 'admin']">{{ role }}</span>
</h3>
directive
directive

6. svg 封装

新建 SvgIcon.vue 文件

代码语言:javascript
代码运行次数:0
运行
复制
<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName" />
  </svg>
</template>

<script>
export default {
  name: 'SvgIcon',
  props: {
    // svg图标名称
    name: {
      default: '',
    },
    // 自定义样式
    className: {
      type: String,
      default: '',
    },
  },
  computed: {
    iconName() {
      return `#icon-${this.name}`;
    },
    svgClass() {
      return ['svg-icon', this.className ? this.className : ''];
    },
  },
};
</script>

<style scoped>
.svg-icon {
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

全局注册该组件

代码语言:javascript
代码运行次数:0
运行
复制
Vue.component('SvgIcon', SvgIcon);

这样我们就可以通过 SvgIcon 访问内存中存在的 svg 图标了,我们还需要做的就是将 svg 文件加载到内存中,

svg-sprite-loader 的官方解释是:一个用于创建 svg 雪碧图的 Webpack 加载器。这个加载器现在已经被 JetBrains 公司收录和维护了。通俗的讲:svg-sprite-loader 会把你引入的 svg 塞到一个个 symbol 中,合成一个大的 svg,最后将这个大的 svg 放入 body 中。symbol 的 id 如果不特别指定,就是你的文件名。

代码语言:javascript
代码运行次数:0
运行
复制
chainWebpack(config) {
  // 配置路径别名
  config.resolve.alias.set('components', resolve('src/components'));
  // 已有配置排除掉svg
  config.module.rule('svg').exclude.add(resolve('src/svg'));
  // 添加svg-sprite-loader
  config.module
    .rule('icons')
    .test(/\.svg$/) // 设置test
    .include.add(resolve('src/svg')) // 加入include
    .end() // add完上下文进入数组,使用end回退
    .use('svg-sprite-loader') // 添加loader
    .loader('svg-sprite-loader') // 切换上下文到loader
    .options({ symbolId: 'icon-[name]' })
    .end();
},

// main.js -- 将 svg 文件引入内存中
import '@/svg/icons';
// icons.js
const req = require.context('../svg', false, /\.svg$/);
req.keys().map(req);

这样就可以通过 name 属性访问 svg 了

代码语言:javascript
代码运行次数:0
运行
复制
<SvgIcon name="404" className="icon-style" />
svg
svg

7.axois 封装

axios 建议只做简单封装即可

代码语言:javascript
代码运行次数:0
运行
复制
import axios from 'axios';
import cookies from '@/utils/js-cookie';
// 创建请求实例
function createRequest() {
  const request = axios.create({
    baseURL: '/api',
    timeout: 10000,
  });

  request.interceptors.request.use((config) => {
    // 自动携带 token
    const token = cookies.get('token');
    config.headers.token = token;
    return config;
  });

  return request;
}

export const request = createRequest();

// api.js
import { request } from './service';

export function GET_BOOK_LIST() {
  return request({
    url: '/catalog/book/',
    method: 'get',
    headers: { 'content-type': 'application/x-www-form-urlencoded' },
    params: {
      type: 'book',
    },
  });
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
拍照5天,P图2年:AI帮人类第一次直接“看见”了黑洞
北京时间2019年4月10日21点整,在全球六地(比利时布鲁塞尔、智利圣地亚哥、中国上海和台北、日本东京和美国华盛顿)同时召开新闻发布会上,国际组织事件视界望远镜(EHT)发布了人类首张黑洞照片。
IT阅读排行榜
2019/04/24
6460
拍照5天,P图2年:AI帮人类第一次直接“看见”了黑洞
英雄联盟 源代码_c语言游戏源码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/04
3.9K0
游戏世界观构建思路——从核心体验出发
英雄联盟的世界观并不是游戏上线就有的,而是先上车后补票,在游戏上线后经历了漫长的过程构建起来的。从一个注重玩法、几乎没有世界观内容的IP,发展成了一套系统完整的世界观,并成功衍生出了《双城之战》这样一个破圈级别的动画作品。
腾讯ISUX
2022/11/01
2.3K0
游戏世界观构建思路——从核心体验出发
7本书告诉你,为什么拯救“流浪地球”的是人类,不是AI?
导读:大年初一,郭帆导演、刘慈欣作品改编的科幻大片《流浪地球》正式上映,十几天以来一直好评不断。对于电影情节,越来越多的人从不同角度提出自己的看法,即便是一些非常微小的细节,也能引发针锋相对的讨论。
IT阅读排行榜
2019/03/04
6190
7本书告诉你,为什么拯救“流浪地球”的是人类,不是AI?
腾讯最纯粹的一届WE大会:从黑洞、虫洞到克隆猴
一年一度的腾讯WE大会结束了,戳这里就能复习直播回放。 说到“复习”,和这次大会的主题 “雅努斯之门”倒有点异曲同工之妙:人类总是一边试图洞悉过去的奥秘,一边尽情畅想未来的可能。 于是,我们为你奉上腾讯WE大会专属“复习”套餐,内含: 一串顶尖科学家的金句暴击 一个可以“救命”的课题 一项青年科学家大奖 准备好接受庞大信息量的洗礼了吗? 一串顶尖科学家的金句暴击 虫洞并不会在宇宙当中自然产生,需要有高级文明有意识的去创造和维持。只有通过特殊材料的填充,虫洞才能存在。 —— 基普·索恩
腾讯大讲堂
2018/11/06
7540
腾讯最纯粹的一届WE大会:从黑洞、虫洞到克隆猴
跟随AI跨越每一个末日,直至宇宙终结!
最近在Mixlab博士吐槽互助群里,@Simon Meng分享了他的最新作品~~~
mixlab
2021/09/18
5520
跟随AI跨越每一个末日,直至宇宙终结!
NASA的下一个十年(译)
原文 MICHAEL ROSTON 从左起:木卫二;土卫六;火星上的的水手谷合成图;金星的拼接图 大多数人已经从人类第一次近距离观看冥王星的兴奋中冷静下来。NASA的下一个任务会是什么?在新视野号传
Peter Lu
2018/06/20
5240
CRISPR剪“封神”诺奖,瑞典皇家科学院没有选择张锋
今年一月份,有着诺奖风向标之称的“2020沃尔夫医学奖”颁给了CRISPR基因编辑技术两大女神:詹妮弗·杜德纳(Jennifer Doudna)和艾曼纽埃尔·查彭蒂尔(Emmanuelle Charpentier)。
AI科技评论
2020/10/27
4940
CRISPR剪“封神”诺奖,瑞典皇家科学院没有选择张锋
文史作家朱晖:我眼中的三国文化与王者荣耀
7月9日,《王者荣耀》上线新版本——以三国文化为内核打造的全新游戏版本“三分之地”。 在本次“三分之地”的研发过程中,《王者荣耀》和腾讯新文创研究院共同邀请外部专家参与共创,其中复旦大学文科资深教授葛剑雄担任《王者荣耀》学术顾问,提供价值观方面的指导意见;中国传媒大学副教授周逵、文史作家朱晖担任三分之地项目指导,深度支持内容共创。 我们邀请朱晖老师分享了他作为“三分之地”的项目指导的感受,以及对三国文化、游戏世界观构建等话题的理解。 文 | 朱晖 文史作家 《王者荣耀》三分之地项目指导 当我小时候
腾讯大讲堂
2020/10/28
7810
2022腾讯科学WE大会十周年:那些点亮科技树的人
文章转自“腾讯科学WE大会” 2022年腾讯科学WE大会,我们将迎来第十个年头。 十年前我们以「Way To Evolve」之名,种下科技的种子,探索未来的进化之路;围绕「Nothing but the Future」理念,我们和国内外顶级科学家一起「向未来,共生长」,描绘科学发展愿景;我们踏入「无境」之地,关注最前沿的科学领域;正因为这世界仿佛「若有光」,透过腾讯科学WE大会,一起看到未来的光;我们驻足在「雅努斯之门」,一面回望历史,一面朝向未来;我们来到「小宇宙」的深处,在微观的世界探索宏观的宇宙;「
腾讯高校合作
2022/11/02
9850
2022腾讯科学WE大会十周年:那些点亮科技树的人
【榜单】史上最经典36部AI电影大放送
新智元编译 来源:ZDNet 【新智元导读】端午节小长假如果不出去玩儿,可以在家看电影。ZDNet总结了36部最经典的AI电影,包括了《西部世界》和星球大战、星际迷航系列中的经典作品,挑一部你最喜
新智元
2018/06/22
5.4K0
【AI震撼时间线】通用AI约在2040年出现,2200年地球将达I 型文明
【新智元导读】为什么我们要冲出地球乃至银河系?据科学家估计,到2050年,世界人口将达93亿;1万年后,地球人类灭绝的概率为95%;1万亿年后,太阳将不复存在。研发人工智能,融合生物智能与机器智能,加速智能维度的多元化跃升,是为了人类更遥远的未来!
新智元
2018/08/01
8710
【AI震撼时间线】通用AI约在2040年出现,2200年地球将达I 型文明
主宰宇宙宿命的法则:揭秘物理世界的四大定律
大数据文摘作品,欢迎个人转发朋友圈;其他机构、自媒体转载,务必后台留言,申请授权。 素材来源:《星际穿越》 揭秘物理世界的四大定律 从17 世纪开始,物理学家们就在努力探索物理定律是如何构造并控制宇宙
大数据文摘
2018/05/21
1.9K0
今天,霍金没有提AI威胁论,他的新目标是带领人类移民外星球(附霍金姚期智Pete演讲实录+PPT)
今天,第五届腾讯WE大会在京举行,“超级网红”,“黑洞”理论提出者,剑桥大学教授史蒂夫霍金霍金,突破摄星执行董事、前NASA艾姆斯研究中心主任Pete Worden,量子计算专家、图灵奖获得者姚期智院士,未来学家Pablos Holman、科幻作家、“雨果奖”奖得主郝景芳等大咖发表演讲。其中,霍金、Pete Worden、姚期智这三位大咖都谈到了人类在地球之外建立家园的可能性,霍金更是带来了“摄星计划”的最新进展。AI科技大本营特别对这三位大咖的演讲进行编辑整理,希望对你有所帮助。 超级网红霍金:大胆
AI科技大本营
2018/04/26
6240
今天,霍金没有提AI威胁论,他的新目标是带领人类移民外星球(附霍金姚期智Pete演讲实录+PPT)
灵界的科学丨一、灵界在哪里?
二十世纪末的一九九八年时,两组天文学者宣布了一项石破天惊的发现:我们的宇宙充满了一种能量可以抵抗银河间的万有引力,导致宇宙正在加速膨胀,这股能量叫做暗能(dark energy),被当年科学上最重要的期刊之一《科学》(Science)选为当年度「科学的突破」(The Break of Science)。五年以后的二○○三年,美国的威尔金森微波非等向性探测卫星(WAMP)[1]以探测宇宙微波背景辐射所得的数据,再配合其他数据如史隆数位巡天计画(SDSS)[2]所得的上百万个银河的资料,再度证实宇宙具有大量的暗能,也被二○○三年《科学》期刊选为当年度「科学的突破」。
ApacheCN_飞龙
2022/11/24
2.7K0
灵界的科学丨一、灵界在哪里?
彭罗斯等三位研究黑洞的科学家共获诺贝尔物理学奖,他还是李飞飞的童年偶像
2020年诺贝尔物理学奖公布,三名分别来自英国、德国和美国的科学家共同获得诺贝尔物理学奖,以表彰他们在发现宇宙黑洞方面做出的贡献。
新智元
2020/10/10
7530
彭罗斯等三位研究黑洞的科学家共获诺贝尔物理学奖,他还是李飞飞的童年偶像
140亿岁的宇宙,多少文明存在又消亡过,为何没有文明通过虫洞找到我们?
可观测宇宙的直径大约有900亿光年。至少有1000亿个星系,每个星系拥有大概1000亿到10000亿颗恒星。
钱塘数据
2018/07/30
6170
140亿岁的宇宙,多少文明存在又消亡过,为何没有文明通过虫洞找到我们?
超震撼 | 地学最前沿的16幅动图
转自:矿业界 微信ID: MiningWorld 导读: 美国航空航天局的两颗遥感监测卫星阿库亚和特拉自2002年以来,每天在不同时间段交替发回地球遥感图片,为科学家监测地球环境变化提供了海量宝贵的
大数据文摘
2018/05/23
7240
史上曾被认为不可能的20个科学发现和难题(12k字)
科学Sciences导读:公号对话框发送“不可能的科学”获取12k字14图15页PDF史上曾被认为不可能的20个科学发现和难题。关键词:计算机(computer),数学家(mathematician)。QinlongGEcai微信被封,转向自用、科普文章、学术论文OAJ电子刊免费开放获取。
秦陇纪
2020/11/05
1.6K0
史上曾被认为不可能的20个科学发现和难题(12k字)
人工智能会威胁到基督教信仰吗?
JONATHAN MERRITT   朱思颖、蒋思源、吴攀|机器之心编译   Are you there, God? It's me, robot.   在他相对较短的任期内,教皇Francis
腾讯研究院
2018/02/01
1.4K0
人工智能会威胁到基督教信仰吗?
推荐阅读
相关推荐
拍照5天,P图2年:AI帮人类第一次直接“看见”了黑洞
更多 >
目录
  • 1.路由配置
  • 2.Vuex 全局状态管理
  • 3.组件库选用 Element-ui
  • 4.自定义过滤器
  • 5.自定义指令
  • 6. svg 封装
  • 7.axois 封装
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验