解读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-cli 创建模板项目
Nov 19 Vue.js
详解Vue 的异常处理机制
Nov 30 Vue.js
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
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
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
PHP实现倒计时功能
2020/11/16 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
python使用pil生成图片验证码的方法
2015/05/08 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
J2EE面试题
2016/03/14 面试题
药学专业毕业生求职信
2013/10/20 职场文书
医学院毕业生自荐信
2013/11/08 职场文书
2014年防汛工作总结
2014/12/08 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
vue实力踩坑之push当前页无效
2022/04/10 Vue.js