在RRI(retrospect, refactor,imporve)这个过程中,我主要对st-tree-view进行了开发,下面总结一下组件开发过程中的几点心得体会。
一般bus的使用场景是子组件传事件到祖先组件,或者兄弟组件之间的互传(当然你用传统的两次emit也可以实现)。
组件中需要子传祖先(st-tree-view-item.vue(儿子)->st-tree-view.vue(父亲)->hello.vue(祖先)),所以使用到了event-bus,我尝试了两种方法: 方法1: 在index.vue中引入bus
// index.vue <script> import Vue from 'vue' import stTreeView from './st-tree-view' // 参考https://tiicle.com/items/159/the-use-of-a-global-event-bus-instead-of-the-general-manager const EventBus = new Vue() Object.defineProperties(Vue.prototype, { __bus: { get () { return EventBus } } }) Vue.component('st-tree-view', stTreeView) </script> // st-tree-view-item.vue this.__bus.$emit('node-click', { dom: event.target, node: that.model, component: that }) // hello.vue this.$bus.$on('node-click', (data) => { console.log('node-click', data) })方法2: 新建bus.js文件
// bus.js import Vue from 'vue' export default new Vue() // st-tree-view-item.vue import Bus from './bus.js' Bus.$emit('node-click', { dom: event.target, node: that.model, component: that }) // st-tree-view.vue import Bus from './bus.js' Bus.$on('node-click', (data) => { this.$emit('node-click', data) }) // hello.vue st-tree-view(@node-click="handleClick")推荐方法2,因为(1)有可能bus的命名会和全局冲突(2)需要改全局的index.vue文件比较麻烦,不方便使用。