我有下面这个非常简单的HTML/Vue/Vutify代码,我似乎无法按预期工作.

const { createApp, computed, ref, reactive } = Vue;
        const { createVuetify } = Vuetify;
        const vuetify = createVuetify();
        const app = createApp({
            setup() {
                const desserts = ref([{
                    name: 'Frozen Yogurt',
                    calories: 159,
                }, {
                    name: 'Ice cream sandwich',
                    calories: 237,
                }, {
                    name: 'Eclair',
                    calories: 262,
                }, {
                    name: 'Cupcake',
                    calories: 305,
                }, {
                    name: 'Gingerbread',
                    calories: 356,
                }, {
                    name: 'Jelly bean',
                    calories: 375,
                }, {
                    name: 'Lollipop',
                    calories: 392,
                }, {
                    name: 'Honeycomb',
                    calories: 408,
                }, {
                    name: 'Donut',
                    calories: 452,
                }, {
                    name: 'KitKat',
                    calories: 518,
                },])

                return {
                    desserts
                }
            }
        });
        app.use(vuetify).mount('#app');
<!DOCTYPE html>
<html>

<head>
    <script src="https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/3.3.19/vuetify.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/vuetify@3.3.17/dist/vuetify.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">
</head>

<body>

    <div id="app">
        <p>table below this point</p>
        <v-table>
            <thead>
                <tr>
                    <th class="text-left">URL</th>
                    <th class="text-left"></th>
                </tr>
            </thead>
           <tbody>
                <tr v-for="item in desserts" :key="item.name">
                    <td class="url">{{ item.name }}</td>
                    <td class="title">{{ item.calories }}</td>
                </tr> 
            </tbody> 
        </v-table>
        <p>table over this point</p>
    </div>
</body>

</html>

我想在SIMPe vTable <v-table></v-table>组件中显示一些数据(不是来自实验室的<v-data-table>). 但是,它会导致一个未呈现的表,并在控制台中显示一些错误:

  • [VUE WARN]:属性"Item"在呈现期间被访问,但未在实例上定义.在应用程序的VTable上
  • [VUE WARN]:在应用程序的VTable执行呈现函数时出现未处理的错误
  • 未捕获的TypeError:无法读取未定义的属性(正在读取‘name’)

我判断了一下,因为我可以在页面上显示数组,所以会向应用程序传递{{egrets}}属性.删除&lt;tr for&gt;/tr&gt;循环时,在devTool中找到的HTML如下所示:

<div id="app" data-v-app="">
    <p>table below this point</p>
    <div class="v-table v-theme--light v-table--density-default">
        <!---->
        <div class="v-table__wrapper">
            <table> 
                URL 
            </table>
        </div>
        <!---->
    </div>
    <p>table over this point</p>
</div>

我需要使用Vue和Vutify从CDN抓取的解决方案,因为我只是在WordPress页面上连接一个内部应用程序.我可能有些地方弄错了,但我拿不到,因为其他部件都在工作……我已经被困在这个问题上好几天了,我排除了与从WP加载的任何其他脚本的任何冲突,放上了这个简单的JSFdle.

EDIT:只是为了排除这种情况,用简单的HTML<table>替换<v-table>可以非常好地工作...谁能解释呢?

推荐答案

因为您的模板被嵌入到常规页面中,所以Vue没有访问该HTML的权限.相反,浏览器将try 像往常一样显示页面,然后Vue使用DOM node 作为模板.

浏览器的行为是特定于供应商的,但我认为在这种情况下,它们的工作原理大致相同:

  • 浏览器不知道<v-table>元素,所以它只是让它保持原样,假设有其他东西可以处理它.
  • 然后,它找到表内容元素(<thead><tr>等),它希望这些元素嵌套在<table>个标记中,但实际上没有<table>个.因此它们没有意义,浏览器会删除它们(包括v-for).
  • 最后,Vue用<table>个标签替换了<v-table>个标签,但没有留下任何内容.

若要避免此问题,请从HTML页中删除模板代码,并通过template属性将其传递给组件:

const { createApp, computed, ref, reactive } = Vue;
const { createVuetify } = Vuetify;

const vuetify = createVuetify();
const app = createApp({
  template: `
   <p>table below this point</p>
    <v-table>
      <thead>
        <tr>
          <th class="text-left">URL</th>
          <th class="text-left"></th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in desserts" :key="item.name">
          <td class="url">{{ item.name }}</td>
          <td class="title">{{ item.calories }}</td>
        </tr>
      </tbody>
    </v-table>
    <p>table over this point</p>
  `,
  setup() {
    const desserts = ref([{
      name: 'Frozen Yogurt',
      calories: 159,
    }, {
      name: 'Ice cream sandwich',
      calories: 237,
    }, {
      name: 'Eclair',
      calories: 262,
    }, {
      name: 'KitKat',
      calories: 518,
    }, ])

    return {
      desserts
    }
  }
});
app.use(vuetify).mount('#app');
<script src="https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/3.3.19/vuetify.js"></script>
<link href="https://cdn.jsdelivr.net/npm/vuetify@3.3.17/dist/vuetify.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">


<div id="app"></div>


或者,您可以使用<table is="vue:v-table">,而不是直接使用<v-table>:

const { createApp, computed, ref, reactive } = Vue;
const { createVuetify } = Vuetify;

const vuetify = createVuetify();
const app = createApp({
  setup() {
    const desserts = ref([{
      name: 'Frozen Yogurt',
      calories: 159,
    }, {
      name: 'Ice cream sandwich',
      calories: 237,
    }, {
      name: 'Eclair',
      calories: 262,
    }, {
      name: 'KitKat',
      calories: 518,
    }, ])

    return {
      desserts
    }
  }
});
app.use(vuetify).mount('#app');
<script src="https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/3.3.19/vuetify.js"></script>
<link href="https://cdn.jsdelivr.net/npm/vuetify@3.3.17/dist/vuetify.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css" rel="stylesheet">


<div id="app">
  <p>table below this point</p>
    <table is="vue:v-table">
      <thead>
        <tr>
          <th class="text-left">URL</th>
          <th class="text-left"></th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in desserts" :key="item.name">
          <td class="url">{{ item.name }}</td>
          <td class="title">{{ item.calories }}</td>
        </tr>
      </tbody>
    </table>
    <p>table over this point</p>
</div>

这是在in-DOM Template Parsing Caveats section of the docs中描述的

Javascript相关问答推荐

使用事件监听器在JavaScript中重新分配全局变量

追踪执行顺序

如何在alpinejs中显示dev中x-for的元素

如何循环访问对象数组并以关键值形式获得结果?

有Angular 的material .未应用收件箱中的价值变化

如何分配类型脚本中具有不同/额外参数的函数类型

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

如何修复(或忽略)HTML模板中的TypeScript错误?'

WebRTC关闭navigator. getUserMedia正确

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

如何迭代叔父元素的子HTML元素

在浏览器中触发插入事件时检索编码值的能力

使用Nuxt Apollo在Piniastore 中获取产品细节

将异步回调转换为异步生成器模式

<;img>;标记无法呈现图像

将嵌套数组的元素乘以其深度,输出一个和

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

顶点图使用组标签更新列之间的条宽

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';