为啥 x-template 部分的位置对于 vue 模板处理数据很重要?

Posted

技术标签:

【中文标题】为啥 x-template 部分的位置对于 vue 模板处理数据很重要?【英文标题】:Why does position of x-template section matter for vue templates to work with data?为什么 x-template 部分的位置对于 vue 模板处理数据很重要? 【发布时间】:2018-08-18 00:03:56 【问题描述】:

我有一个 vue 应用和一个全局组件。两者都有数据属性。对于组件,我使用 x-template 方式将我的 html 代码放在一起。我遇到了一个奇怪的错误,即组件中的数据不可用,尽管当我没有访问组件中的数据时组件已正确呈现。

HTML 来了:

<h1>Hello</h1>
<div id='app'>
  <p>Here is the app: message</p>
  <my-component></my-component>

  <script type="text/x-template" id="template">
      <div>
          <p>This is the component: secondmsg</p>
      </div>
  </script>

</div>

.ts 文件来了:

Vue.component('my-component',
    
        template: '#template',
        data: function () 
            return 
                secondmsg: 'Works again!'
            
        
    );

var vm = new Vue(
    el: '#app',
    data: 
        message: "App works!"        
    
);

这不起作用,它说

secondmsg 未定义

但是,如果你这样做,它会起作用

不要访问 secondmsg。然后,组件呈现正确。或者: 如果您不使用x-template 版本,而是使用inline-template 作为组件。或者: 如果将脚本部分移到 div 下方,关闭 vue 应用程序

所以在尝试了很多之后,我找到了这些解决方法,但我真的很想知道如果你使用 data (或 props )属性,在哪里定义你的 x-template 很重要。我在文档中没有找到任何提示。

注意:我使用带有部分视图的 Razor 页面,这就是为什么在标准情况下 x 模板在 div 中呈现。

Here's a fiddle 如果你不相信我就去玩 :-)

【问题讨论】:

【参考方案1】:

出现这个问题的原因如下:

    Vue 尝试渲染 #app Vue 从 html DOM 获取要渲染的模板 Vue 发现有一个 message 引用,这行得通 Vue 发现有一个组件引用了my-component,它把它添加到渲染堆栈中 Vue 看到对 secondmsg 的引用,然后失败

如果它没有失败,它将继续渲染my-component

正如您已经发现的那样,以下方法可以解决该问题:

不要访问 secondmsg。然后,组件呈现正确。或者: 如果您不使用 x-template 版本,而是使用 inline-template 作为组件。或者: 如果将脚本部分移到 div 下方,关闭 vue 应用程序

【讨论】:

【参考方案2】:

父 Vue 已附加到 #app,其中包括 x 模板。将 Vue 附加到元素告诉 Vue 使用该元素的内容作为模板来创建 DOM。由于 x-template 在那里,并且其中有一个插值字符串,父 Vue 尝试进行插值,但父 Vue 中没有定义 secondmsg

【讨论】:

非常感谢,非常感谢您的帮助!我标记@Ferrybig 答案的原因主要是他到目前为止的名声较低:-)

以上是关于为啥 x-template 部分的位置对于 vue 模板处理数据很重要?的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#快速理解Vue组件化开发,干货太多,”建议收藏细品“

为啥从Vue.js中的列表中删除项目时移动转换需要绝对位置

X-template

为啥 'axios' 和 $http (vue-resource) 对于 json 查询字符串的行为不同?

为啥我的路线返回 500 错误?

Vue:道具值更改不更新 DOM