解读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 router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
Vue ​v-model相关知识总结
Jan 28 Vue.js
vue实现倒计时功能
Mar 24 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue使用watch监听属性变化
Apr 30 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
php5 mysql分页实例代码
2008/04/10 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
简单上手Python中装饰器的使用
2015/07/12 Python
利用Python破解斗地主残局详解
2017/06/30 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Python3 log10()函数简单用法
2019/02/19 Python
python虚拟环境完美部署教程
2019/08/06 Python
Django中从mysql数据库中获取数据传到echarts方式
2020/04/07 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
开工典礼策划方案
2014/05/23 职场文书
工会主席事迹材料
2014/06/03 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
MySQL常见优化方案汇总
2022/01/18 MySQL