Nuxt.jsでpluginを使ってみた(郵便番号検索)
前回はaxiosをnuxtに導入して、郵便番号apiやqiita apiを動かしてみました。
今回はnuxtで郵便番号検索プラグイン作ってみたので、自作プラグインの作り方を書いています。
公式のこちらのドキュメントを参考に作ってみました。
プラグインファイルを作成する
plugins/ 配下に作りたいプラグインのjsファイルを配置します。
plugins/zipcode.js という名前で作成しました。
ファイルの内容は下記です。
export default (context, inject) => {
const zipcode = async function(zipcode) {
return await this.$axios.get(`/zipApi/api/search?zipcode=${zipcode}`);
}
inject('zipcode', zipcode);
context.$zipcode = zipcode;
}
前回使ったaxiosで郵便番号apiを叩いている箇所をマルッと持ってきました。
パラメータで、郵便番号を渡して検索した結果のPromiseを返すようにしています。
nuxt.config.jsを編集する
作ったプラグインを使うために、nuxt.config.jsを修正します。
pluginsの配列の中に作ったプラグインを定義します。
/*
** Plugins to load before mounting the App
*/
plugins: [
'~plugins/zipcode.js'
],
自作プラグインを使ってみる
スクリプト
こんな感じでスクリプトを書いてみました。
export default {
data() {
return {
zipcode: null,
searchResults: [],
}
},
mounted() {
console.log('mounted plugin test page');
},
methods: {
async search() {
let page = this;
await this.$zipcode(this.zipcode).then(function(result) {
page.searchResults = result.data.results;
for (let key in result.data.results){
let value = result.data.results[key];
}
});
}
}
}
検索ボタン(search)が押されたときに、郵便番号を渡して、
結果がPromiseで戻ってくるので、thenのクロージャで受け取って、グローバルなsearchResults変数に入れました。
inject('zipcode', zipcode);
context.$zipcode = zipcode;
plugin作成時に上記のように書いているところがポイントで
injectしているため、this.$zipcodeみたいな感じで使えるようです。
タグ
タグはこんな感じです。
<template lang="pug">
div.container
h2 郵便番号検索
v-row(align="center")
v-col(cols='3')
v-text-field(label="郵便番号" v-model="zipcode" placeholder="8100000" dense hint)
v-col(cols='4')
v-btn.primary(@click="search") 検索
v-row
v-col(cols='12')
v-list
v-list-item-group(v-for="(item, key) in searchResults")
v-list-item
v-list-item-content {{item.address1}}{{item.address2}}{{item.address3}} ({{item.kana1}}{{item.kana2}}{{item.kana3}})
v-divider
</template>
テキストフィールドで入れた値はスクリプト定義のzipcodeと紐づけてます。
v-forで取れた値をループして、それぞれ繋げています。
動作確認
画面はこんな感じになってます…
郵便番号入れて検索すると….
OK!👍
コメント