監視プロパティでテキストボックスを監視しておき、キーワードが入力された時点でQiitaのAPIを呼び出して検索結果を取得するサンプルです。
キーワードが入力される度にAPIを呼び出すと大変なので、一定時間(とりあえず1秒)操作が止まった時点でAPIを呼び出すため、lodashのdebounceを利用してます。
サンプルはこちら。
以下、ソース。
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Qiita検索</title>
<style>
[v-cloak] { display: none; }
</style>
</head>
<body>
<div id="app">
<p>
検索キーワード:<input type="text" v-model="keyword">
</p>
<p v-cloak>
{{ message }}
</p>
<ul>
<li v-for="item in items" v-cloak>
<a v-bind:href="item.url" target="_blank">{{ item.title }}</a> いいね数: {{ item.likes_count }}
</li>
</ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios@0.18.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
JavaScript
var app = new Vue({
el: '#app',
data: {
items: null,
keyword: '',
message: '',
},
watch: {
keyword: function(newKeyword, oldKeyword){
// lodash.debounceを利用してAPI呼び出しの負荷軽減
this.message = '入力が終わるのを待ってます・・・';
this.debouncedGetAnswer();
}
},
created: function() {
// lodash.debounce によって、1秒間操作が無くなった時点でAPI呼び出し実施
// キー入力の度にAPIを呼び出すような負荷をかけないため
this.debouncedGetAnswer = _.debounce(this.getAnswer, 1000);
},
methods: {
getAnswer: function(){
// キーワードが空の場合はメッセージと検索結果を空にして処理終了
if( this.keyword === ''){
this.items = null;
this.message = '';
return;
}
this.message = 'loading...';
var vm = this;
var params = { page:1, per_page: 20, query: this.keyword };
axios.get('https://qiita.com/api/v2/items', {params})
.then(function(response){
console.log(response);
vm.items = response.data;
})
.catch(function(error){
vm.message = 'Error!' + error;
})
.finally(function(){
vm.message = '';
})
}
}
})


コメント