vue.js实战,知乎日报项目(重点在于代理服务)

1、项目结构
在这里插入图片描述

2、请求工具类unti.js

//引入axios
import axios from 'axios';
//设置api接口和imgPath根路径
const Util={
  apiPath:'/apis',
  imgPath:''
}
//声明axios发送请求的方法ajax,设置发送请求的根路径为apiPath,
// 也就是说不管什么地方调用Util.ajax方法
// 路径都为Util.apiPath+req路径
  Util.ajax=axios.create({
    baseURL:Util.apiPath
  });

//声明axios发送请求的方法ajax返回结果后的拦截器
Util.ajax.interceptors.response.use(res=>{
  return res.data;
 })

//导出Util
export default Util;

说明:
是axios请求的工具js,用于在设置axios请求的根路径(/apis),设置返回后结果的处理:
Util.ajax.interceptors.response.use(res=>{
	  return res.data;
 })

3、main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import App from './App';
import $ from 'jquery';
import '../static/bootstrap-3.3.7-dist/css/bootstrap.css';
import '../static/bootstrap-3.3.7-dist/js/bootstrap.min';
// 引入util.js
import util from './libs/util.js';
import './css/style.css';
import store from  './modules.js';
Vue.config.productionTip = false;
// 设置全局变量$axios
Vue.prototype.$axios = util;
/* eslint-disable no-new */
new Vue({
  el: '#app',
  components: { App },
  template: '<App/>',
  store
})
说明:
(1)、导入外部js,css等静态资源,
(2)、使用各种插件(vue),
(3)、引入store和路由等,
(4)、引入工具类(import util from './libs/util.js';)
(5)、设置全局变量(Vue.prototype.$axios = util;)

4、APP.vue

<template>
  <div class="container daily">
    <div class="row daily-row">
      <!--  菜单div(左侧)  -->
      <div class="daily-menu col-md-2">
        <ul class="nav nav-pills nav-stacked">
          <li role="presentation" @click="activeType='recommend'" :class="{active:activeType==='recommend'}">
            <a href="#">每日推荐</a>
          </li>
          <li role="presentation"  @click="activeType='daily'" :class="{active:activeType==='daily'}">
            <a @click="showThemes=!showThemes">主题日报</a>
              <ul class="nav nav-pills nav-stacked" v-show="showThemes">
                <li role="presentation" @click="handleToTheme(item.id)" v-for="item in themeList" :class="{active:activeType==='daily' && thementId===item.id}">
                  <a>{{item.title}}</a>
                </li>
              </ul>
          </li>
        </ul>
      </div>
      <!--  列表div(中间)  -->
      <div class="daily-list col-md-2">
        <template v-if="activeType=='daily'">
            <Item :list="list"></Item>
          </ul>
        </template>
      </div>
      <!--  内容(右边)  -->
      <div class="col-md-8">
        <dailyArticle :id="$store.state.dailyVuex.thementId"></dailyArticle>
      </div>
    </div>
  </div>
</template>

<script>

  import Item from './components/item.vue';
  import dailyArticle from './components/daily-article.vue';

  export default {
    name: 'App',
    components:{Item,dailyArticle},
    data(){
      return{
        showThemes:true,
        activeType:'recommend',
        themeList:[],
        thementId:0,
        list:[]
      }
    },
    methods:{
      getThemes(){
        var _this=this;
        this.$axios.ajax.get('/topics',{
          params: {
            page:1,
            limit:6
          }
        }).then(function (res) {
          _this.themeList=res.data;
        })
      },
      handleToTheme(id){
        var _this=this;
        this.thementId=id;
        this.activeType='daily';
        this.$axios.ajax.get('/topics',{
          params: {
            page:1,
            limit:6
          }
        }).then(function (res) {
          _this.list=res.data;
        })
      }
    },
    mounted(){
      this.getThemes();
    }
  }
</script>

<style>
</style>

说明:
(1)、axios请求:
this.$axios.ajax.get('/topics',{
     params: {
       page:1,
       limit:6
     }
}).then(function (res) {
  _this.themeList=res.data;
})
this.$axios代表全局变量(main.js)里面设置的,这个全局变量指向main.js里面引用的util,js
this.$axios.ajax代表util.js里面的util.ajax,
因为util工具包里面设置了跟路径('/apis'),
所以这里请求的路径为:/apis/topics,参数为params: { page:1, limit:6}

5、config/index.js文件

dev: {
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/apis':{
        target: "https://cnodejs.org/api/v1",
        changeOrigin:true,
        pathRewrite:{
          '^/apis':'/'
        }
      }
    }
    说明:
    vue-lic项目自带服务器,
    当需要请求数据接口的时候,会遇到跨域的问题,这时候就需要修改config/index.js文件的proxyTable属性。
    (1)、'/apis':  这里于util.js里面的axios请求根路径对应,项目中的请求,只要是请求路径为/apis,j就会执行'/apis':{}里面的配置
    (2)、target:目标路径:https://cnodejs.org/api/v1
    (3)、changeOrigin:true:跨域
    (4)、pathRewrite:重写:这里的意思是,当路径里面有apis的时候,就将apis字符替换为''。

以上配置之前,项目中只要是this. a x i o s . a j a x . g e t 或 者 t h i s . axios.ajax.get或者this. axios.ajax.getthis.axios.ajax.post,最终的路径为:
(1)、首先是/apis+url
(2)、请求到本地服务器,因为config/index.js里面配置了proxyTable,所以会根据/apis找到相应的配置
(3)、所有路径就变成了"https://cnodejs.org/api/v1"+"/apis"+url
(4)、因为设置了路径重写,会替换所有的/apis为空,最终的路径为:
https://cnodejs.org/api/v1+url

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值