vue.js 事件总线初步使用心得

最近项目中使用到vue,自己第一次接触这种数据驱动的前端框架,在使用中遇到了一个问题,在这里记下来,希望自己以后不要再犯。也希望可以帮到遇到同样问题的朋友。

vue组件

vue强大的组件系统,对代码的复用和程序的清晰度很有帮助,我们可以将公用的功能抽出来,写成一个vue的组件,以便日后复用,像分页栏、动态导航之类的。

比如所我将列表数据展示和列表的导航分开为两个组件。当我只有一种类型的数据要展示的时候,我就可以直接将列表数据组件拿来用;当我有多种相似的数据类型要展示,这时候就可以结合二者了。

😯我是一张图.png

但是怎么结合呢?我说的相似的数据类型指的是同一种数据格式,但是数据来源不同(语文学的不好,请理解🙈),就像图中的分组1、分组2、分组3,不通的列表导航对应着不同的api地址,当点击导航栏的时候,获取对应的接口地址,请求服务器数据,列表展示数据。

事件总线的使用

约定:以下我们将上图中左边的导航栏组件简称为A组件,右边列表组件简称为B组件。

我是这样使用事件总线的,点击A组件当中的导航项,获取对应的请求地址,在事件总线中请求服务器的数据,然后将更新数据,B组件中监控事件总线中的数据,这样就能实现实时刷新了。这其中遇到了一个问题,纠结了我好久。

最开始的事件总线的代码如下(省略了部分代码):

// event bus definition
var bus = new Vue({
    data: {
        apiUrl: '',
        navItems: [
            {name: 'group 1', url: 'http://xxxxxx'},
            {name: 'group 2', url: 'http://bbbbxx'}
        ],
        dataList: []
    },
    methods: {
        getResponseData: function () {
            // 请求服务器数据获取到data后
            this.dataList = data;
        },
        changeApiUrl: function (index) {
            this.apiUrl = this.navItems[index].url;
            this.getResponseData();
        }
    },
    created: function () {
        this.$on('getResponseData', this.getResponseData);
        this.$on('changeApiUrl', this.changeApiUrl);
    },
    beforeDestroy: function () {
        this.$off('getResponseData', this.getResponseData);
        this.$off('changeApiUrl', this.changeApiUrl);
    }
});

// 导航组件 A
var navItemComponent = {
    data: function () {
        return {
            navItems: bus.navItems
        }
    },
    methods: {
        onItemClick: function (index) {
            bus.$emit('changeApiUrl', index);
        }
    }
};

// 列表组件 B
var tableList = {
    data: function () {
        return {
            dataList: bus.dataList
        }
    }
};

这种情况页面正常渲染没有问题,但是当我点击不同的导航栏的时候,列表中没有数据显示,查看http响应报文,可以看到响应的数据,为什么不显示呢?

问题出现在下面这两个片段的代码:

//事件总线中
getResponseData: function () {
      // 请求服务器数据获取到data后
     this.dataList = data;
}
// 列表组件中
data: function () {
     return {
         dataList: bus.dataList
     }
}

这相当于什么呢?下面这个例子很好的说清楚了。

var a = 'hello world';
var b = a;

var c = 'babababa';
var a = c;

// 这种情况下:
console.log(a);  // output: babababa
console.log(b);  // output: hello world
console.log(c);  // output: babababa

那怎么解决呢?请求获取完数据后,不要改变事件总线中dataList的引用对象就好了。

        getResponseData: function () {
            // 请求服务器数据获取到data后
            this.dataList.splice(0,this.dataList.length);
            for(var i = 0;i<this.data.length;++i){
                this.dataList.push(data[i]);
            }
        }

这是我想到的解决办法,如果你看了这篇文章,有更好的解决办法的话,能告诉我吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • UI组件element ★11612 - 饿了么出品的Vue2的web UI工具套件 Vux ★7503 - 基于...
    董董董董董董董董董大笨蛋阅读 8,499评论 6 123
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • 声明是告诉编译器, 某个东西准备好了, 但是我现在还没必要让你知道具体细节. 当你用c来写程序, 会发现main需...
    Zszen阅读 647评论 0 51
  • 原生的七口之家 衍生的十七口之家 家的形式变了 爱 一脉承绵 五只小鸟羽翼渐丰,扑楞楞扇动着翅膀,陆续飞离了那个老...
    滋小然阅读 549评论 18 21