为什么 Vue 在循环中找不到变量?
P粉727531237
P粉727531237 2024-02-17 12:57:37
0
2
500

我正在努力开发一个简单的组件并在循环中使用它:

<template id="measurement">
    <tr class="d-flex">
    </tr>
</template>
Vue.component('measurement', {
    template: '#measurement',
    props: {
        name: String,
        data: Object,
        val: String,
    },
});

这显然还不能正常工作,但已经失败了:

<table v-for="(m, idx) in sortedMeters">
    <measurement v-bind:data="m"></measurement>
</table>

给出 ReferenceError:在视图中找不到变量:m。由于一个奇怪的原因,同样的事情在段落中起作用,即没有错误:

<p v-for="(m, idx) in sortedMeters">
    <measurement v-bind:data="m"></measurement>
</p>

什么原因导致变量找不到?

PS:这是一个小提琴:https://jsfiddle.net/andig2/u47gh3w1/。一旦包含 table 就会显示不同的错误。

更新 循环的目的是生成多个表。每个表的行数将由多个 measurement 创建

P粉727531237
P粉727531237

全部回复(2)
P粉921165181

如果更换


您最终将得到工作代码。

但是您很可能想使用



P粉488464731

TLDR: 在 Vue 传递 DOM 模板之前,浏览器会将 <measurement v-bind:name="i" v-bind:data="m"> 提升到 之外<table>(在 v-for 上下文之外),导致 Vue 中出现错误。这是 DOM 模板解析的已知警告.


HTML 规范要求 <table> 包含仅特定子元素

  • <script>
  • 同样,的<a href="https://html.spec.whatwg.org/multipage/tables.html#the-tr-element" rel="nofollow noreferrer">内容模型<tr> 是:

    • <script>
    • 兼容浏览器的 DOM 解析器会自动将不允许的元素(例如 <measurement>)提升到表之外。这发生在脚本阶段之前(甚至在 Vue 看到它之前)。

      例如,这个标记:

      
      

      ...在 DOM 解析之后(在任何脚本编写之前)变成这样:

       
      

      请注意 im 是如何位于 v-for 循环的上下文之外的,这会导致有关 im 未定义的 Vue 运行时错误(除非您的组件碰巧已经声明了它们)。 m 的目的是绑定到 <measurement>data 属性,但由于失败,data 只是其初始值(也是 undefined),导致 {{data.value}} 的渲染失败。 cphpcn渲染错误:“类型错误:无法读取未定义的属性‘值’”。

      要演示没有这些运行时错误且没有 Vue 的提升,请运行下面的代码片段:

      
      
      1. hoisted outside
      2. also hoisted outside
      3. inside table
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板