VUE项目从零开始

VUE新建项目

安装cli

sudo npm install -g @vue/cli
sudo npm install -g --unsafe-perm @vue/cli //mac 安装报异常使用这个
vue create vue-demo
$ cd vue-demo
$ npm run serve

安装 router

npm install vue-router --save-dev

使用router

//创建router.js
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
    routes: [
        {
            path: '/',
            redirect:'/HelloWorld'
        },
        {
            path:'/HelloWorld',
            component: resolve => require(['../components/HelloWorld.vue'], resolve),
        },
    ]
})

//在APP.vue使用router-view
<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
* {
  padding: 0; /*清除内边距*/
  margin: 0; /*清除外边距*/
}
</style>
在main.js中配置router
import Vue from 'vue'
import App from './App.vue'
import router from './router/router.js'

Vue.config.productionTip = false

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

创建Banner.vue组件

安装swiper组件
npm install vue-awesome-swiper
<template>
  <div class="banner">
    <swiper :options="options">
      <swiper-slide v-for="item in bannerItem" :key="item.id">
        <div @click="bannerClick(item)">
          <img :src="item.visitUrl" alt />
          <!-- <div>{{item.visitUrl}}</div> -->
        </div>
      </swiper-slide>
      <div class="swiper-pagination" slot="pagination"></div>
    </swiper>
  </div>
</template>

<script>
import "swiper/css/swiper.min.css"; //引入swiper的css样式
import { swiper, swiperSlide } from "vue-awesome-swiper";
export default {
  name: "banner",
  props: ["imgs"], //获取传递进来的数据
  components: {
    swiper,
    swiperSlide
  },
  data() {
    return {
      bannerItem: this.imgs,
      //swiper的配置参数
      options: {
        //自动滚动
        autoplay: {
          delay: 5000, //自动滚动间隔时间
          disableOnInteraction: false //是否允许用户打断滑动,默认为true
        },
        pagination: {
          el: ".swiper-pagination",
          clickable: true
        },
        centeredSlides: true,
        paginationClickable: true
      }
    };
  },
  methods: {
    bannerClick(item) {
      console.log("点击banner", item);
    }
  }
};
</script>

<style >
.banner {
  height: 170px;
  padding: 10px;
}
.banner img {
  width: 100%;
  height: 170px;
  min-height: 170px;
  min-width: 100%;
  border-radius: 5px;
}
</style>

使用Banner.vue

<template>
  <div>
    <!-- <h1>这是title</h1> -->
    <banner :imgs="bannerItem"></banner>
  </div>
</template>

<script>
import banner from "./Banner.vue";
export default {
  name: "home",
  components: {
    banner
  },

  data() {
    return {
      bannerItem: [
        {
          visitUrl:
            "https://tk-conline-20190225-1257840667.cos.ap-beijing.myqcloud.com/conline-test/banner.jpg",
          id: 1
        },
        {
          visitUrl:
            "https://tk-conline-20190225-1257840667.cos.ap-beijing.myqcloud.com/online-customer/1581478851959758.png",
          id: 2
        }
      ]
    };
  }
};
</script>

移动端适配

  1. 安装px2rem-loader(devDependencies)
npm install px2rem-loader --save-dev
  1. 移动端适配解决npm包 "lib-flexible" (dependencies)
npm install lib-flexible --save
  1. main.js中引入 "lib-flexible"
import 'lib-flexible' // 移动端适配 (目录: vue-demo/src/main.js)
  1. 创建 "vue.config.js" (目录:vue-demo/vue.config.js)
 module.exports = {
     chainWebpack: (config) => {
         config.module
         .rule('css')
         .test(/\.css$/)
         .oneOf('vue')
         .resourceQuery(/\?vue/)
         .use('px2rem')
         .loader('px2rem-loader')
         .options({
             remUnit: 75
         })
     
     }
 }
  1. Banner.vue等页面中根据750px设计图写页面

  2. 使用

    直接写px,编译后会直接转化成rem      —- 除开下面两种情况,其他长度用这个
    在px后面添加/*no*/或者将px大写PX,不会转化px,会原样输出。      — 一般border需用这个
    在px后面添加/*px*/,会根据dpr的不同,生成三套代码。—-      一般字体需用这个
    

部署到github Page

  1. 在github新建项目 vue-demo

  2. 在github创建一个类似liuhe37186.github.io这样格式的GitHub仓库

  3. vue.config.js 中设置正确的 publicPath

    如果打算将项目部署到 https://<USERNAME>.github.io/ 上, publicPath 将默认被设为 "/",你可以忽略这个参数。

    如果打算将项目部署到 https://<USERNAME>.github.io/<REPO>/ 上 (即仓库地址为 https://github.com/<USERNAME>/<REPO>),可将 publicPath 设为 "/<REPO>/"。举个例子,如果仓库名字为“vue-demo”,那么 vue.config.js 的内容应如下所示:

    module.exports = {
      publicPath: process.env.NODE_ENV === 'production'
        ? '/vue-demo/'
        : '/'
    }
    
  4. 然后将本地项目push到远程master (非必须)

    #git init
    #git add README.md
    #git commit -m "first commit"
    git remote add origin https://github.com/liuhe37186/vue-demo.git
    git push -u origin master
    
  5. 主要是下面这一步,将打包后的dist文件夹push到gh-pages

    npm run build
    git checkout -b gh-pages
    git add -f dist
    git commit -m 'first commit'
    git subtree push --prefix dist origin gh-pages
    
  1. 在Setting里设置,用哪个分支部署,默认是gh-pages分支

    自动部署

    1. 在项目根目录创建脚本deploy.sh
    # !/usr/bin/env sh
    
    # 当发生错误时中止脚本
    set -e
    
    # 构建
    npm run build
    
    # cd 到构建输出的目录下 
    cd dist
    
    # 部署到自定义域域名
    # echo 'www.example.com' > CNAME
    
    git init
    git add -A
    git commit -m '部署page'
    
    # 部署到 https://<USERNAME>.github.io
    git push -f https://github.com/liuhe37186/vue-demo.git master:gh-pages
    
    # 部署到 https://<USERNAME>.github.io/<REPO>
    # git push -f https://github.com/xjinky/hello-world.git master:gh-pages  # 提交到gh-master分支
    
    # git push -f https://github.com/liuhe37186/vue-demo.git master    # 提交到master分支
    
    cd -
    
    1. 在项目根目录执行命令 sh deploy.sh 自动部署

    2. 在package.json文件中添加脚本命令

      "scripts": {
          "dev": "vue-cli-service serve --open",
          "build": "vue-cli-service build",
          "lint": "vue-cli-service lint",
          "pro": "sh deploy.sh"
        },
      
    3. 执行 npm run pro 可自动部署

网络请求

  1. 安装axios

    $ npm install axios --save
    
  2. 引入

    import axios from 'axios';
    
  3. 配置请求参数

    //设置超时时间
    axios.defaults.timeout = 15000;
    //设置全局的请求次数,请求的间隙
    axios.defaults.retry = 4;
    axios.defaults.retryDelay = 1000;
    //设置请求baseURL地址
    axios.defaults.baseURL = process.env.VUE_APP_BASEURL;
    
  1. get请求

    /**
     * 封装get方法
     * @param url
     * @param data
     * @returns {Promise}
     */
    
    export function get(url, params = {}) {
        return new Promise((resolve, reject) => {
            axios.get(url, {
                params: params
            }).then(response => {
                resolve(response.data);
            }).catch(err => {
                reject(err)
            })
        })
    }
    
  2. post请求

    /**
     * 封装post请求
     * @param url
     * @param data
     * @returns {Promise}
     */
    export function post(url, data = {},config={currContentType:"") {
        console.log("--------post$url:",url)
        console.log("-------post$data:",data)
        return new Promise((resolve, reject,config) => {
            axios.post(url, data).then(response => {
                console.log("--------post$response-----",response,"-------response$end------")
                resolve(response.data);
            }, error => {
                console.log("--------post$error-----",error,"-------error$end------")
                reject(error)
            })
        })
    }
    
  3. 请求拦截器

    const currContentType = {
      urlencoded: "application/x-www-form-urlencoded;charset=utf-8",
      fromData: "ipart/form-data;charset=utf-8",
      json: "application/json;charset=utf-8",
      xml: "text/xml;charset=utf-8",
      form:"multipart/form-data;charset=utf-8"
    };
    //http request 请求拦截器
    axios.interceptors.request.use(
      config => {
        console.log("--------interceptors$request$enter--------",config)
            
            if (config.currContentType == "json") {
                config.headers = {
                  "Content-Type": currContentType.json
                };
            } else {
                //不传走表单
                config.headers = {
                  "Content-Type": currContentType.urlencoded
                };
                config.data = qs.stringify(config.data);
              } 
          
        console.log("--------interceptors$request$config--------",config,"--------end--------")  
        return config;
      },
      error => {
        return Promise.reject(error);
      }
    );
    
  1. 响应拦截器

    //添加响应之后拦截器
    axios.interceptors.response.use(function(response) {
        //对响应数据做些事
        console.log("------interceptors$response$response------")
        return response;
    }, function(error) {
        //请求错误时做些事
        console.log("------interceptors$response$error------")
        return Promise.reject(error);
    });
    

持续更新......

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

推荐阅读更多精彩内容

  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,895评论 1 4
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,079评论 0 2
  • Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。Axios的中文文...
    李亚_45be阅读 9,938评论 1 8
  • 我们在实际的Vue项目中经常需要与后端进行数据交互,但是在很大程度上我们需要用到这个插件,但是这里需要注意的一点是...
    Marin_chen阅读 11,002评论 0 5
  • 搭建缘由 源于公司每次新启动一个由多人协同开发的项目都由负责人初始化项目之后,每个人再去从私服pull一下项目才开...
    胡一巴阅读 1,497评论 0 0