仿GitHub搜索案例---Vue2+axios实现

效果图
在这里插入图片描述
1.先用vue-cli初始化工程

vue create github
List组件
<template>
  <div class="row">
    <!-- 展示用户列表 -->
    <div class="card" v-for="user in info.users" :key="user.login">
      <a :href="user.html_url" target="_blank">
        <img :src="user.avatar_url" style='width: 100px' />
      </a>
      <p class="card-text">{
   
   { user.login }}</p>
    </div>
    <!-- 展示欢迎词 -->
    <h1 v-show="info.isFirst">欢迎使用</h1>
    <!-- 展示加载中 -->
    <h1 v-show="info.isLoading">加载中。。。</h1>
    <!-- 展示错误信息 -->
    <h1>{
   
   { info.errMsg }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      info: {
        isFirst: true,
        isLoading: false,
        errMsg: '',
        users: []
      }
    }
  },
  methods: {

  },
  mounted() {
    // 谁接收数据谁就在$bus上绑定事件
    this.$bus.$on('getUsers', dataObj => {
      this.info = { ...this.info, ...dataObj }
    })

  }
}
</script>

<style scoped>
.album {
  min-height: 50rem;
  /* Can be removed; just added for demo purposes */
  padding-top: 3rem;
  padding-bottom: 3rem;
  background-color: #f7f7f7;
}

.card {
  float: left;
  width: 33.333%;
  padding: .75rem;
  margin-bottom: 2rem;
  border: 1px solid #efefef;
  text-align: center;
}

.card>img {
  margin-bottom: .75rem;
  border-radius: 100px;
}

.card-text {
  font-size: 85%;
}
</style>
Search组件
<template>
  <section class="jumbotron">
    <h3 class="jumbotron-heading">Search Github Users</h3>
    <div>
      <input v-model="userInfo" type="text" placeholder="enter the name you search" />&nbsp;
      <button @click="getUserInfo">Search</button>
    </div>
  </section>
</template>

<script>
import axios from 'axios'
export default {
    
    
  data() {
    
    
    return {
    
    
      userInfo: ''
    }
  },
  methods: {
    
    
    // 发送数据

    getUserInfo() {
    
    

      // 谁发送数据谁就触发自定义事件
      // 加载前
      this.$bus.$emit('getUsers', {
    
     isFirst: false, errMsg: '', users: [], isLoading: true })
      axios.get(`https://api.github.com/search/users?q=${
      
      this.userInfo}`)
        .then(res => {
    
    
          // 加载成功
          this.$bus.$emit('getUsers', {
    
     errMsg: '', users: res.data.items, isLoading: false })
        }, err => {
    
    
          // 加载失败
          this.$bus.$emit('getUsers', {
    
     errMsg: err.message, users: [], isLoading: false })
        })

    }
  }
}
</script>

<style>

</style>
app组件
<template>
  <div id="app">
    <div class="container">
      <Search />
      <List />
    </div>
  </div>
</template>

<script>
import List from './components/List'
import Search from './components/Search'
export default {
      
      
  name: 'App',
  components: {
      
       List, Search }
}
</script>

<style>

</style>
//main.js
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
    
    
  render: h => h(App),
  beforeCreate() {
    
    
    Vue.prototype.$bus = this
  }
}).$mount('#app')

猜你喜欢

转载自blog.csdn.net/m0_60429030/article/details/127727240