假期vue学习笔记12 github案例

hbro / 2024-02-28 / 原文

 从github网站上取到用户头像

<template>
        <div class="container">
            <Search/>
            <List/>
        </div>
</template>

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

<template>
    <div class="row">
        <!-- 展示用户列表 -->
        <div v-show="info.users.length" 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 v-show="errMsg">{{info.errMsg}}</h1>
    </div>
</template>

<script>
    export default{
        name:'List',
        data(){
            return{
              info:{
                isFirst:true,
                isLoading:false,
                errMsg:'',
                users:[]
              }
            }
        },
        mounted() {
            this.$bus.$on('updateListData',(dataObj)=>{
             this.info = {...this.info,...dataObj}
            })
        },
    }
</script>

<style scoped>
    .album{
        min-height: 50rem;
        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>

 
<template>
    <section class="jumbotron">
        <h3 class="jumbotron-heading">Search Github Users</h3>
        <div>
            <input type="text" placeholder="enter the name you search" v-model="keyWord"/>&nbsp;
            <button @click="searchUsers">Search</button>
        </div>
    </section>
</template>

<script>
 import axios from 'axios'
    export default{
        name:'Search',
        data(){
            return{
                keyWord:''
            }
        },
        methods: {
            searchUsers(){
                this.$bus.$emit('updateListData',{isFirst:false,isLoading:true,errMsg:'',users:[]})
                axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then(
                    response => {
                        console.log('请求成功了')
                        this.$bus.$emit('updateListData',{isLoading:false,errMsg:'',users:response.data.items})
                    },
                    error => {
                        console.log('请求失败了',error.message)
                        this.$bus.$emit('updateListData',{isLoading:false,errMsg:error.message,users:[]})
                    }
                )
            }
        },
    }
</script>

<style>
.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

.jumbotron {
  background-color: #f5f5f5;
  padding: 20px;
  text-align: center;
}

.jumbotron-heading {
  font-size: 24px;
  margin-bottom: 20px;
}

input[type="text"] {
  width: 200px;
  padding: 10px;
  border-radius: 5px;
  border: 1px solid #ccc;
}

button {
  padding: 10px 20px;
  background-color: #007bff;
  color: #fff;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

button:hover {
  background-color: #0056b3;
}

</style>