解读Vue组件注册方式


Posted in Vue.js onMay 15, 2021

概述

组件化的概念让前端页面开发有了更清晰的结构。

Vue 中的组件就是一个 Vue 的实例对象。因此,Vue 组件的构造选项和 new Vue() 方法构造 Vue 实例的构造选项是一样的,其可接收的构造选项都是一样的。除了 el 这样 根实例 特有的选项。但是,Vue 组件必须得是可以复用的,因此,就必须要求构造选项中的 data 选项必须是一个函数,该函数返回一个对象。

为什么 data 选项是个返回对象的函数就可以保证组件的可复用性呢?

因为无论是 new Vue() 的方式还是定义 Vue组件 的方式创建一个 Vue 实例,其执行的操作都是将构造选项中的各属性值直接赋值给新创建的 Vue 实例对象。组件复用就是 Vue 使用 相同的构造选项 构造出多个同名不同地址的 Vue 实例对象。如果 Vue 组件定义时的构造选项中的 data 选项是一个对象,那么在组件复用时,多个组件就会共用一个 data 数据对象,因为是直接将 data 对象的地址赋值给组件的 Vue 实例的。但如果组件定义时的 data 选项是一个函数的话,那么 Vue 根据构造选项创建组件时会执行该函数从而得到一个对象。这样一来,每次创建 Vue 实例时的 data 对象都是重新生成的,因此,多个组件都有各自的 data 数据对象,不会相互影响。

实际上,在组件注册时是在定义组件的构造选项,在组件使用时才真正创建对应的 Vue 组件实例。

1 、全局注册

全局注册的组件可以在 Vue 根实例和所有的子组件中使用。注册入口为Vue.component()函数,一次注册,随时使用,注册方式如下:

Vue.component('my-component-name',{ 
    options 
})

示例如下:

//main.js
//此示例是在 vue-cli 创建的项目,默认是非完整版vue,无法用 template 选项,因此使用 render 函数写组件内容。
Vue.component('all-test',{
  data(){
    return {
      x: '我是全局组件'
    }
  },
  render(h){
    return h('div',this.x)
  }
})

//全局注册的组件直接使用即可
//App.vue
<template>
  <div id="app">
    <all-test />
  </div>
</template>

2 、局部注册

局部注册是通过一个普通的 JavaScript 对象来定义组件。然后组件的命名和注册入口是在 Vue实例 构造选项中的 components 选项。

let component = { options }

//new Vue 创建的根元素 Vue 实例
new Vue({
    el: '#app'
    components: {
        'my-component-name': component
    }
})

//或注册 Vue组件 创建的 Vue 实例
export default {
    components: {
        'my-component-name': component
    }
}

示例如下:

//App.vue
<template>
  <div id="app">
    <all-test />
    <component-a />
    <component-b />
  </div>
</template>

<script>
let ComponentA = {
  data(){
    return {
      x: '我是局部组件 A'
    }
  },
  render(h){
    return h('div',this.x)
  }
}

export default {
  name: 'App',
  components: {
    'component-a': ComponentA,
    'component-b': {
        data(){
          return {
            x: '我是局部组件 B'
          }
        },
        render(h){
          return h('div',this.x)
        }
    } 
  }
}
</script>

3 、模块系统中局部注册

在使用了诸如 Babel 和 webpack 的模块系统中可以使用 import 和 export 的方式单独导入组件的构造选项对象 或者 导入对应构造选项的 *.vue 文件。

//c.js
export default {
    data(){
        return {
          x: '我是 c.js 文件单独导出的组件构造选项对象'
        }
      },
      render(h){
        return h('div',this.x)
      }
}

//D.vue
<template>
    <div>
        {{x}}
    </div>
</template>

<script>
export default {
    data(){
        return {
            x: '我是 D.vue 文件导出的组件'
        }
    }
}
</script>

//App.vue
<template>
  <div id="app">
    <C />
    <D />
  </div>
</template>

import C from './c.js'
import D from './components/D.vue'

export default {
  name: 'App',
  components: {
    C,
    D 
  }
}
</script>

以上就是解读Vue组件注册方式的详细内容,更多关于Vue组件注册方式的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
详解Vue的mixin策略
Nov 19 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue中配置scss全局变量的步骤
Dec 28 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
如何理解Vue简单状态管理之store模式
May 15 #Vue.js
Vue如何实现组件间通信
May 15 #Vue.js
详解Vue的sync修饰符
May 15 #Vue.js
深入理解Vue的数据响应式
May 15 #Vue.js
详解Vue的options
May 15 #Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 #Vue.js
Vue接口封装的完整步骤记录
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP里8个鲜为人知的安全函数分析
2014/12/09 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
Javascript 中的 &amp;&amp; 和 || 使用小结
2010/04/25 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
内勤主管岗位职责
2014/04/03 职场文书
实习生评语
2014/04/26 职场文书
化学专业自荐信
2014/05/28 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
世界名著读书笔记
2015/06/25 职场文书
正规欠条模板
2015/07/03 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
python多次执行绘制条形图
2022/04/20 Python