vue组件和app中`el`和`template`有什么区别?

pas*_*ute 7 vuejs2

VUE组件(和应用程序本身)有一个el:和一个template.

我想了解区别是什么,我什么时候使用一个,另一个是什么时候:

如果我从最小的VUE-OnsenUI模板创建一个使用Monaca CLI的项目,我看到:

new Vue({
  el: '#app',
  template: '<app></app>',
  components: { App }
});
Run Code Online (Sandbox Code Playgroud)

从缺乏示例的非常详细的文档中,长话短说,我认为templatedom元素及其中的所有内容都将取代eldom元素.(模板只能有一个根,对吧?).例如:如果我的html是:

<html>...
  <body>...
    <replaceThis></replaceThis>... 
Run Code Online (Sandbox Code Playgroud)

我的vue js说:

el: "replace-this", 
template: "<div id='replaced'>hi there</div>" 
Run Code Online (Sandbox Code Playgroud)

然后我会得到:

<html>...<body>...<div id='replaced'>hi there</div>... 
Run Code Online (Sandbox Code Playgroud)

但我也可以写:

el: "#bla", 
template: "#blu" 
Run Code Online (Sandbox Code Playgroud)

如果我的HTML是

<html>
  <body>
    <div id="bla">
       anything inside here including the surrounding div will be replaced 
    </div>
    <template id="blu">
       <span id ="replacing-html">
           when ran in span, it stays mainly in the pan
       </span> 
    </template>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

那么带有id的div bla将被替换replacing-html为内部的span元素template.(模板标签本身包含其中的所有内容仍将保留在发出的html中.正确吗?)

所以我需要了解:

  1. template内容是否取代了el元素?
  2. 必须template只有一个根元素直接在它下面吗?
  3. 我的第一个例子是否正确?
  4. 我对第二个例子是否正确?
  5. template包含所有内容的标记是否仍保留在发出的html中?
  6. 在上面的Monaca Vue-OnsenUI示例中,el与模板相同的情况会发生什么:"app".这不是递归吗?什么是替换和什么?

tha*_*ksd 13

el选项的文档:

为Vue实例提供要挂载的现有DOM元素.它可以是CSS选择器字符串或实际的HTMLElement.

安装实例后,解析的元素将可以作为vm.$ el访问.

如果此选项在实例化时可用,则实例将立即进入编译; 否则,用户必须显式调用vm.$ mount()来手动启动编译.


template选项的文档:

一个字符串模板,用作Vue实例的标记.该模板将替换已安装的元素.除非模板中存在内容分发槽,否则将忽略已安装元素内的任何现有标记.

如果字符串以#开头,则它将用作querySelector并使用所选元素的innerHTML作为模板字符串.这允许使用常见技巧来包含模板.


在您的示例中,您定义的Vue实例是注册app组件,然后在其模板定义中使用它.它还在寻找DOM中的现有元素,其id app在安装时用作相关元素.

我认为你的困惑来自两者都使用名为"app"的东西.它们不必被命名为同一个东西.