Vue 注册组件
注册组件
注册组件的基本步骤
- 
组件的使用分成三个步骤: - 创建组件构造器:调用Vue.extend()方法
- 注册组件:调用Vue.component()方法
- 使用组件:在Vue实例的作用范围内
 
- 
我们来看看通过代码如何注册组件 
<div id="app">
<!--3.使用组件-->
<my-cpn></my-cpn>
<script src="../js/vue.js"></script>
<script>
  // 1.创建组件构造器对象
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>我是标题</h2>
        <p>我是内容, 哈哈哈哈</p>
        <p>我是内容, 呵呵呵呵</p>
      </div>`
  })
  // 2.注册组件
  Vue.component('my-cpn', cpnC)
  
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    }
  })
</script>
- 查看运行结果:
- 和直接使用一个div看起来并没有什么区别。
- 但是我们可以设想,如果很多地方都要显示这样的信息,我们是不是就可以直接使用<my-cpn></my-cpn>来完成呢?
 
注册组件步骤解析
- Vue.extend():
- 调用Vue.extend()创建的是一个组件构造器。
- 通常在创建组件构造器时,传入template代表我们自定义组件的模板。
- 该模板就是在使用到组件的地方,要显示的HTML代码。
- 事实上,这种写法在Vue2.x的文档中几乎已经看不到了,它会直接使用下面我们会讲到的语法糖,但是在很多资料还是会提到这种方式,而且这种方式是学习后面方式的基础。
- Vue.component():
- 调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称。
- 所以需要传递两个参数:
- 注册组件的标签名
- 组件构造器
 
- 组件必须挂载在某个Vue实例下,否则它不会生效。
- 我们来看下面我使用了三次<my-cpn></my-cpn>
- 而第三次其实并没有生效
<div id="app">
  <!-- 使用组件 -->
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
</div>
  <my-cpn></my-cpn>
全局组件和局部组件
- 
当我们通过调用Vue.component()注册组件时,组件的注册是全局的 - 这意味着该组件可以在任意Vue示例下使用。
 
- 
如果我们注册的组件是挂载在某个实例中, 那么就是一个局部组件 
<div id="app">
  <cpn></cpn>
</div>
<script src="../js/vue.js"></script>
<script>
  // 1.创建组件构造器
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>我是标题</h2>
        <p>我是内容,哈哈哈哈啊</p>
      </div>
    `
  })
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    components: {//注册的局部组件
      // cpn使用组件时的标签名
      cpn: cpnC
    }
  })
父组件和子组件
- 
在前面我们看到了组件树: - 组件和组件之间存在层级关系
- 而其中一种非常重要的关系就是父子组件的关系
 
- 
我们来看通过代码如何组成的这种层级关系: 
<div id="app">
  <parent-cpn></parent-cpn>
  <!--<child-cpn></child-cpn>-->
</div>
<script src="../js/vue.js"></script>
<script>
  // 1.创建第一个组件构造器(子组件)
  const childComponent = Vue.extend({
    template: `
      <div>
        <h2>我是子组件</h2>
        <p>我是内容, 哈哈哈哈</p>
      </div>
    `
  })
  // 2.创建第二个组件构造器(父组件)
  const parentComponent = Vue.extend({
    template: `
      <div>
        <h2>我是父组件</h2>
        <p>我是内容, 呵呵呵呵</p>
        <child-cpn></child-cpn>
      </div>
    `,
    components: {
      child-cpn: childComponent
    }
  })
  // root组件
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    components: {
      parent-cpn: parentComponent
    }
  })
</script>
- 父子组件错误用法:以子标签的形式在Vue实例中使用
- 因为当子组件注册到父组件的components时,Vue会编译好父组件的模块
- 该模板的内容已经决定了父组件将要渲染的HTML(相当于父组件中已经有了子组件中的内容了)
- <child-cpn></child-cpn>是只能在父组件中被识别的。
- 类似这种用法,<child-cpn></child-cpn>是会被浏览器忽略的。
 
注册组件语法糖
- 
在上面注册组件的方式,可能会有些繁琐。 - Vue为了简化这个过程,提供了注册的语法糖。
- 主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替。
 
- 
语法糖注册全局组件和局部组件: 
<div id="app">
  <cpn1></cpn1>
  <cpn2></cpn2>
</div>
<script src="../js/vue.js"></script>
<script>
  // 1.全局组件注册的语法糖
  Vue.component('cpn1', {
    template: `
      <div>
        <h2>我是标题1</h2>
        <p>我是内容, 哈哈哈哈</p>
      </div>
    `
  })
  // 2.注册局部组件的语法糖
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    },
    components: {
      'cpn2': {
        template: `
          <div>
            <h2>我是标题2</h2>
            <p>我是内容, 呵呵呵</p>
          </div>
                  `
      }
    }
  })
</script>
模板的分离写法
- 刚才,我们通过语法糖简化了Vue组件的注册过程,另外还有一个地方的写法比较麻烦,就是template模块写法。
- 如果我们能将其中的HTML分离出来写,然后挂载到对应的组件上,必然结构会变得非常清晰。
- Vue提供了两种方案来定义HTML模块内容:
- 使用<script>标签
- 使用<template>标签
 
- 使用
<!--1.script标签, 注意:类型必须是text/x-template-->
<script type="text/x-template" id="cpn">
<div>
  <h2>我是标题</h2>
  <p>我是内容,哈哈哈</p>
</div>
</script>
<!--2.template标签-->
<template id="cpn">
  <div>
    <h2>我是标题</h2>
    <p>我是内容,呵呵呵</p>
  </div>
</template>
本文来自博客园,作者:懒惰ing,转载请注明原文链接:https://www.cnblogs.com/landuo629/p/12421797.html

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号