注册组件就是利用Vue.component()方法,先传入一个自定义组件的名字,而后传入这个组件的配置。vue.component()注册的全局组件html
Vue.component('hello-world',{ template: `<div>这是一个自定义组件</div>`, data () { return { message: 'hello world' } } })
以在一个经过 new Vue 建立的 Vue 根实例中,把这个组件做为自定义元素来使用vue
html浏览器
<div id="app"> <hello-world></hello-world> </div> var app = new Vue({ el: '#app'})
var app = new Vue({ el: '#app', data: { }, components: { 'my-component': { template: `<div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div>`, } } })
注意:组件的模板只能有一个根元素。下面的状况是不容许的。app
template: `<div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div> <button>hello</button>`, //改成 template: `<div> <div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div> <button>hello</button> </div>`,
模板能够在外面定义dom
<div id="app"> <mycomponent></mycomponent> </div> <template id="mycomponent"> <h1>mycomponent</h1> </template> <script> Vue.component('mycomponent', { template: '#mycomponent' }) var app = new Vue({ el: '#app'}) </script>
能够看出,注册组件时传入的配置和建立Vue实例差很少,但也有不一样,其中一个就是data属性必须是一个函数。
这是由于若是像Vue实例那样,传入一个对象,因为JS中对象类型的变量实际上保存的是对象的引用,因此当存在多个这样的组件时,会共享数据,致使一个组件中数据的改变会引发其余组件数据的改变。
而使用一个返回对象的函数,每次使用组件都会建立一个新的对象,这样就不会出现共享数据的问题来了。函数
当使用 DOM 做为模版时 (例如,将 el 选项挂载到一个已存在的元素上), 你会受到 HTML 的一些限制,由于 Vue只有在浏览器解析和标准化HTML后才能获取模板内容。尤为像这些元素 ul,ol,table,select 限制了能被它包裹的元素,而一些像 code
在自定义组件中使用这些受限制的元素时会致使一些问题,例如:component
<table> <my-tr>...</my-tr> </table>
自定义组件
<table> <tr is="my-tr"></tr> </table>
也就是说,标准HTML中,一些元素中只能放置特定的子元素,另外一些元素只能存在于特定的父元素中。好比table中不能放置div,tr的父元素不能div等。因此,当使用自定义标签时,标签名仍是那些标签的名字,可是能够在标签的is属性中填写自定义组件的名字。对象
应当注意,若是您使用来自如下来源之一的字符串模板,这些限制将不适用: