给学生党的vue教程(vue全家桶+Element)

vue.js

这个教程只是给我妹妹写的课外作业,并没有太多高级东西,只适合于有点前端基础的小白,
忠于兴趣,诚待文字,取悦自己,理解他人。

01-- 项目准备

01-1 安装

1兼容性 :Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器
2直接用 <script> 引入

3[CDN]https://cn.vuejs.org/v2/guide/installation.html#CDN "CDN"对于制作原型或学习,你可以这样使用最新版本:

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

对于生产环境,我们推荐链接到一个明确的版本号和构建文件,以避免新版本造成的不可预期的破坏:

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>

如果你使用原生 ES Modules,这里也有一个兼容 ES Module 的构建文件:

<script type="module">
  import Vue from 'https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.esm.browser.js'
</script>

你可以在 cdn.jsdelivr.net/npm/vue 浏览 NPM 包的源代码。

4NPM在用 Vue 构建大型应用时推荐使用 NPM 安装[1]。NPM 能很好地和诸如 webpackBrowserify 模块打包器配合使用。同时 Vue 也提供配套工具来开发单文件组件

# 最新稳定版
$ npm install vue
# vue版本号
$ npm install vue@vue版本号

没有环境的可以参考
既然我们要用npm装包就需要一个package.json 来记录存放第三方包的依赖

# 创建一个空的文件夹
$ mkdir vue-maer
$ cd vue-maer
# 然后,调用 npm init 来初始化 package.json,
# 参数 -y 表示对 npm 要求提供的信息,都自动按下回车键,表示接受默认值
$ npm init -y  

基础规范,我们的项目最好不要用中文命名

#i 是 install 的缩写
$ npm i vue

01-2使用vueCLI创建项目

$ vue create vue-admin
------------
# 第一步:选择创捷模式
Vue CLI v3.9.1
┌───────────────────────────┐
│  Update available: 4.2.2  │
└───────────────────────────┘
? Please pick a preset: (Use arrow keys)
# 默认自动选择模式
  default (babel, eslint)
#手动选择模式
>  Manually select features
------------
# 第二步
? Please pick a preset: Manually select features
? Check the features needed for your project: (Press <space> to select, <a> to toggle all, <i> to invert selection)
>(*) Babel   #将ECMAScript6转化为ECMAScript5的一个工具
 ( ) TypeScript
 ( ) Progressive Web App (PWA) Support
 (*) Router   #vue初始路由
 ( ) Vuex
 (*) CSS Pre-processors #css预处理器
 (*) Linter / Formatter #代码校验格式化
 ( ) Unit Testing
 ( ) E2E Testing
------------
# 第三步--使用路由模式(history)
? Use history mode for router? (Requires proper server setup for index fallback in production) 
(Y/n) n
------------
# 第四步--选择css预处理器
 Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default):
  Sass/SCSS (with dart-sass)
  Sass/SCSS (with node-sass)
> Less
  Stylus
------------
# 第五步--选择代码验证格式风格
? Pick a linter / formatter config: (Use arrow keys)
  ESLint with error prevention only
  ESLint + Airbnb config
> ESLint + Standard config
  ESLint + Prettier
------------
# 第六步--选择代码校验方式
? Pick additional lint features:
>(*) Lint on save 文档保存的时候,会进行格式验证
 (*) Lint and fix on commit  在进行git commit 时候,会进行代码校验,并且尝试自动解决错误语法
------------
# 第七步--选择配置注册
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.?
> In dedicated config files 独立配置文件
  In package.json 注册到package.json当中。但维护比较麻烦
------------
# 第八步--是否进行模板化
? Save this as a preset for future projects? (y/N) n
将此保存为将来项目的预设?(是/否)否
安装成功
#根据提示进行启动项目
 $ cd vue-admin
 $ npm run serve
项目启动

浏览器项目启动

2020年2月2日更新

01-3目录结构

├── README.md            项目介绍
├── index.html           入口页面
├── build              构建脚本目录
│  ├── build-server.js         运行本地构建服务器,可以访问构建后的页面
│  ├── build.js            生产环境构建脚本
│  ├── dev-client.js          开发服务器热重载脚本,主要用来实现开发阶段的页面自动刷新
│  ├── dev-server.js          运行本地开发服务器
│  ├── utils.js            构建相关工具方法
│  ├── webpack.base.conf.js      wabpack基础配置
│  ├── webpack.dev.conf.js       wabpack开发环境配置
│  └── webpack.prod.conf.js      wabpack生产环境配置
├── config             项目配置
│  ├── dev.env.js           开发环境变量
│  ├── index.js            项目配置文件
│  ├── prod.env.js           生产环境变量
│  └── test.env.js           测试环境变量
├── mock              mock数据目录
│  └── hello.js
├── package.json          npm包配置文件,里面定义了项目的npm脚本,依赖包等信息
├── src               源码目录  
│  ├── main.js             入口js文件
│  ├── app.vue             根组件
│  ├── components           公共组件目录
│  │  └── title.vue
│  ├── assets             资源目录,这里的资源会被wabpack构建
│  │  └── images
│  │    └── logo.png
│  ├── routes             前端路由
│  │  └── index.js
│  ├── store              应用级数据(state)
│  │  └── index.js
│  └── views              页面目录
│    ├── hello.vue
│    └── notfound.vue
├── static             纯静态资源,不会被wabpack构建。
└── test              测试文件目录(unit&e2e)
  └── unit              单元测试
    ├── index.js            入口脚本
    ├── karma.conf.js          karma配置文件
    └── specs              单测case目录
      └── Hello.spec.js

2020年2月4日更新

01-4 入口模型

  • 找到main.js入口模型
import Vue from 'vue'
import App from './App.vue'
import router from './router' //加载路由

Vue.config.productionTip = false

new Vue({ //创建vue实例
  router, //绑定路由
  render: h => h(App)// 将app根主件
}).$mount('#app')//替换到页面的#app节点上
  • 在入口模块中
    • 加载根组件
    • 加载路由
    • 创建vue实例
    • 根据组件替换到页面中 #app节点

01-5 git版本控制

git的基本使用就不在这里讲述了有兴趣的请看git 连接远程仓库如有疑问请联系我
我就描述项目过程:

创建项目

 #拷贝项目到本地
 git clone git@github.com:dileigege/dileigege-vue-admin.git
 #将隐藏文件git 复制到项目 
 git add .
 git  status
 git commit -m "提交日志-初始化"
 #项目就我一个人,所以我就用主分支
 git push

项目保存到远程仓库

2020年3月10日更新
最近接了项目,就停更了。项目今天后继续更新

01-6 目录整合

App.vue 调整
切记由于我们的项目使用了 eslintrc所以我们必须按照规范写,也许这个你觉的很麻烦,但是你可知道你不规范代码可能增加伙伴的工作。eslintrc

<!--  -->
<template>
  <div></div>
</template>

<script>
export default {
  name: 'app',
  data() {
    return {}
  }
}
</script>

<style lang='less' scoped>
</style>

views components文件夹内的文件,清空不需要了
router路由调整(用我们自己的项目需求调整)

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
]

const router = new VueRouter({
  routes
})

export default router

④项目目录补充

  1. api目录 接口封装模块
  2. directive 指令目录
  3. filters 过滤器目录
  4. store 状态容器模块
  5. styles 样式目录
  6. utils 工具模块

⑤引用静态文件将图片资源放置 assets , public中,引用字体文件在public - index.html

2020年3月12日更新

01-7 导入Element

npm 安装
推荐使用 npm 的方式安装,它能更好地和 webpack打包工具配合使用。

npm i element-ui -S
---安装成功--
dependencies": {
    "core-js": "^3.6.4",
    "element-ui": "^2.13.0",
    "vue": "^2.6.11",
    "vue-router": "^3.1.5"
  },

为了更好的食用,请按照个人项目进行.eslintrc.js可以参考食用

1ESLint 配置文件 .eslintrc 示例及说明
2错误提示

module.exports = {
  root: true,
  env: {
    node: true
  },
  extends: [
    'plugin:vue/essential',
    '@vue/standard'
  ],
  parserOptions: {
    parser: 'babel-eslint'
  },
  rules: {
    "space-before-function-paren": 0,
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    "space-before-function-paren": ["error", {
       "anonymous": "always",
       "named": "always",
       "asyncArrow": "always"
     }],
     'semi':['err','always']
  }
}

你可以引入整个 Element,在main.js 中写入以下内容:完整内容

import Vue from 'vue'
import App from './App.vue'
import router from './router'
// 完整引用Element
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.config.productionTip = false
Vue.use(ElementUI);

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

App.vue页面添加Element

<template>
  <div>
    <el-row>
      <el-button round>圆角按钮</el-button>
      <el-button type="primary" round>主要按钮</el-button>
      <el-button type="success" round>成功按钮</el-button>
      <el-button type="info" round>信息按钮</el-button>
      <el-button type="warning" round>警告按钮</el-button>
      <el-button type="danger" round>危险按钮</el-button>
</el-row>
  </div>
</template>
App.vue

2020年3月13日更新

02项目开始

02-1登陆板块

主要步骤:页面布局 验证码 提交登陆 表单验证
我们的项目主要是应用Element,但在一些项目中,UI给我们的设计图,ElementUI并不能满足,所以我们就需要做一些调整

02-1-1 画UI

image.png

本人不是专业UI,所以能看就行,请专业的不喜勿喷,都是公司的压迫层,更应该相亲相爱,毕竟我们可能是唯一理解你们“五彩斑斓黑”的人

02-1-2 登陆组件及路由配置

首先我们先在view文件夹创建两个组件模块,Login - index.vue home - index.vue 这里的view可以狭义的理解为 mvc中的视图层,MVC是后端世界中一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器,去过vue官网几次的人就知道,vue的设计模式是MvvM,有点多了,我们专注项目。
3-0对vue核心的理解 MVVM
文件router-inde.js首页路由和登陆页路由

const routes = [
  {
    name: 'home',
    path: '/',
    component: () => import('@/views/home')
  },
  {
    name: 'login',
    path: '/login',
    component: () => import('@/views/login')
  }
]

app.vue调用路由组件

<template>
  <div>
    <router-view/> 调用组件
  </div>
</template>

02-1-3 页面编写

login-index.vue页面 表单组件

<el-form ref="form" :model="form" label-width="80px">
  <el-form-item label="活动名称">
    <el-input v-model="form.name"></el-input>
  </el-form-item>
  <el-form-item label="活动区域">
    <el-select v-model="form.region" placeholder="请选择活动区域">
      <el-option label="区域一" value="shanghai"></el-option>
      <el-option label="区域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item label="活动时间">
    <el-col :span="11">
      <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
    </el-col>
    <el-col class="line" :span="2">-</el-col>
    <el-col :span="11">
      <el-time-picker placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
    </el-col>
  </el-form-item>
  <el-form-item label="即时配送">
    <el-switch v-model="form.delivery"></el-switch>
  </el-form-item>
  <el-form-item label="活动性质">
    <el-checkbox-group v-model="form.type">
      <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
      <el-checkbox label="地推活动" name="type"></el-checkbox>
      <el-checkbox label="线下主题活动" name="type"></el-checkbox>
      <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
    </el-checkbox-group>
  </el-form-item>
  <el-form-item label="特殊资源">
    <el-radio-group v-model="form.resource">
      <el-radio label="线上品牌商赞助"></el-radio>
      <el-radio label="线下场地免费"></el-radio>
    </el-radio-group>
  </el-form-item>
  <el-form-item label="活动形式">
    <el-input type="textarea" v-model="form.desc"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="onSubmit">立即创建</el-button>
    <el-button>取消</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        form: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        }
      }
    },
    methods: {
      onSubmit() {
        console.log('submit!');
      }
    }
  }
</script>

既然UI框架给了我们样式,我们就使用UI框架给的样式,不符合样式的我们可以进行调整,效率在我们的工作中也很重要。
style-style.less AND main.js

/*
 * @description:  公共样式 
 * @param : NO
 * @return: NO
 */
html,
body,
ul,
li,
ol,
dl,
dd,
dt,
p,
h1,
h2,
h3,
h4,
h5,
h6,
form,
fieldset,
legend,
img {
    margin: 0;
    padding: 0;
}
// 清除浮动
clearfix {
    *zoom: 1;

    /*ie*/
    &::after,
    &::before {
        content: '';
        display: table;
    }

    &::after {
        clear: both;
    }
}
// .box7 {
//     @extend %clearfix;
// }

 html , body {
     height: 100%;
 }

在main.js中添加
import './styles/style.less'

样式就大家想怎么写就怎么写吧,如果样式写不了,我建议你去再学学,HTML+css吧,虽然说这两个宝贝并不难,但也并不简单,


2020年3月21日更新

02-1-4 验证码操作

模拟接口

<!--  @click="ongaincode"  -->
<el-button round class="button-fler" @click="ongaincode">
  获取验证码
</el-button>
import axios from 'axios';
  methods: {
    onSubmit () {
    //提交按钮触发 
      console.log('submit!');
    },
    ongaincode () {
      // console.log('ongaincode!');
      //验证码按钮触发 
      axios({
        method: 'GET',
        url: '接口,可用yapi模拟,'
      }).then(res => {
        console.log(res.data)
      })
    }
  }

返回数据,可以使用


当然一个真实的验证中,我们可以使用一些验证工作,我们可以使用后端写的验证规则,也可以使用一些工具,为了保证我们的手机号,不会被恶意强刷,造成一些没有必要的损失。
2020年3月25日更新

02-1-5 验证码操作

styl逻辑

//在data中添加定时器与定位时间
  codeTime: null,
  codeNumer: 20
//在methods内添加 验证码倒计时
    countDown() {
      // console.log("验证码倒计时")
      this.codeTime = window.setInterval(() => {
        this.codeNumer--;
        if (this.codeNumer <= 0) {
          // 清除定时器
          window.clearInterval(this.codeTime);
          //定时器 还原
          (this.codeNumer = 20), (this.codeTime = null);
        }
      }, 1000);
    }

html样式

 <!-- !!codeTime 返回为布尔,定时器为数字 一个!为ture 两个取反 -->
!!codeTime
     <el-button
            round
            class="button-fler"
            @click="ongaincode"
            :disabled="!!codeTime"
          >{{ codeTime ? `剩余${codeNumer}秒`: '获取验证码'}}</el-button>
        </el-col>

2020年3月28日更新

02-2-1 Layout布局

按照正常程序的话下一步应该是路由守卫,但是考虑到每次都登陆太麻烦了,so就先不布局,然后最后写路由守卫
view - Layout - index

<template>
<el-container>
  <el-header>
    <layHeader/>
  </el-header>
  <el-main>
      <layTopnav/> 
    Main
    </el-main>
  <el-footer>Footer</el-footer>
</el-container>

</template>
<script>
 // 引入子组件
import  layTopnav from './comments/layTopnav';
import  layHeader from './comments/layHeader';
export default {
  name: 'app',
//注册 layTopnav layHeader
  components: {
   layTopnav,
   layHeader
  },
  data() {
    return {}
  }
}
</script>
<style lang='less' scoped>
.el-container{
  width: 100%;
  .el-header{
  background-color: #2375FF;
}
 .el-main{
   background-color: #ffffff;
 }
 .el-footer{
   position:absolute;
   width: 100%;
   background-color: #333333;
   bottom: 0;
 }
}

</style>

view - Layout - comments - layHeader.vue

 <template>
   <div>
       layheader组件
   </div>
 </template>
 
 <script>
 export default {
   name: 'layHeader',
   data() {
     return {}
   }
 }
 </script>
 <style lang='less' scoped>
 </style>

view - Layout - comments - layTopnav.vue

 <template>
   <div>
       layTopnav.vue组件
   </div>
 </template>
 
 <script>
 export default {
   name: 'layTopnav',
   data() {
     return {}
   }
 }
 </script>
 <style lang='less' scoped>
 </style>

在router.js路由进行注册

 {
      name: 'Layout',
      path: '/',
      component: () => import('@/views/Layout')
    },

2020年4月1日更新

02-2-2 首页布局

** 安装 v-charts **

npm i v-charts echarts -S

完整使用:main.js

// 使用v-charts
import VCharts from 'v-charts'
// 引用全部VCharts
Vue.use(VCharts)

使用

<template>
  <ve-pie :data="chartData" :settings="chartSettings"></ve-pie>
</template>

<script>
  export default {
    data () {
      this.chartSettings = {
        roseType: 'radius'
      }
      return {
        chartData: {
          columns: ['日期', '访问用户'],
          rows: [
            { '日期': '1/1', '访问用户': 1393 },
            { '日期': '1/2', '访问用户': 3530 },
            { '日期': '1/3', '访问用户': 2923 },
            { '日期': '1/4', '访问用户': 1723 },
            { '日期': '1/5', '访问用户': 3792 },
            { '日期': '1/6', '访问用户': 4593 }
          ]
        }
      }
    }
  }
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容