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

前端项目搭建实战(Vue)

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

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

1.路由配置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
import { mapState } from 'vuex';
computed: mapState(['role']),

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

3.组件库选用 Element-ui

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

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

4.自定义过滤器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义时间过滤器
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
运行
AI代码解释
复制
<h3>当前时间:{{ time | dateFormat('${y}-${m}') }}</h3>
time
time

5.自定义指令

在 main.js 中注册全局指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 权限指令
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
运行
AI代码解释
复制
<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
运行
AI代码解释
复制
<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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
<SvgIcon name="404" className="icon-style" />
svg
svg

7.axois 封装

axios 建议只做简单封装即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

评论
登录后参与评论
4 条评论
热度
最新
来看看
来看看
11点赞举报
你是假人吗
你是假人吗
回复回复点赞举报
666
666
回复回复点赞举报
666
666
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
搞个一手环境-处理svg组件(2)
svg-sprite-loader 可以多个svg图标合并. 使用时只需根据合并的symbol的id即可.
刘嘿哈
2022/10/25
3100
如何在VUE项目中引入SVG图标
SVG(即“可缩放矢量图形”)图标在诸多场合下,往往胜过一般的位图标记(例如PNG、JPG、GIF等)。
HelloWorldZ
2024/03/20
1.2K0
如何在VUE项目中引入SVG图标
前端成神之路-vue前端项目07
实现步骤: A.生成打包报告,根据报告优化项目 B.第三方库启用CDN C.Element-UI组件按需加载 D.路由懒加载 E.首页内容定制
海仔
2021/05/06
1.3K0
Vue 项目引入 SVG 图标
SVG 是一种可缩放矢量图形(Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG 由 W3C 制定,是一个开放标准。
数媒派
2022/12/01
2.2K0
vue菜鸡实践
根目录创建vue.config.js文件 基本配置,configureWebpack属性,值是对象时的配置
刘嘿哈
2022/10/25
3550
vue菜鸡实践
在 Vue 项目中更优雅的使用 icon
在 Web 开发中,我们经常会用到 icon,icon 的使用经历了从图片到字体,再到 svg 的演变过程,也产生出相应的 icon 库,如雪碧图、Font Awesome、Iconfont 等等。
Cell
2023/09/15
5940
基于Vue的前端架构,我做了这15点
为什么选择了两个?因为公司团队跟倾向于使用 scss 开发,less 是为了覆盖 ant design vue 的样式,stylus 只有我自己喜欢这种风格。
落落落洛克
2021/01/08
2.7K0
基于Vue的前端架构,我做了这15点
Vue项目中优雅使用icon
icon在我们前端日常开发中是很常用的,它有很多种使用方式,时至今日,它的使用方式经过了很多种演变,本文会为大家介绍icon的一些历史演变,分析一下这几种使用方式的优劣,我们将采用svg sprites这种方式使用icon,演示代码使用vue+vue-cli3+,看完之后,你会发现这种使用方式完全称得上优雅二字
isboyjc
2022/03/28
2.4K0
Vue项目中优雅使用icon
VUE项目iconfont自定义SVG(非SVG文件)-_PUSDN
VUE项目iconfont自定义SVG,在线或者离线下载的阿里巴巴icon font.js;并非SVG文件;
JaneYork
2023/10/11
3770
VUE项目iconfont自定义SVG(非SVG文件)-_PUSDN
如何在Vue项目中更优雅地使用svg
最近看项目视频的时候对里面使用 svg 的方式感到很好奇,于是去网上查了一下,发现 svg 竟然也有类似于 css 雪碧图一样的用法,也就是 svg-sprite(孤陋寡闻了),而且配合插件后能够以组件化的方式使用 svg,非常方便。这里记录下一些相关用法。
Chor
2020/05/06
13.4K1
Vue2动态路由
    一般管理端的菜单栏是根据登录用户角色不同,动态生成的,在vue中我们不止菜单栏需要动态生成,同时我们路由也需要动态生成。
用户5899361
2023/03/25
1.1K0
Vue2动态路由
Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载
前面文章有讲到 svg 图标按需加载的优势以及 Vue 如何使用 vue-svg-icon 实现 svg 图标按需载入 今天来学习一下使用 svg-sprite-loader 在 Vue3 项目中实现图标按需加载
Leophen
2020/12/22
7.7K1
三年经验前端vue面试记录
vue-router中两个重要组件router-link和router-view,分别起到导航作用和内容渲染作用,但是回答如何生效还真有一定难度
bb_xiaxia1998
2022/10/31
2.2K0
vue3+element-plus+router+vuex+axios从零开始搭建(3)
现在在store文件夹下面新建四个文件state.js, mutations.js, getters.js, actions.js
solate
2021/06/22
3.8K0
vue3+element-plus+router+vuex+axios从零开始搭建(3)
vue,vue-router,vuex,axios整合
*vue官网:https://cn.vuejs.org/ vue-router官网:https://router.vuejs.org/zh-cn/ vuex官网:https://vuex.vuejs.org/zh-cn/ axios中文说明:https://www.kancloud.cn/yunye/axios/234845 vue-cli建立项目 npm install -g vue-cli 全局安装vue脚手架 vue init webpack-simple project-name 使用w
conanma
2021/11/03
1.2K0
vue搭建项目及配置
  ② 检查是否安装成功:cmd输入命令 node -v 或者 npm -v, 如果输出版本号,说明我们安装node环境成功。
生南星
2019/08/26
3.2K0
vue搭建项目及配置
52·[Vue项目]旺财记账-导航栏
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/11/08
1.4K0
52·[Vue项目]旺财记账-导航栏
vue前端实战注意事项
1. vue前端实战注意事项 1.1. 预备 1.1.1. Eslint 这是个语法检查工具,我用webstorm作为开发的ide,这个语法检查还是太严格了,一个空格啥的都会报错,对新手来讲还是建议关
老梁
2019/09/10
8350
vue前端实战注意事项
解锁SVG新姿势:ChatGPT绘制图标+SVG Symbol自动导入
近期ChatGPT很火,作为前端er,我思考与尝试了让它帮忙写代码、帮助我解析与研究某些国内资料较少的技术、优化代码、解释代码、优化简历——都非常棒,就是很可惜GPT的图片能力还一般,如果什么时候它可以解析图片了,或许图片生成代码就不远了。
源心锁
2023/03/16
3.8K0
解锁SVG新姿势:ChatGPT绘制图标+SVG Symbol自动导入
Vue | 使用 SVG sprite loader 来引入 svg
这个库给的示例代码是 webpack.config.js 但是我们现在在用的是 Vue
Zkeq
2022/09/20
3.4K0
Vue | 使用 SVG sprite loader 来引入 svg
相关推荐
搞个一手环境-处理svg组件(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验