ermu592275254
ermu592275254
我这样写的好处就是既实现了事件管理又易于复用。其实怎么写应该根据你的项目和习惯去做。可参考知乎上的回答:https://www.zhihu.com/question/35820643
如果是按照vue组件的规范写在一个vue文件里面,注册为全局组件,此时就需要通过vue所提倡的状态管理,而不是事件管理了。同时为了规范需要把状态保存到vuex的store中,我不太喜欢这样的形式去管理这种多处使用的小组件。这样写,如果别的项目也用到直接copy就好了,不用再去store增加状态管理
上面代码其实就是做了下面3步: 1. 创建VUE子类 2. 将实例挂载。```vm.$mount('')```代表```elementOrSelector```参数为空,模板将被渲染为文档之外的的元素,必须使用原生 DOM API 把它插入文档中 3. 用原生插入到body中 如果写成一个VUE文件: 全局注册``` Vue.component(tagName, options) =>``` 放在根组件内 => 使用状态管理 或者```$refs```去获取元素实例 第一种使用: ``` store.commit('showModel','some message...',2000); ``` 第二种使用 ``` this.$refs.model.show('some message...',2000); ``` emmmmm,写成一个VUE文件我能想到的就这两种方式。个人觉得这两种方式都不太好。
第二种方式的确不能获取根组件下的,我之前描述错了。需要在每个用到的组件下引用。这样就不能确保单例。所以不太好使。 如果想引入slot,模版渲染就成了一个难题,知乎的回答上已经有人做了回答——参考Jim Liu 和agileago的回答。 个人认为需要slot的组件都是难以复用的组件,最好还是特殊对待。像alert,propmt这样的组件在业务逻辑不是很复杂的情况下 可以考虑放在根组件下。可参考https://segmentfault.com/a/1190000011650003
emmmmm,我之前写这个组件的时候没有想到用instance.$on('');哈哈,经验不够,看来还得努力学习。我觉得用instance.$on('')更好一些. 知乎说的插件vue-dom-portal,其实就是一个slot。你可以在任何地方写一个slot——它的指令v-dom-portal就相当于slot。然后指定一个位置插入就可以了。 比如我在test.vue中写了一个 ``` 我可以被插入当DOM的任何位置 ``` 我给它传的portal是body,所以他会被渲染到body中; ``` 我可以被插入当DOM的任何位置 ``` 这样就实现了全局的slot,你把portal换成全局的alert,propmt这种组件,便可以实现你想要得效果啦