个人笔记axios及代理

axios

在Vue中发送Ajax有很多工具可以使用 比如说浏览器自带的fetch函数 也可以使用vue-resource,当然我们使用官方推荐的axios,他的功能非常强大,他能实现跨平台的数据请求

// 使用axios就要安装axios
npm install axios --save
// 这么多的请求难道我要一个一个请求  这样太耗费性能  所有我应该在使用所有组件的地方发一次请求获取数据,然后把数据传个每一个子组件
import axios from 'axios'

 methods: {
    
    
    // 获取ajax的数据
    getHomeInfo () {
    
    
      axios.get('/api/index.json')
      // axios 返回的结果是一个promise对象 所以我们可以用then
        .then(this.getHomeInfoSucc)
    },
    getHomeInfoSucc (res) {
    
    
      // 数据获取成功呢我就把数据打印出来
      console.log(res)
    }
  },
  // 我们可以在生命周期 mounted 中写axios的代码
  mounted () {
    
    
    // 我们在这里写一个函数 函数定义在methods中
    this.getHomeInfo()
  }
  // 这个时候没有数据会发生404 在没有后端支持的情况下我们该怎么模拟数据呢

定义模拟数据

// 在static静态文件夹中创建mock文件夹然后创建index.json
// 为什么在static中创建呢? 因为所有工程中的内容只有static中的内容可以被外部访问到
// 由于是我自己写的数据我不希望他上传到线上,所有我一个把它添加到 .gitignore

转发机制(代理)

由于我们现在用的是本地模拟的接口地址,假如代码要上线,那么在上线前你肯定要把代码都替换成 /api 这种形式,而上线前改动代码是有风险的,那么我们如果在开发是也这么写就需要这样一个转发机制 把/api.index.json转到mock文件夹下,webpack提供给我们一个功能就是代理,通过这个功能我们就可以实现我们的一个构想
在这里插入图片描述

 // config文件夹下有一个index.js 文件
 // 如上图我们可以看到在开发环境下vue给我们提供了一个proxyTable配置项在这里我们添加一些配置就可以实现刚才的想法
  proxyTable: {
    
    
      // 当我去请求api这个目录的时候
      '/api': {
    
    
        // 我希望他帮我们把请求转发到当前服务器
        target: 'http://localhost:8080',
        // 我希望他的路径做一个替换
        pathRewrite: {
    
    
          // 一旦你请求的地址是以/api开头的 那么我就把他的路径替换为后者
          '^/api' : 'static/mock'
        }
      }
    }
// 当我们改动了配置项文件时需要重启一下

父子组件数据传递

把父组件通过axios请求过来的数据传递给各个子组件

// 首先在父组件中创建一个data,这里存储了这个页面的各种数据
<home-header :city="city"></home-header> //父组件传值

 props: {
    
     // 子组件接收
    city: String //数据类型为string
  }
 {
    
    {
    
    this.city}} //子组件使用
 
 // 逻辑
 methods: {
    
    
    // 获取ajax的数据
    getHomeInfo () {
    
    
      axios.get('/api/index.json')
      // axios 返回的结果是一个promise对象 所以我们可以用then
        .then(this.getHomeInfoSucc)
    },
    getHomeInfoSucc (res) {
    
    
      // 数据获取成功呢我就把数据打印出来
      // console.log(res)
      res = res.data
      console.log(res.data)
      // 也就是说如果后端正确的返回了结果 且 有data这个内容项
      if (res.ret && res.data) {
    
    
        // 定义一个变量
        const data = res.data
        // 那么我就可以这样赋值
        this.city = data.city
      }
    }
  },
  // 我们可以在生命周期 mounted 中写axios的代码
  mounted () {
    
    
    // 我们在这里写一个函数 函数定义在methods中
    this.getHomeInfo()
  }

解决swiper图片顺序问题

当父组件给子组件传值的时候,传递过来的是一个空数组,所以会导致问题最后一张图片是默认图片

// 解决方法是 给swiper添加 v-if=“list.leng” 当数组为空时不添加
// 这么写实际上不优雅 我们说我们在模板里面尽量避免出现这些逻辑性代码
// 所以我们应该用计算属性
v-if="showSwiper"
 computed: {
    
    
    showSwiper () {
    
    
      return this.list.length
    }
  } 

使用一像素边框

// 在class 名中加一个 border-bottom就行了在底部添加一像素边框

猜你喜欢

转载自blog.csdn.net/qq_52151772/article/details/113308716