How To Create a Vue Country Code Dropdown
Introduction
I wanted to create a Vue dropdown component that allows users to select a country. Ideally, I would prefer to use a package that provides country codes with the country selection. With over 200+ countries, I’d rather not do it by hand.
What are country codes?
Country codes are short alphabetic or numeric geographic codes, similar to state initials, except for countries.
Country code package
I found a npm package i18n-iso-countries
which provides us the ISO 3166-1 code in Alpha-2, Alpha-3, and Numeric codes. We can always double-check the [official country codes] through Wikipedia.
Installation
Install with npm: npm install i18n-iso-countries --save
To use it in a browser environment, we need to register the language.
// Support English languages.
countries.registerLocale(require("i18n-iso-countries/langs/en.json"));
Creating the select input
Let’s create the country select dropdown with selected as a data variable. Selection options are generally in an Array full of Objects in label, value pairs.
<template>
<select v-model="selected">
<option v-for="option in options" :value="option.value">
{{ option.label }}
</option>
</select>
</template>
<script>
export default {
name: 'CountrySelection',
data () {
return {
selected: null,
options: []
}
}
}
</script>
Importing the country codes
Let’s import the i18n-iso-countries
package and register the English locale.
<template>
...
</template>
<script>
const countries = require('i18n-iso-countries')
countries.registerLocale(require('i18n-iso-countries/langs/en.json'))
export default {
name: 'CountrySelection',
data () {
...
}
}
</script>
Instead of using a data option variable, I’m going to map through the countries and create an array as computed.
<template>
...
</template>
<script>
const countries = require('i18n-iso-countries')
countries.registerLocale(require('i18n-iso-countries/langs/en.json'))
export default {
name: 'CountrySelection',
computed: {
countries () {
const list = countries.getNames('en', { select: 'official' })
return Object.keys(list).map((key) => ({ value: key, label: list[key] }))
}
},
data () {
return {
selected: null
}
}
}
</script>
Creating a Vue Country Code Select
Now, we can update the options to iterate through the countries
computed property.
<template>
<select v-model="selected">
<option v-for="country in countries" :value="country.value">
{{ country.label }}
</option>
</select>
</template>
<script>
const countries = require('i18n-iso-countries')
countries.registerLocale(require('i18n-iso-countries/langs/en.json'))
export default {
name: 'CountrySelection',
computed: {
countries () {
const list = countries.getNames('en', { select: 'official' })
return Object.keys(list).map((key) => ({ value: key, label: list[key] }))
}
},
data () {
return {
selected: null
}
}
}
</script>
Conclusion
Using i18n-iso-countries
, we created a Vue selection component that provides us with the ISO codes of each country. This is a great addition to any Vue form for international users.