直接上源码:
<template>
<div>
<Input v-model="inputVal" placeholder="Enter something..." @keyup.native="inputChange" />
</div>
</template>
<script>
import axios from 'axios'
export default {
computed: {
...mapGetters(['stateCount', 'stateCategoryList'])
},
data () {
return {
inputVal: '',
cancel: null,
timer: 0,
}
},
methods: {
inputChange() {
if(this.timer){
clearTimeout(this.timer);
}
if(this.inputVal){
this.timer = setTimeout(() => {
this.remoteSearch(this.inputVal)
}, 300)
}else{
// 输入框中的内容被删为空时触发,此时会清除之前展示的搜索结果
this.remoteSearch(this.inputVal)
}
},
// 监听输入框所触发的实时搜索组件用于向后端请求的方法
// GET方式
/*remoteSearch(keyword) {
// 如果存在上一次请求,则取消上一次请求
if(this.cancel){
this.cancel('Cancel last request');
}
// 定义CancelToken,它是axios的一个属性,且是一个构造函数
let CancelToken = axios.CancelToken;
// 使用axios的get方法获取请求结果,在请求时需要传入cancelToken参数,
// 实例化一个CancelToken,实例化后会生成一个类似于id的请求令牌,将它赋值给全局的cancel变量。
axios.get('/api/aaaa', {
params: { name: keyword },
cancelToken: new CancelToken((c) => {
this.cancel = c;
})
}).then((res) => {
// 将请求的结果赋值给personData全局变量,用于展示搜索结果
console.log(res, 'res')
})
}*/
// POST方式
remoteSearch(keyword) {
// 如果存在上一次请求,则取消上一次请求
if(this.cancel){
this.cancel('Cancel last request');
}
axios.post('/api/aaaa', {kw:keyword}, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json'
},
cancelToken: new axios.CancelToken((c) => {
// An executor function receives a cancel function as a parameter
this.cancel = c;
})
}).then((res) => {
// 在这里处理得到的数据
console.log(res, 'res')
}).catch((err) => {
if (axios.isCancel(err)) {
console.log('Rquest canceled', err.message); //请求如果被取消,这里是返回取消的message
} else {
//handle error
console.log(err);
}
})
},
}
}
</script>