Vue笔记_04_Vue中的ajax

第四章 Vue中的ajax

Vue脚手架配置代理

方法一

在vue.config.js中添加如下配置:

devServer: {
    proxy:"http://localhost:5000" // 请求的目标路径
}

说明:

  1. 优点:配置简单,请求资源时直接发给前端(8080)即可
  2. 缺点:不能配置多个代理,不能灵活控制请求是否走代理
  3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源的时候,那么改请求会转发给服务器(优先匹配前端资源)

方法二

编写vue.config.js配置具体代理规则:

module.exports = {
  devServer: {
    proxy: {
      '/api': { // 匹配所有以'/api'开头的请求路径
        target: '<url>', // 代理目标的基础路径
        ws: true,
        changeOrigin: true,
        pathRewrite: {'^api': ''} // 重写路径,将以api开头的路径,将api改为空字符
      },
      '/foo': {
        target: '<other_url>'
      }
    }
  }
}
/**
 * changeOrigin设置为true时,服务器收到的请求头中的host为服务器的位置,也就是撒谎
 * changeOrigin设置为false时,服务器收到的请求头中的host为本机的位置,也就是不撒谎
 * changeOrigin的默认值是true
 */

说明:

  1. 优点:可以配置多个代理,且可以灵活控制请求是否走代理
  2. 缺点:配置略微繁琐,请求资源时必须加前缀

github用户搜索案例

App.vue文件里:

<template>
  <div>
    <Search/>
    <UsersList/>
  </div>
</template>

<script>
import Search from './components/Search.vue'
import UsersList from './components/UsersList.vue'

// 引入vue时为了注册全局事件总线
import Vue from 'vue'

export default {
  name:'App',
  components: {
    Search,
    UsersList
  },
  
  // 在实例创建之前注册全局事件总线
  beforeCreate() {
    Vue.prototype.$bus = this
  }
}
</script>

<style>
  * {
    margin: 0;
    padding: 0;
  }
</style>

Search.vue文件里:

<template>
  <div>
    <h3>Search Github Users</h3>
    <!-- @keyup.enter键盘事件 -->
    <input ref="input" type="text" v-model="UserName" @keyup.enter="inputSearchUsers"><button @click="searchUsers">Search</button>
  </div>
</template>

<script>
// 注册axios
// npm --save i axios
import axios from 'axios'

export default {
  name:'Search',
  data() {
    return {
      UserName:''
    }
  },
  methods: {
    searchUsers() {
      this.$bus.$emit('updataListData', {isFirst:false, isLoading:true, errorMsg:'', users:''})
      // 使用axios进行get请求
      axios.get(`https://api.github.com/search/users?q=${this.UserName}`).then(

        // 成功时执行response方法
        response => {
          console.log('获取成功')

          // response.data是获取到的数据
          // this.$bus.$emit('getUsers', response.data.items)
          this.$bus.$emit('updataListData', {isFirst:false, isLoading:false, errorMsg:'', users:response.data.items})
        },

        // 失败时执行error方法
        error => {

          // error是获取失败的原因
          // console.log('获取失败,失败原因是:', error.message)
          this.$bus.$emit('updataListData', {isFirst:false, isLoading:false, errorMsg:error.message, users:''})
        }
      )
    },
    // 按下回车搜索名字
    inputSearchUsers() {
      this.searchUsers()

      // 让input失去焦点
      this.$refs.input.blur()
    }
  },
}
</script>

<style scoped>
  div {
    width: 98%;
    height: 120px;
    box-sizing: border-box;
    background-color: #dad8d8;
    margin: 0 auto;
    overflow: hidden;
    padding-left: 10px;
    padding-top: 60px;
  }
  
  button {
    margin-left: 5px;
  }

  button:hover {
    cursor: pointer;
  }
</style>

UsersList.vue文件里:

<template>
  <div id="UsersList">
    <h3 v-show="info.isFirst">Welcome to Search Github Users</h3>
    <h3 v-show="info.isLoading">Loding...</h3>
    <h3 v-show="info.errorMsg">{{info.errorMsg}}</h3>
    <User v-for="user in info.users" :key="user.login" :user="user"/>
  </div>
</template>

<script>
import User from './User.vue'

export default {
  name:'UsersList',
  components: {User},
  data() {
    return {
      info: {
        isFirst:true,
        isLoading:false,
        errorMsg:'',
        users:[]
      }
    }
  },
  mounted() {
    // this.$bus.$on('getUsers', (users) => {
    //   this.Users = users
    // }),
    this.$bus.$on('updataListData', (dataObj) => {
      this.info = dataObj
      // 如果没有搜到这个用户,则输出'The user is not exit'
      if (this.info.users.length === 0) {
        this.info.errorMsg = 'The user is not exit'
      }
    })
  },
}
</script>

<style scoped>
  div#UsersList {
    box-sizing: border-box;
    padding: 5px;
    width: 98%;
    margin: 10px auto 0;
    border: 1px solid #999;
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
  }
</style>

User.vue文件里:

<template>
  <div id="User">
    <a :href="user.html_url" target="_blank">
      <img :src="user.avatar_url" alt="">
    </a>
    <h4>{{user.login}}</h4>
  </div>
</template>

<script>
export default {
  name:'User',
  props:['user']
}
</script>

<style scoped>
  div#User {
    width: 24.6%;
    box-sizing: border-box;
    padding: 15px 0;
    text-align: center;
    border: 1px solid #d6d5d5;
    overflow: hidden;
    margin-bottom: 5px;
  }

  a {
    display: block;
    margin: 0 auto;
    width: 100px;
    height: 100px;
    border-radius: 50%;
    overflow: hidden;
  }
  a img {
    width: 100%;
    height: 100%;
  }
  h4 {
    margin-top: 15px;
    color: #666;
  }
</style>

插槽

  1. 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于父组件==>子组件

  2. 分类:默认插槽,具名插槽,作用域插槽

  3. 使用方法:

    1. 默认插槽:

      // 父组件中:
      <Category>
          <div>
              html结构1
          </div>
      </Category>
      
      // 子组件中:
      <template>
      	<div>
          	<!--定义插槽-->
              <slot>插槽默认内容。。。</slot>
          </div>
      </template>
      
    2. 具名插槽:

      // 父组件中:
      <Category>
          <template slot="center">
      		<div>
                  html结构1
              </div>
          </template>
          
          <template slot="footer">
      		<div>
                  html结构2
              </div>
          </template>
      </Category>
      
      // 子组件中:
      <template>
      	<div>
              <!--定义插槽-->
              <slot name="center">插槽默认内容。。。</slot>
              <slot name="footer">插槽默认内容。。。</slot>
          </div>
      </template>
      
    3. 作用域插槽:

      1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但是使用数据所遍历出来的结构由App组件决定)

      2. 具体编码:

        // 父组件中:
        <Category>
            <template scope="scopeData">
        		<!--生成的是ul列表-->
        		<ul>
                    <li v-for="g in scopeData.games" :key="g">{{g}}</li>
                </ul>
            </template>
        </Category>
        
        // 子组件中:
        <template>
        	<div>
                <slot :games="games"></slot>
            </div>
        </template>
        
        <script>
            export default {
                name:'Category',
                props:['title'],
                // 数据在子组件自身
                data() {
                    return {
                        games:['红色警戒','穿越火线','阴阳师']
                    }
                },
            }
        </script>
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绒毛鸭鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值