使用Vue与element-ui构建项目全过程

1,390 阅读7分钟

1.使用vue-cli3脚手架初始化项目

注:安装前确保有安装node,并且node >= 8.9 (推荐 8.11.0+)

全局安装vue

npm install -g @vue/cli

如果之前安装了vue旧版本,查看 vue --version,如果不是3.X,请先卸载再安装 npm uninstall vue-cli -g

创建项目

使用以下命令创建新项目:

vue create my-project

注:名称不能采用驼峰命名

vue-cli3也可以采用UI面板进行配置,相对比较方便,但是通过可视化配置的时候,有时候有些依赖包会安装出错。

运行该命令后,会有两个选择:

  • default (babel, eslint) ,默认套餐,提供 babel 和 eslint 支持。
  • Manually select features,自己去选择需要的功能,提供更多的特性选择。如果想要支持 TypeScript,就应该选择这一项。

回车后可进行选择,8个功能特性,可以多选:

使用方向键在特性选项之间切换,使用空格键选中当前特性,使用 a 键切换选择所有,使用 i 键翻转选项。我的选择如下,请根据自己需要进行选择。

对于每一项的功能,此处做个简单描述:

  • TypeScript 支持使用 TypeScript 书写源码
  • Progressive Web App (PWA) Support PWA 支持
  • Router 支持 vue-router
  • Vuex 支持 vuex
  • CSS Pre-processors 支持 CSS 预处理器
  • Linter / Formatter 支持代码风格检查和格式化
  • Unit Testing 支持单元测试
  • E2E Testing 支持 E2E 测试

是否选择history模式,根据自己需要选择。(我选择n)

是否选择预语言,根据自己需要选择。(我选择less)

是否ESlint输出,根据自己需要选择。(我选择默认)

是否保存时或者提交时是进行ESlint校验,根据自己需要选择。(我选择保存)

选择把配置文件放在外面,选择 In dedicated config files

要不要把当前的这一系列选项配置保存起来,方便下一次创建项目时复用,我选择n。

以上选择完后,项目就开始初始化了,初始化时会默认安装依赖包,完成后运行两条命令,项目即可启动:

cd my-project
npm run serve

项目初始化目录如下:

2.项目中引入element-ui

安装element-ui

通过以下命令安装element-ui到项目中。

npm i element-ui -S

引入 Element

可以引入整个 Element,或是根据需要仅引入部分组件。这里只介绍如何引入完整的 Element。

完整引入

在项目文件夹下的 main.js文件中写入以下内容:

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.use(ElementUI);

new Vue({
  el: '#app',
  render: h => h(App)
});

以上代码便完成了 Element 的引入。需要注意的是,样式文件需要单独引入。

3.路由设置

路由设置在router/index.js下里设置,可以设置多级路由,实例如下:

{
    path: "/search",
    name: "search",
    component: Search,
    children: [
      {
        path: "",
        component: AllList
      },
      {
        path: "item",
        component: ItemList
      },
      {
        path: "book",
        component: BookList
      },
      {
        path: "article",
        component: ArticleList
      },
      {
        path: "image",
        component: ImageList
      }
    ]
  }

跳转路由通过<router-link>进行跳转进入路由页面,to后面是跳转链接。

<router-link to="/search">
    <el-menu-item index="1">全部</el-menu-item>
</router-link>

因为页面会有重复的地方,例如页头、页脚,我们可以把相似的部分写在主页面或者父页面中,其他不同的地方通过在上级页面的 <router-view />标签占位即可。可多级嵌套。示例如下:

<el-container>
    <el-header>Header</el-header>
    <el-container class="container-box">
      <div class="side-box">
        <p class="display_center head_meun">导航</p>
        <el-menu default-active class="el-menu-vertical-demo">
          <router-link to="/search">
            <el-menu-item index="1">全部</el-menu-item>
          </router-link>
          <router-link to="/search/item">
            <el-menu-item index="2">条目</el-menu-item>
          </router-link>
          <router-link to="/search/book">
            <el-menu-item index="3">书籍</el-menu-item>
          </router-link>
          <router-link to="/search/article">
            <el-menu-item index="4">文章</el-menu-item>
          </router-link>
          <router-link to="/search/image">
            <el-menu-item index="5" class="last-menu">图片</el-menu-item>
          </router-link>
        </el-menu>
      </div>
      <div class="main-box">
        //占位 
        <router-view />
      </div>
    </el-container>
    <el-footer>Footer</el-footer>
  </el-container>

4.引入后端接口

创建services文件件

在文件夹中创建与后台对接的接口

撰写接口

一般接口基本都是增删改查操作,在接口文件中跟后端人员对接好路由之后,就可以进行了。

示例如下:

import axios from 'axios';
import {response_handle} from './response_handle';

var getRelation = function(condition) {
  return axios.get(`/v1/relation`, {params:condition})
    .then(response_handle());
}

export {
  getRelation
}

此外需要一个通用的结果处理函数response_handle,示例如下:

var response_handle = function() {
  return function(res) {
    // console.log(res,'res')
    if(res.status == 200) return res.data.result;
    else throw new Error(res.data.message);
  }
}

var errorResponse_handle = function() {
  return function(err) {
    // console.log(err.response,'response error')
    var message = '未知错误';
    if (err && err.response) {
      message = errorCode_message(err.response.status, err.response.data.message);
    }
    return Promise.reject({message:message,statusCode:err.response.data.statusCode});
  }
}

var errorCode_message = function(code, defaultMessage) {
  var message = '';
  switch(code) {
    case 400:
      message = '请求错误'
      break
    case 401:
      message = '令牌过期,请重新登录'
      setTimeout(()=>{
        window.location.href="/login";
      }, 1000)
      break
    case 403:
      message = '您无权操作'
      break
    case 404:
      message = `请求地址出错`
      break
    case 408:
      message = '请求超时'
      break
    case 409:
      message = '资源冲突'
      break
    case 410:
      message = '资源不存在或被删除'
      break
    case 500:
      message = '服务器内部错误'
      break
    case 501:
      message = '服务未实现'
      break
    case 502:
      message = '网关错误'
      break
    case 503:
      message = '服务不可用'
      break
    case 504:
      message = '网关超时'
      break
    case 505:
      message = 'HTTP版本不受支持'
      break
    default:
      message = defaultMessage || '未知错误';
  }
  return message;
}

export {
  response_handle,
  errorResponse_handle,
  errorCode_message
}

以上就是在服务中添加接口的步骤,下面说一下,如何在Vue文件中引入接口文件。

Vue中引入接口

  1. 在Vue文件的<script>标签中,引入接口,引入之后就可以是使用该接口了
import { getRelation } from "@/services/relation";
  1. 由于一般是从后台获取数据,填充页面,所以一般是是在mounted周期内调用接口,可以在mounted中写函数,也可以在methods中写完后,直接调用。
mounted() {
  this.getRelation();
}
  1. 在methods中编写接口调用函数
getRelation(){
  return getRelation()
    .then(res => {
      this.relationNode = res;
      this.drawChart(res);
    })
    .catch(err => {
      this.$message({
        showClose: true,
        type: "error",
        message: `关系图谱节点数据加载出错。原因:${err.message}`
      });
    })
}

5.引入css文件

如果一个页面或者组件中的样式比较少,我们直接写在Vue文件里的<style> </style>里面即可,但是当样式太多时,最好还是把css独立出来比较好。

在vue文件中,引入css文件常用的两种方式:

  1. 使用src
<style src="./index.css"><style>
  1. 使用@import
<style> @import './index.css' </style>

因为没有加 scoped ,以上两种方式没有什么区别,作用域都是全局。

如果加上scoped呢?是否作用域都变成局部了?

<style scoped src="./index.css"><style>
<style scoped> @import './index.css' </style>

加载结果跟我们预想的不一样,只有一个写法作用域在局部,即第一种写法src引入方式。为什么呢? 我们来看一下使用以上两种方式引入在编译后,代码的区别:

  • @import引入编译后代码如下:
  • src方式引入编译后代码如下:

明显看出,src方式引入,每个css样式都自动添加一个唯一的属性(例如:data-v-469af010),此数属性为组件内 CSS 指定作用域,和直接写在<style scoped>...</style>中效果是一样的,而@import的引入方式没有此属性,作用域为全局。

总结:

  • vue中,css指定作用域有两种方式:
    • ① 传统写在Vue文件中带有scoped属性的<style>……</style>标签中
    • ② 使用src引入css文件
  • css文件引入方式:
    • @import方式引入css文件作用域是全局,不管写在那个文件中
    • src引入css文件作用域是制定作用域