<template> <div> <slot v-bind:views="views" v-bind:isCurrentView="isCurrentView" v-bind:toggleView="toggleView" v-bind:setView="setView" ></slot> </div> </template> <script> export default { props: { initial: { default: () => {} } }, data() { return { views: this.$props.initial, keyListener: e => { // Esc if (e.keyCode === 27) { this.hideAllViews(); } } }; }, methods: { setView(viewId, show) { this.$data.views[viewId] = show; }, setViews(updates) { this.$data.views = Object.assign({}, this.data.views, updates); }, toggleView(viewId) { Object.keys(this.$data.views).forEach(key => { if (key !== viewId) { this.setView(key, false); } }); this.setView(viewId, !this.isCurrentView(viewId)); }, isCurrentView(viewId) { return this.$data.views[viewId]; }, hideAllViews() { Object.keys(this.$data.views).forEach(key => { this.setView(key, false); }); } }, mounted() { window.addEventListener('keydown', this.$data.keyListener);; }, destroyed() { window.removeEventListener('keydown', this.$data.keyListener); } } </script>