vue-google-maps-address-autocomplete
Version:
Google Maps Address Autocomplete suggests street addresses to users as they type an address into a form. This component aims at integrating this logic seamlessly into your Vue.js project.
125 lines (105 loc) • 3.33 kB
JavaScript
var script = {
data () {
return {
addressAutocompleteRef: 'addressAutocompleteReference',
};
},
props: {
countryRestrictions: {
type: Array,
default () {
return ['be'];
},
},
},
methods: {
loadScript (src, id = null) {
return new Promise(function (resolve, reject) {
if (document.querySelector('script[src="' + src + '"]')) {
resolve();
return;
}
const el = document.createElement('script');
el.type = 'text/javascript';
el.async = true;
el.src = src;
el.id = id;
el.addEventListener('load', resolve);
el.addEventListener('error', reject);
el.addEventListener('abort', reject);
document.head.appendChild(el);
});
},
loadGoogleMapsScript () {
this.loadScript(`https://maps.googleapis.com/maps/api/js?key=${this.$googleMapsApiKey}&libraries=places`)
.then(() => {
this.initializeAddressAutocomplete();
});
},
initializeAddressAutocomplete () {
const refComponent = this.$scopedSlots.default()[0].context.$refs[this.addressAutocompleteRef];
if (!refComponent) return;
let inputElement;
if (refComponent.$children && refComponent.$children[0]) {
inputElement = Object.values(refComponent.$children[0].$refs)[0];
} else if (refComponent.$refs) {
inputElement = Object.values(refComponent.$refs)[0];
} else {
inputElement = refComponent;
}
this.autocomplete = new google.maps.places.Autocomplete(
inputElement,
{ types: ['geocode'] },
);
this.autocomplete.setComponentRestrictions({ country: this.countryRestrictions });
this.autocomplete.addListener('place_changed', () => {
const place = this.autocomplete.getPlace();
const ac = place.address_components;
if (!ac) return;
const {
route: streetName,
street_number: streetNumber = null,
postal_code: zipCode = null,
locality: city = null,
} = ac.reduce(function (map, obj) {
map[obj.types[0]] = obj.short_name;
return map;
}, {});
this.$emit('update-address', { streetName, streetNumber, zipCode, city });
});
},
},
render () {
return this.$scopedSlots.default({
loadGoogleMapsScript: this.loadGoogleMapsScript,
addressAutocompleteRef: this.addressAutocompleteRef,
});
},
};
script.__file = "src/AddressAutocomplete.vue";
// Import vue component
// install function executed by Vue.use()
function install(Vue) {
if (install.installed) return;
install.installed = true;
Vue.component('AddressAutocomplete', script);
}
// Create module definition for Vue.use()
const plugin = {
install,
};
// To auto-install when vue is found
let GlobalVue = null;
if (typeof window !== 'undefined') {
GlobalVue = window.Vue;
} else if (typeof global !== 'undefined') {
GlobalVue = global.Vue;
}
if (GlobalVue) {
GlobalVue.use(plugin);
}
// Inject install function into component - allows component
// to be registered via Vue.use() as well as Vue.component()
script.install = install;
export { script as default };
//# sourceMappingURL=vue-google-maps-address-autocomplete.esm.js.map