zoukankan      html  css  js  c++  java
  • Vue组件-组件的注册

    注册组件

    全局组件

    注册组件就是利用Vue.component()方法,先传入一个自定义组件的名字,然后传入这个组件的配置。

    Vue.component('my-component', {
      template: '<p>我是被全局注册的组件</p>'
    })
    /*
      Vue.component(组件名称[字符串], 组件对象)
    */
    
    new Vue({
      el: '#app',
      template: '<my-component></my-component>'
    })
     Vue.component('mycomponent',{
        template: `<div>这是一个自定义组件</div>`,
        data () {
          return {
            message: 'hello world'
          }
        }
      })

    如上方式,就已经创建了一个自定义组件,然后就可以在Vue实例挂在的DOM元素中使用它。

     <div id="app">
        <mycomponent></mycomponent>
        <my-component></my-component>
    </div>
    <script>
      var app = new Vue({
        el: '#app',
        data: {
        },
        components: {
          'my-component': {
            template: `<div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div>`,
          }
        }
      })
    </script>

    其中 my-component 组件是局部组件,只能在当前Vue实例中使用

    局部组件

    const child = {
      template: '<p>我是局部注册的组件</p>'
    }
    /*
       通过components选项属性进行局部注册:
       components: {
        组件名称[字符串]: 组件对象
      }
    */
    new Vue({
      el: '#app',
      template: '<my-component></my-component>',
      components: {
        'my-component': child
      }
    })

    直接使用Vue.component()创建的组件,所有的Vue实例都可以使用。还可以在某个Vue实例中注册只有自己能使用的组件。

    var app = new Vue({
        el: '#app',
        data: {
        },
        components: {
          'my-component': {
            template: `<div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div>`,
          }
        }
      })

    模板的要求

    注意:组件的模板只能有一个根元素。下面的情况是不允许的。

    template: `<div>这是一个局部的自定义组件,只能在当前Vue实例中使用</div>
                <button>hello</button>`,

    组件中的data必须是函数

    可以看出,注册组件时传入的配置和创建Vue实例差不多,但也有不同,其中一个就是data属性必须是一个函数。
    这是因为如果像Vue实例那样,传入一个对象,由于JS中对象类型的变量实际上保存的是对象的引用,所以当存在多个这样的组件时,会共享数据,导致一个组件中数据的改变会引起其他组件数据的改变。

    而使用一个返回对象的函数,每次使用组件都会创建一个新的对象,这样就不会出现共享数据的问题来了。

    关于DOM模板的解析

    当使用 DOM 作为模版时 (例如,将 el 选项挂载到一个已存在的元素上), 你会受到 HTML 的一些限制,因为 Vue 只有在浏览器解析和标准化 HTML 后才能获取模板内容。尤其像这些元素 <ul><ol><table><select> 限制了能被它包裹的元素,而一些像 <option> 这样的元素只能出现在某些其它元素内部。

    在自定义组件中使用这些受限制的元素时会导致一些问题,例如:

    <table>
      <my-row>...</my-row>
    </table>

    自定义组件 <my-row> 被认为是无效的内容,因此在渲染的时候会导致错误。这时应使用特殊的 is 属性:

    <table>
      <tr is="my-row"></tr>
    </table>

    也就是说,标准HTML中,一些元素中只能放置特定的子元素,另一些元素只能存在于特定的父元素中。比如table中不能放置divtr的父元素不能div等。所以,当使用自定义标签时,标签名还是那些标签的名字,但是可以在标签的is属性中填写自定义组件的名字。

    应当注意,如果您使用来自以下来源之一的字符串模板,这些限制将不适用:

    1.<script type="text/x-template">
    
    2.JavaScript 内联模版字符串
    
    3. .vue 组件
    其中,前两个模板都不是Vue官方推荐的,所以一般情况下,只有单文件组件.vue可以忽略这种情况。
  • 相关阅读:
    oracle客户端连接服务器基本教程
    java中字符串处理、串联和转换的几个常用方法,以及如果需要自己编程实现的具体实施步骤。
    面试相关
    java中byte是什么类型,和int有什么区别
    (华为机试大备战)java。多了解了解最常用的那个类库的方法对处理字符串的方法
    (华为)以下代码片段将创建一个仅保存大写字符的字段。
    (华为)以下代码片段将创建一个仅保存大写字符的字段。
    每个程序中只有一个public类,主类?
    我的第一个长程序,虽然是直接抄了书上,可是还是出现了两次拼写错误,最终还是找到异常的答案,改过来了。
    实践证明:当类想实现两个监听接口的时候,必须把两个都设置成内部类,不可能一个是外部类实现,一个是内部类实现。这样容易捕获错误,出现异常。
  • 原文地址:https://www.cnblogs.com/ctztake/p/8805287.html
Copyright © 2011-2022 走看看