解读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+iview实现分页及查询功能
Nov 17 Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
Vue实现简单购物车功能
Dec 13 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue实现倒计时功能
Mar 24 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
Vue组件更新数据v-model不生效的解决
Apr 02 Vue.js
教你部署vue项目到docker
Apr 05 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
综合图片计数器
2006/10/09 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
基于scrapy的redis安装和配置方法
2018/06/13 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
对python中list的五种查找方法说明
2020/07/13 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
简历中的自我评价怎么写
2014/01/29 职场文书
求职信需要的五点内容
2014/02/01 职场文书
高效课堂标语
2014/06/26 职场文书
体育教师求职信
2014/06/30 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
银行自荐信怎么写
2015/03/05 职场文书
高三教师工作总结2015
2015/07/21 职场文书
教师个人教学反思
2016/02/23 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server