基本示例

这里有一个 Vue 组件的示例:

  1. // 定义一个名为 button-counter 的新组件
  2. Vue.component('button-counter', {
  3. data: function () {
  4. return {
  5. count: 0
  6. }
  7. },
  8. template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
  9. })

组件是可复用的 Vue 实例,且带有一个名字:在这个例子中是 。我们可以在一个通过 new Vue 创建的 Vue 根实例中,把这个组件作为自定义元素来使用:

  1. <div id="app">
  2. <button-counter></button-counter>
  3. </div>
  4. <script>
  5. // 定义一个名为 button-counter 的新组件
  6. Vue.component('button-counter', {
  7. data: function () {
  8. return {
  9. count: 0
  10. }
  11. },
  12. template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
  13. })
  14. var app = new Vue({
  15. el: "#app",
  16. data: {
  17. },
  18. methods: {
  19. }
  20. });
  21. </script>

因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

组件的复用

你可以将组件进行任意次数的复用:

  1. <div id="components-demo">
  2. <button-counter></button-counter>
  3. <button-counter></button-counter>
  4. <button-counter></button-counter>
  5. </div>

注意当点击按钮时,每个组件都会各自独立维护它的 count。因为你每用一次组件,就会有一个它的新实例被创建。

data 必须是一个函数

当我们定义这个 组件时,你可能会发现它的 data 并不是像这样直接提供一个对象:

  1. data: {
  2. count: 0
  3. }

取而代之的是,一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:

  1. data: function () {
  2. return {
  3. count: 0
  4. }
  5. }

否则就使用一个变量的话,点击一个按钮就可能会影响到其它所有实例

局部的组件

  • 这里有两种组件的注册类型:全局注册局部注册
    • 通过 Vue.component 是全局注册的
    • 全局注册的组件可以用在其被注册之后的任何 (通过 new Vue) 新创建的 Vue 根实例,也包括其组件树中的所有子组件的模板中。

注册组件

可以通过一个普通的 JavaScript 对象来定义组件,然后在 components 选项中定义你想要使用的组件:

  • 对于 components 对象中的每个 property 来说,其 property 名就是自定义元素的名字,其 property 值就是这个组件的选项对象。
    1. <div id="myApp">
    2. <my-weather></my-weather>
    3. </div>
    4. <script>
    5. var WeatherComponent = {
    6. template: '<div>今天下雨,随它去吧!</div>'
    7. };
    8. var myApp = new Vue({
    9. el: '#myApp',
    10. data: {
    11. },
    12. components: {
    13. 'my-weather': WeatherComponent
    14. },
    15. });
    16. </script>

注意:局部注册的组件在其子组件中不可用
如果你希望 ComponentAComponentB 中可用,则你需要这样写:

  1. var ComponentA = { /* ... */ }
  2. var ComponentB = {
  3. components: {
  4. 'component-a': ComponentA
  5. },
  6. // ...
  7. }