解读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组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
vue+elementUI实现表格列的显示与隐藏
Apr 13 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 中dirname(_file_)讲解
2007/03/18 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
php实现简单四则运算器
2020/11/29 PHP
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
微信小程序收藏功能的实现代码
2018/06/12 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python中尾递归用法实例详解
2015/04/28 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
公司年会搞笑主持词
2014/03/24 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
公司委托书格式范文
2014/10/09 职场文书
2014年科室工作总结
2014/11/20 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
Python如何用re模块实现简易tokenizer
2022/05/02 Python