javascript - vue.js使用公共事件总线
黄舟
黄舟 2017-06-12 09:25:35
[JavaScript讨论组]

在练习vue框架的使用,在写一个todo的demo,我把input元素(new-input组件)和展示待办事项的ul,li元素(todo-items和todo-item组件)写成了两个平行的组件,现在在input组件中输入文字添加,使用公共事件总线触发update事件,在todo-items组件的生命周期中创建钩子函数监听update事件并修改组件中的数据,这时问题来了,报错显示该组件的todos数组为undefined

下面贴代码

var bus = new Vue({});

var todoItem = Vue.component('todo-item', {
    props:['todo'],
    template:'
  • {{todo.text}}

  • ', data:function(){ return { isDone:false } }, methods:{ done:function(){ this.$emit('hasDone'); this.isDone = !this.isDone; }, deleteIt:function(){ this.$emit('hasDelete'); } } }); var todoItems = Vue.component('todo-items', { template:'
    ', data:function(){ return { todos:[ {text:'nodeJS'}, {text:'vue.js'} ] } }, components:{ 'todo-item':todoItem }, methods:{ deleteItem:function(index){ this.todos.splice(index, 1); }, update:function(value){ this.todos.push(value); } }, created(){ bus.$on('updateData', function(value){ this.todos.push(value); }) } }) var newInput = Vue.component('new-input', { template:'', data:function(){ return { value:'' } }, methods:{ update:function(){ bus.$emit('updateData', {text:this.$refs.input.value}); } } }) var todo = new Vue({ el:'#todo', components:{ "todo-items":todoItems, "new-input":newInput } })

    不知道什么原因,todo-items中的deleteItem方法又可以操作todos数组。

    黄舟
    黄舟

    人生最曼妙的风景,竟是内心的淡定与从容!

    全部回复(2)
    typecho

    手机作答
    问题主要出现在bus.$emit那,bus是一个新的实例Vue,他的this没有todos,应该这样

    created里面:
    const that = this
    之后bus里面的 this改为that

    手机作答,就不写详细代码了,你应该懂了

    世界只因有你

    bus实例监听的回调函数里的this指向并不是你期望的那个vue实例,解决方法就是楼上说的

    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号