【问题标题】:Creating dynamite Vue components in a loop在循环中创建 dynamite Vue 组件
【发布时间】:2016-10-17 15:34:42
【问题描述】:

最近在循环创建Vue组件时遇到了一个连线问题。

  for(let i=0;i<testInfo.length;i++)
{
    $("#home").append("<lib_" + testInfo[i]['lib_id'] + "></lib_" + testInfo[i]['lib_id'] + ">");
    console.log(i);

    Vue.component('lib_' + testInfo[i]['lib_id'], {
        template: '#' + testInfo[i]['lib_id'],
        created: function () {
            this.count=i;
            this.libTitle=testInfo[i]['lib_title'];
            this.row=testInfo[i]['row'];
            this.imgUrl=testInfo[i]['img_url'];
            alert(i);
            this.itemUrl=testInfo[i]['item_url'];
            this.libNum=testInfo[i]['lib_num'];
            this.libNumMax=testInfo[i]['lib_num_max'];
        },
        data: function(){
            }
    });
}
new Vue({
    el: '#home'
});

console.log(i) 的结果:0 1 2 这是正常的 但是 alert(i) : 0 2 2 的结果是连线的。

一开始,我以为是在循环中创建闭包的问题,​​所以我将“var i”改为“let i”,但它不起作用。

然后,我将代码更改如下

for(let i=0;i<testInfo.length;i++)
{
    $("#home").append("<lib_" + testInfo[i]['lib_id'] + "></lib_" + testInfo[i]['lib_id'] + ">");
    console.log(i);

    Vue.component('lib_' + testInfo[i]['lib_id'], {
        template: '#' + testInfo[i]['lib_id'],
        created: function () {
            this.count=i;
            this.libTitle=testInfo[i]['lib_title'];
            this.row=testInfo[i]['row'];
            this.imgUrl=testInfo[i]['img_url'];
            alert(i);
            this.itemUrl=testInfo[i]['item_url'];
            this.libNum=testInfo[i]['lib_num'];
            this.libNumMax=testInfo[i]['lib_num_max'];     
        }(i),
        data: function(){
            }
    });
}  new Vue({
    el: '#home'
});

现在 alert(i) 结果正确:0 1 2

但是“this”关键字指的是“window object”而不是“new vue object”。

这个问题让我抓狂......请帮忙。

【问题讨论】:

    标签: loops components vue.js


    【解决方案1】:

    好吧,创建的函数将在很久以后执行,当组件实际创建时(而不是在注册时,这是你在 for 循环中所做的)。

    此时,for循环已经/可能已经完成,所以i = 2(我写了可能是因为Vue中DOM更新等的异步性)

    你为什么这样做?整个过程闻起来像是一个很大的反模式。为什么不能使用一个libcomponent 并将数据作为道具传递?为什么将所有这些数据直接保存在 Vue 实例 (this.itemUrl= ...) 而不是组件的 data

    在我看来,您尝试使用 Vue 时却没有它为可重用组件提供的任何有用功能...

    话虽如此,如果你想“缓存”i 的结果,以便在created 实际运行时可用,你应该将其添加为data 属性

    data: function () {
      return {
        i: i
      }
    }
    

    【讨论】:

    • 非常感谢您的快速回复。我是 Vuejs 的初学者。我想要做的是根据来自服务器的数据将不同的模板动态连接到不同的标签。从我的代码中可以看出,首先,我创建了新标签(取决于来自服务器的数据),然后我为这些标签注册了不同的模板。更具体地说,我希望每一行数据库都对应一个标签。带有该标签的模板注册取决于该行的值。我可以用 vuejs 做到这一点吗?如果是,你会建议 vue 的什么功能(或一些教程)?谢谢。
    • 是有限数量的模板('#' + testInfo[i]['lib_id']),在页面中预定义,或者您是否也从服务器动态定义它们并且可能存在未知数量的不同类型的模板?我正在考虑一个涉及 Vue 的 &lt;partial&gt; 元素的解决方案,但这需要预先定义模板。
    • 再次感谢您的回复。模板数量有限,在页面中预定义。您在数据中返回对象的解决方案真的很有效^^。但是我遇到了另一个有线问题:当testInfo[i]['lib_id']的类型是double,这是在数据库中定义的,会出现一个错误,说“Uncaught SyntaxError: Unexpected number”。然后,我尝试将testInfo[i]['lib_id'] 转换为字符串并将其添加到'lib_' + testInfo[i]['lib_id'],但我仍然遇到同样的错误。如果testInfo[i]['lib_id'] 的类型是int,则一切正常。有什么帮助吗?谢谢
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 2017-12-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    相关资源
    最近更新 更多