Vue.js3系(composition API)で郵便番号から住所検索機能(yubinbango-core2)を実装する

jQueryなどで郵便番号検索機能を実装する際はyubinbango.jsなどを使うことが多いかと思いますが、
Vue.jsでは「yubinbango-core2」という郵便番号のライブラリを
インストールすることで実装することが可能です。
(yubinbango-coreは不具合がありうまく実装できないのでyubinbango-core2をインストールする必要があります YubinBango module が export されていない · Issue #4 · yubinbango/yubinbango-core)

yubinbango-core2をインストール

npm i yubinbango-core2

vueファイルに記述

<template>
  <div class="xl:grid xl:grid-cols-2 text-sm">
    <div class="flex flex-wrap flex-row mt-2">
      <div class="w-4/12 px-4 py-2 font-semibold">郵便番号</div>
      <input
        type="text"
        class="w-3/12 mr-2 px-4 py-2 border rounded"
        v-model="formItem.zip"
      />
      <button
        class="bg-blue-600 text-white px-4 py-2 rounded whitespace-nowrap"
        @click.prevent="searchAddress()"
      >
        住所検索
      </button>
    </div>
    <div class="flex flex-wrap flex-row mt-2">
      <div class="w-1/3 px-4 py-2 font-semibold">都道府県</div>
      <input
        type="text"
        class="w-3/12 mr-2 px-4 py-2 border rounded"
        v-model="formItem.pref"
      />
    </div>
    <div class="flex flex-wrap flex-row mt-2">
      <div class="w-1/3 px-4 py-2 font-semibold">住所</div>
      <input
        type="text"
        class="w-2/3 px-4 py-2 border rounded"
        v-model="formItem.address"
      />
    </div>
  </div>
</template>


<script>
import { reactive } from "vue";
import { Core as YubinBangoCore } from "yubinbango-core2";

export default {
  setup() {
    const formItem = reactive({
      zip: "",
      pref: "",
      address: "",
    });

    const searchAddress = () => {
      new YubinBangoCore(formItem.zip, (value) => {
        formItem.pref = value.region; // 都道府県 IDを取得したい時はregion_idと記述
        formItem.address = value.locality; // 市区町村
        formItem.address += value.street; // 町域
      });
    };

    return {
      formItem,
      searchAddress,
    };
  },
};
</script>

ボタンのクリックイベントで郵便番号から住所を取得しています。(classにtailwind.cssでコーディングした名残がのこっています。。。)
yubinbango-core2を使えば簡単に住所検索を実装することができますのでぜひ試してみてください。

@changeイベントで住所検索する場合

ボタンのクリックイベントではなく郵便番号が入力された瞬間に住所を取得したい場合は少し工夫が必要でした。

<div class="w-4/12 px-4 py-2 font-semibold">郵便番号</div>
<input
  type="text"
  class="w-3/12 mr-2 px-4 py-2 border rounded"
  v-model="formItem.zip"
 @change="searchAddress" //changeイベント
/>

@changeイベントの場合数字以外の文字列がフォームに入力されるとエラー画面になってしまいます。
ですので、正規表現で入力された値をチェックしてマッチしていたら住所検索をするという風に書いてあげると動きました。

const searchAddress = () => {
  if (!formItem.zip.match(/^\d{3}-?\d{4}$/)) { //入力された値をチェック
    return false
  }
  new YubinBangoCore(formItem.zip, (value) => {
    formItem.pref = value.region; // 都道府県 IDを取得したい時はregion_idと記述
    formItem.address = value.locality; // 市区町村
    formItem.address += value.street; // 町域
  });
};

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。