Smarter Watchers Watchers accept methods name export default { } create () { this.fetchUsers() }, watch: { searchText: 'fetchUsers' } Can call themselves on created export default { } watch: { searchText: { handler: 'fetchUsers', immediate: true } } Component Registration import BaseButton from './BaseButton.vue'; import BaseIcon from './BaseIcon.vue'; import BaseInput from './BaseInput'; export default { components: { BaseButton, BaseIcon, BaseInput } }; Modules Registration import auth from './modules/auth'; import posts from './modules/posts'; import comments from './modules/comments'; export default new Vuex.Store({ modules: { auth, posts, comments } }); Cleaner Views export default { data () { return { loading: false, error: null, post: null } }, watch: { '$route' { handler: 'resetData', immediate: true } }, methods: { resetData () { this.loading = false this.error = null this.post = null }, getPost (postId) { // Todo } } } to export default { data() { return { loading: false, error: null, post: null }; }, created() { this.getPost(this.$route.params.id); }, methods: { getPost(postId) { // Todo } } }; Transparent Wrappers <template> <input :value="value" @input="$emit('input'), $event.target.value"> </template> <BaseInput @focus.native="doSomething"> <template> <label> {{ label }} <input :value="value" v-on="listeners"> </label> </template> <script> export default { computed: { listeners() { return { ...this.$listeners, input: event => { this.$emit('input', event.target.value); } }; } } }; </script> <BaseInput @focus.native="doSomething">