使用Vue-cli创建项目及常用配置

前言

  1. 创建项目
  2. vue-router懒加载
  3. 配置sass及屏幕适配
  4. 数据请求axios
  5. Toast提示
  6. vuex
  7. 直接下载

创建项目

1.安装全局vue-cli

npm install vue-cli -g

2.生成项目模板(my_projuct为项目名称)

vue init webpack my_projuct

3.进入生成的项目文件夹

cd my_project

4.初始化,安装依赖

npm install

5.运行

npm run dev

5.打包

npm run build

vue-router懒加载

单页面应用,如果没有应用懒加载,第一次进入时,需要加载的内容过多,会出现长时间的白屏,不利于用户体验,运用懒加载则可以将页面进行划分,需要的时候加载相对应的页面,可以有效减少第一次加载的压力和用时。

router文件夹下的index.js原路由加载

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    }
  ]
})

修改为懒加载

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      component: resolve => require(['@/components/HelloWorld'], resolve)
    }
  ]
})

配置sass及屏幕适配

配置sass

1.安装sass-loader及node-sass

npm install sass-loader node-sass --save-dev

2.使用
在.vue文件中的style中添加 lang='scss',例如

<style scoped lang='scss'>
    $t-base:#32ba90;
    .wrap{
        color: $t-base;
    }
</style>
移动端---屏幕适配

1.在src文件夹中新建一个文件夹styles,并新建两个scss文件 --- mixin.scss / reset.scss
mixin.scss

$SCALE: 10;
$BASE: 375 / $SCALE;//375为设计图尺寸

// 超过显示省略号
@mixin ellipsis {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
//多行文本,超过显示省略号
@mixin moreLine($num){
    display: -webkit-box; /** 对象作为伸缩盒子模型显示 **/
    -webkit-box-orient: vertical; /** 设置或检索伸缩盒对象的子元素的排列方式 **/
    -webkit-line-clamp: $num; /** 显示的行数 **/
    overflow: hidden;  /** 隐藏超出的内容 **/
}

@function rem ($px) {
  @return ($px / $BASE) + rem
}

reset.scss

@import './mixin.scss';

$size_small:rem(12);
$size_middle:rem(14);
$size_default:rem(16);
$size_big:rem(18);
$text_color: #666;
$bg_color: #32ba90;
$border_color: #dedede;

body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, li, a, p, h1, h2, h3, h4,h5, h6, i, b, em,textarea, button, input, select, figure, figcaption {
    padding: 0;
    margin: 0;
    list-style: none;
    text-decoration: none;
    border: none;
    font-weight: normal;
    font-family: PingFangSC-Light,helvetica,'Heiti SC';
    box-sizing: border-box;
    font-size: 14px;
    -webkit-tap-highlight-color:transparent;
    -webkit-font-smoothing: antialiased;
    &:hover{
        outline: none;
    }
}
a, a:visited {
    text-decoration: none;
    color: #333;
}
input:focus {
    outline: none;
    border: none;
}
html, body {
  width: 100%;
  height: 100%;
  -webkit-font-smoothing: antialiased;
  background: #fff;
  color: #333;  
  padding: 0;
  margin: 0;
}
// 禁止用户选中
body{
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
::-webkit-scrollbar {
    display: none;
}

.fl{
    float: left;
}
.fr{
    float: right;
}
.clearfix:after{  /*最简方式*/
    content: '';
    display: block;
    clear: both;
}
.clearfix{ /*兼容 IE*/
    zoom: 1;
}

2.在App.vue文件中设置html的font-size

<script>
import {mapGetters,mapActions} from 'vuex'
export default {
  name: 'App',
  mounted () {
      // 设置html的font-size
      document.addEventListener('DOMContentLoaded', function () {
        const html = document.querySelector('html');
        html.style.fontSize = window.innerWidth / 10 + 'px';
      });
    }
}
</script>

3.mixin.scss则需要在所需的.vue文件中的style中引入,例如components中的HelloWorld.vue

<style scoped lang='scss'>
 @import '../styles/reset.scss';
  /*可使用mixin和reset中的变量及方法*/
</style>

数据请求axios

1.安装axios

npm install axios --save

2.在src文件夹中新建api文件夹,并新建index.js文件

import axios from 'axios';
var qs = require('qs');


if (process.env.NODE_ENV === 'development') {
  axios.defaults.baseURL =  ''; //''里面填写请求域名
}

import VueRouter from 'vue-router';


//get请求方式
export const home = () => {
  return axios.get('/api/index');
}
//post请求方式(包含参数)
export const article = (id)=>{
    const params = qs.stringify({'id':id});
    return axios.post('/api/article', params);
}

3.调用接口

<script>
    import {home} from '@/api';//引入
    
    export default {
      data () {
        return {
        }
    },
   mounted () {
      const self = this;
      home().then(r => {//调用接口
        let res = r.data;
        console.log(res)
      });
    },
}
</script>

Toast提示

toast.png

1.创建一个普通的Toast提示组件
src/components/toast/index.vue

<template>
    <div v-if="showToast" class="toast" >
      <p>{{ toastTitle }}</p>
    </div>
</template>

<script>
export default {
  data: () => ({
    showToast: false,
    toastTitle: '',
  }),
  
  methods: {
    show (params) {
        this.toastTitle = params;
        this.showToast = true
    },

  },
  watch: {
    toastTitle: function(val) {
        if (val) {
          this.showToast = true;
          setTimeout(() => {
            this.showToast = false;
            this.toastTitle='';
          }, 2000)
        }
        return val;
      }
  }
}
</script>

<style scoped lang='scss'>
@import '../../styles/mixin.scss';
    
.toast {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: rgba(49, 49, 49, 0.8);
  color: #fff;
  border-radius: rem(5);
  z-index: 999;
  text-align: center;
  font-size: rem(14);
  p{
    margin: 0;
    padding: rem(4) rem(10);
    
  }
}
</style>
  1. 将组件注册成为plugin
    src/components/toast/plugin.js
import Toast from './index'

export default {
  install (Vue, options = {}) {
    const VueToast = Vue.extend(Toast)
    let toast = null

    function $toast (params) {
      return new Promise(resolve => {
        if (!toast) {
          toast = new VueToast()
          toast.$mount()
          document.querySelector(options.container || 'body').appendChild(toast.$el)
        }
        toast.show(params)
        resolve()
      })
    }

    Vue.prototype.$toast = $toast
  }
}
  1. 在main.js中载入
//toast
import toast from './components/toast/plugin'
Vue.use(toast)

4.在页面中使用

<template>
  <div class="wrap">
    <button class="btn" @click="showToast">show toast</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      
    }
  },
  methods: {
    showToast () {
     this.$toast('toast')
    }
  }
}
</script>

vuex

在此不多做介绍,详情请参考我的另一篇文章Vue组件通信及状态管理

直接下载

https://github.com/Yimi-shan/vue_cli

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

推荐阅读更多精彩内容