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;
    

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

     
     
  • 相关阅读:
    设计模式--总结
    设计模式--行为型模式--解释器模式
    设计模式--行为型模式--备忘录模式
    设计模式--行为型模式--访问者模式(Visitor模式)
    设计模式--行为型模式--迭代器模式
    设计模式--行为型模式--中介者模式
    js常用方法集合
    CSS 每隔4行显示不同样式的表格
    常用正则验证
    wIndow 强制关闭被占用的端口
  • 原文地址:https://www.cnblogs.com/navysummer/p/11562140.html
Copyright © 2011-2022 走看看