解读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 相关文章推荐
vuex的数据渲染与修改浅析
Nov 26 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue动态绑定style样式
Apr 20 Vue.js
vue递归实现树形组件
Jul 15 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
模拟flock实现文件锁定
2007/02/14 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
微信小程序分享功能之按钮button 边框隐藏和点击隐藏
2018/06/14 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
Django上线部署之IIS的配置方法
2019/08/22 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
毕业生求职简历的自我评价
2013/10/07 职场文书
分公司经理岗位职责
2013/11/11 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
怎样填写就业意向
2014/04/02 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP