Vue基础18
- github案例
- 静态页面
- 第三方样式引入(以bootstrap举例)
- App.vue
- Search.vue
- List.vue
- 列表展示
- 接口地址
- 使用全局事件总线进行兄弟间组件通信
- Search.vue
- List.vue
- 完善案例
- List.vue
- Search.vue
- 补充知识点:{...this.info,...this.dataObj}
- 效果呈现
- vue-resource
- 安装
- 引用
- main.js
- 使用
- Search.vue
github案例
静态页面
第三方样式引入(以bootstrap举例)
-
public中创建文件夹css,将样式放入
-
在index.html中使用link引入
<!-- 引入第三方样式 -->
<link rel="stylesheet" href="<%= BASE_URL %>css/bootstrap.css">
App.vue
<template>
<div class="bg">
<Search/>
<List/>
</div>
</template>
<script>
import Search from "@/components/Search";
import List from "@/components/List";
export default {
name: "App",
components: {Search, List},
methods:{
}
}
</script>
<style lang="less">
</style>
Search.vue
<template>
<div class="jumbotron bg">
<h1>Search Github Users</h1>
<p><input type="text" placeholder="输入你想要搜索的用户名">
<a class="btn btn-default btn-lg" href="#" role="button">Search</a>
</p>
</div>
</template>
<script>
export default {
name: "Search"
}
</script>
<style scoped lang="less">
.bg{
height: 250px;
margin: 0 20px;
padding-left: 50px;
padding-top: 50px;
.title{
font-size: 20px;
}
input{
margin-right: 10px;
}
}
</style>
List.vue
<template>
<div class="bg">
<div class="predict" v-show="isShow">welcome to use</div>
<div class="pro-list">
<div class="pro-item" v-for="item in content">
<img src="@/assets/logo.png" alt="">
<div class="text">122555</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "List",
data(){
return{
isShow:false,
content:["","","","","","","","","",""]
}
}
}
</script>
<style scoped lang="less">
.bg{
margin: 0 20px;
font-size: 24px;
.pro-list{
display: flex;
flex-wrap: wrap;
.pro-item{
margin: 50px 120px;
.text{
text-align: center;
}
}
}
}
</style>
列表展示
接口地址
https://api.github.com/search/users?q=xxx
用到的响应值:
- avatar_url:头像链接
- html_url:用户详情页
- login:用户名
使用全局事件总线进行兄弟间组件通信
Search.vue
<template>
<div class="jumbotron bg">
<h1>Search Github Users</h1>
<p>
<input type="text" placeholder="输入你想要搜索的用户名" v-model="keywords">
<a class="btn btn-default btn-lg" href="#" role="button" @click="searchUsers">Search</a>
</p>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "Search",
data(){
return{
keywords:"",
}
},
methods:{
searchUsers(){
if(this.keywords.trim()=="") return alert("用户输入的内容不得为空")
axios.get(`https://api.github.com/search/users?q=`+this.keywords).then(
response=>{
// console.log(response.data.items)
console.log("请求成功了~")
this.$bus.$emit('getUsersList',response.data.items)
},
error=>{
console.log(error.msg)
}
)
}
}
}
</script>
<style scoped lang="less">
.bg{
height: 250px;
margin: 0 20px;
padding-left: 50px;
padding-top: 50px;
.title{
font-size: 20px;
}
input{
margin-right: 10px;
}
}
</style>
List.vue
<template>
<div class="bg">
<div class="predict" v-show="!users.length">welcome to use</div>
<div class="pro-list">
<div class="pro-item" v-for="user in users" :key="user.login">
<a :href="user.html_url" class="aitem">
<img :src="user.avatar_url" alt="">
</a>
<div class="text">{{ user.login }}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "List",
data(){
return{
isShow:false,
users:[],
}
},
mounted() {
this.$bus.$on('getUsersList',(users)=>{
this.users=users
})
}
}
</script>
<style scoped lang="less">
.bg{
margin: 0 20px;
font-size: 24px;
.pro-list{
display: flex;
flex-wrap: wrap;
.pro-item{
margin: 50px 120px;
.aitem{
display: inline-block;
width: 200px;
height: 200px;
}
img{
width: 200px;
height: 200px;
}
.text{
text-align: center;
}
}
}
}
</style>
完善案例
List.vue
<template>
<div class="bg">
<h1 class="predict" v-show="info.isFirst">欢迎使用!</h1>
<h1 v-show="info.isLoading">加载中...</h1>
<h1 v-show="info.emsg">错误信息:{{info.emsg}}</h1>
<div class="pro-list">
<div class="pro-item" v-for="user in info.users" :key="user.login">
<a :href="user.html_url" class="aitem">
<img :src="user.avatar_url" alt="">
</a>
<div class="text">{{ user.login }}</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "List",
data(){
return{
isShow:false,
users:[],
info:{
isFirst:true,
isLoading:false,
emsg:"",
users:[]
}
}
},
mounted() {
this.$bus.$on('updateListData',(dataObj)=>{
this.info={...this.info,...dataObj}
})
}
}
</script>
<style scoped lang="less">
.bg{
margin: 0 20px;
font-size: 24px;
.pro-list{
display: flex;
flex-wrap: wrap;
.pro-item{
margin: 50px 120px;
.aitem{
display: inline-block;
width: 200px;
height: 200px;
}
img{
width: 200px;
height: 200px;
}
.text{
text-align: center;
}
}
}
}
</style>
Search.vue
<template>
<div class="jumbotron bg">
<h1>Search Github Users</h1>
<p>
<input type="text" placeholder="输入你想要搜索的用户名" v-model="keywords">
<a class="btn btn-default btn-lg" href="#" role="button" @click="searchUsers">Search</a>
</p>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "Search",
data(){
return{
keywords:"",
}
},
methods:{
searchUsers(){
if(this.keywords.trim()=="") return alert("用户输入的内容不得为空")
else{
this.$bus.$emit("updateListData",{isFirst:false,isLoading:true,emsg:"",users:[]})
axios.get(`https://api.github.com/search/users?q=${this.keywords}`).then(
response=>{
// console.log(response.data.items)
console.log("请求成功了~")
this.$bus.$emit('updateListData',{isLoading:false,emsg:"",users:response.data.items})
},
error=>{
console.log(error.msg)
this.$bus.$emit("updateListData",{isLoading:false,emsg:error.message,users:[]})
}
)
}
}
}
}
</script>
<style scoped lang="less">
.bg{
height: 250px;
margin: 0 20px;
padding-left: 50px;
padding-top: 50px;
.title{
font-size: 20px;
}
input{
margin-right: 10px;
}
}
</style>
补充知识点:{…this.info,…this.dataObj}
{…this.info,…this.dataObj}:通过字面量的形式合并一下对象
以this.dataObj为主,依次替换this.info中的属性的值,但是this.dataObj中没有的数据,还是沿用this.info中的
效果呈现
vue-resource
发送Ajax的5种方式:
1.xhr
2.jQuery
3.axios
4.fetch
5.vue-resource(插件库)对xhr的封装
安装
npm i vue-resource
引用
main.js
import Vue from 'vue'
import App from './App'
//引入vue-resource插件
import vueresource from 'vue-resource'
Vue.config.productionTip = false
//使用vue-resource插件
Vue.use(vueresource)
new Vue({
el: "#app",
render: h => h(App),
beforeCreate() {
Vue.prototype.$bus = this
}
})
使用
与axios一致,只需要将axios替换成this.$http就行
this.$http.get(`https://api.github.com/search/users?q=${this.keywords}`).then(
response=>{
// console.log(response.data.items)
console.log("请求成功了~")
this.$bus.$emit('updateListData',{isLoading:false,emsg:"",users:response.data.items})
},
error=>{
console.log(error.msg)
this.$bus.$emit("updateListData",{isLoading:false,emsg:error.message,users:[]})
}
)
Search.vue
<template>
<div class="jumbotron bg">
<h1>Search Github Users</h1>
<p>
<input type="text" placeholder="输入你想要搜索的用户名" v-model="keywords">
<a class="btn btn-default btn-lg" href="#" role="button" @click="searchUsers">Search</a>
</p>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "Search",
data(){
return{
keywords:"",
}
},
methods:{
searchUsers(){
if(this.keywords&&this.keywords.trim()=="") return alert("用户输入的内容不得为空")
else{
this.$bus.$emit("updateListData",{isFirst:false,isLoading:true,emsg:"",users:[]})
this.$http.get(`https://api.github.com/search/users?q=${this.keywords}`).then(
response=>{
// console.log(response.data.items)
console.log("请求成功了~")
this.$bus.$emit('updateListData',{isLoading:false,emsg:"",users:response.data.items})
},
error=>{
console.log(error.msg)
this.$bus.$emit("updateListData",{isLoading:false,emsg:error.message,users:[]})
}
)
}
}
}
}
</script>
<style scoped lang="less">
.bg{
height: 250px;
margin: 0 20px;
padding-left: 50px;
padding-top: 50px;
.title{
font-size: 20px;
}
input{
margin-right: 10px;
}
}
</style>