zoukankan      html  css  js  c++  java
  • vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    前言

    本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础

    步骤
    1、全局安装webpack,命令
    npm install webpack -g
    

    注意,webpack升级到4舍弃了不少组件,之前有次使用淘宝镜像丢失了不少模块,所以webpack大家尽量使用npm装。

    2、安装vue脚手架
    npm install vue-cli -g
    
    3、运行cmd(开始-运行-cmd-回车)

    比如你的目录要安装在E盘,在命令面板中就输入"e:"然后回车
    cd到项目的指定目录

    4、根据模板创建项目,命令
    vue init webpack-simple 工程名字<工程名字不能用中文>
    

    Project name 输入项目名称直接回车默认,其他的直接回车。

    5、安装依赖
    npm install
    

    创建好的类目如下图所示

     
    image.png
    6、运行第一个vue项目,命令
    npm run dev
    
     
    image.png

    运行完后会运行项目,并打开浏览器展示这个例子项目

    7、安装vue-router,vuex,axios

    axios相当于ajax,之前是用vue-resourse,不过现在这个模块不维护了,基本使用axios
    vue-router是vue的路由
    vuex是vue的状态管理,方便组件间通信
    安装命令

    npm install vue-router vuex axios --save-dev
    

    会保存到package.json文件里,当代码上传别人下载后,可以使用npm install一次性把依赖全部装完

    8、书写第一个组件

    在src目录下新建一个component文件夹,新建组件文件firstcomponent.vue
    firstcomponent.vue

    <template>
        <div id="firstcomponent">
            <h1>第一个组件</h1>
            <a href="javascript:void(0);">write by {{author}}</a>
        </div>
    </template>
    <!-- the js -->
    <script type="text/javascript">
        export default{
            data(){
                return {
                    author:'yueziming'
                }
            }
        }
    
    </script>
    
    <!-- the vue style-->
    <style lang="scss">
    
    </style>
    

    <style lang="scss">在里面可以直接写sass语法,书写更快捷

    9、使用组件

    app.vue部分代码

    <template>
      <div id="app">
        <img src="./assets/logo.png">
        <h1>{{ msg }}</h1>
        <firstComponent></firstComponent>    <!--使用组件-->
        <h2>Essential Links</h2>
        <ul>
          <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
          <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
          <li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
          <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
        </ul>
        <h2>Ecosystem</h2>
        <ul>
          <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
          <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
          <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
          <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
        </ul>
          <!-- 路由出口 -->
      <!-- 路由匹配到的组件将渲染在这里 -->
      <router-view></router-view>
      </div>
    </template>
    
    <script>
    import firstComponent from './component/firstcomponent.vue';    //引入组件
    export default {
      name: 'app',
      data () {
        return {
          msg: 'Welcome to first Vue.js Project'
        }
      },
      components:{firstComponent}    //注册组件
    }
    </script>
    
    10、使用路由和vuex

    1、先写入secondcomponent.vue这个组件,然后在main.js里面引入(加入代码)

    import Vue from 'vue'
    import App from './App.vue'
    import VueRouter from 'vue-router'
    import Vuex from 'vuex'
    // import VueResource from 'vue-resource'
    
    //开启debug模式
    Vue.config.debug = true;
    Vue.use(VueRouter);
    Vue.use(Vuex);
    // Vue.use(VueResource);Y
    const First  = { template:'<div><h2>{{count}}</h2></div>',computed:{count(){return store.state.count}}};
    import Second from './component/secondcomponent.vue';
    
    
    const router = new VueRouter({
      mode: 'history',
      base: __dirname,
      routes: [
        {
          path: '/first',
          component: First
        },
        {
          path: '/second',
          component: Second
        }
      ]
    })
    
    const store = new Vuex.Store({
      state:{
        count:0
      },
      mutations:{
        increment(state){
          state.count++;
        }
      }
    })    
    
    store.commit('increment');
    
    console.log(store.state.count) // -> 1
    
    const app = new Vue({
      el: '#app',
      router:router,
      store,
      render: h => h(App)
    }).$mount('#app');
    
    

    注:在app.vue里面写入html路由代码,切换路由后组件会在这里展示

    <router-link to="/first">点击跳到第一个路由</router-link>
    <router-link to="/second">点击跳到第二个路由</router-link>
    
    11、在secondcomponent.vue里使用vuex里面的数据

    secondcomponent.vue

    <template>
        <div id="firstcomponent">
            <h1>{{count2}}</h1>
            <a href="javascript:void(0);">write by {{author}}</a>
        </div>
    </template>
    <!-- the js -->
    <script type="text/javascript">
        export default{
            data(){
                return {
                    author:'yueziming',
                    count2:this.$store.state.count
                }
            }
        }
    </script>
    
    <!-- the vue style-->
    <style>
    
    </style>
    

    count2就是main.js里面的count

    12、axios的使用

    axios的使用格式为:
    axios.get('/user',{
    params:{
    ID:12345
    }
    })
    .then(function(response){
    console.log(response);
    })
    .catch(function(err){
    console.log(err);
    });
    get没有区别,但是post请求时后台接收不到数据
    简单的给下我封装的axios解决post的方法

    import esPromise from 'es6-promise';
    import axios from 'axios';
    import qs from 'qs';
    
    esPromise.polyfill();
    
    axios.defaults.timeout = 30000;  //设置超时时间30秒
    // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';           //配置请求头
    
    axios.defaults.baseURL = 'http://172.1.1.1';
    
     //POST传参序列化
    axios.interceptors.request.use((config) => {
        if(config.method  === 'post'){
            config.data = qs.stringify(config.data);
        }
        return config;
    },(error) =>{
         console.log("错误的传参");
        return Promise.reject(error);
    });
    
    class Common{
        constructor(){
    
            }
        }
        ajaxLoading(){
            let loading = document.createElement("div");
            loading.setAttribute("id","loading");
            loading.setAttribute("class","mask-loading");
            let myBody = document.getElementsByTagName("body")[0];
            myBody.appendChild(loading);
            loading.innerHTML = '<div class="spinner"><div class="spinner-container container1"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container2"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container3"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div>加载中</div>';
        }
        ajaxLoadingStop(){
            let loading = document.getElementById("loading");
            loading .parentNode.removeChild(loading );
        }
        ajax(api,data,callBack){
            let myData = data;
            let self = this;
            if(api.type == "get"){
                self.ajaxLoading();
                axios.get(api.url,{
                    params:myData.list
                }).then((response)=>{
                    self.ajaxLoadingStop();
                    if (response.data.ResultCode == 6666) {
                        callBack && callBack(response.data);
                    }  else {
                        prompt.tip(response.data.Message);
                    }
                }).catch((error)=>{
                    self.ajaxLoadingStop();
                    if(error && error.message && error.message.indexOf('timeout')!=-1){
                        prompt.tip("访问超时");
                    }else{
                        prompt.tip("服务器通信异常");
                    }
                })
            }else{
                self.ajaxLoading();
                new Promise((resolve, reject) => {
                    axios.post(api.url,myData.list).then((response)=>{
                        self.ajaxLoadingStop();
                        if (response.data.ResultCode == 6666) {
                            callBack && callBack(response && response.data)
                        } else {
                            prompt.tip(response.data.Message);
                        }
                    }).catch((error)=>{
                        console.log(error);
                        self.ajaxLoadingStop();
                        if(error && error.message && error.message.indexOf('timeout')!=-1){
                            prompt.tip("访问超时");
                        }else{
                            prompt.tip("服务器通信异常");
                        }
                    })
                })
            }
        }
    }
    export default Common;
    

    这只是最简单的例子,供给大家入门,能搭出来后面就容易学

     
     
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/navysummer/p/11562140.html
Copyright © 2011-2022 走看看