Vue封装的组件全局注册并引用


Posted in Javascript onJuly 24, 2019

当vue接触的多了之后,你可能也会到自己封装组件的程度,试想每个页面的功能级模块全部拆分成组件,然后后续请求后台数据传入进去或者自己模拟数据,是多么方便的一件事情。

每当我们需要修改的时候,只需维护那一个功能性组件即可,不需要这个功能了,只需要从页面中删除这个组件的引用即可。

那么废话不多说了,我们来看看如何全局注册并一键引入(类似于element ui的全部引入)。

如何封装组件就不多赘述了。

参考vue官网的做法:vue官网全局注册

1、正则判断路径以及文件名,获取全部组件并全局注册(可以直接在main.js里写,但是为了规范以及后期可维护性,我们新建个单独的的js文件写入)

(1)main.js引入所有自定义封装的组件

import Vue from 'vue';
import echarts from 'echarts';
import App from './App.vue';
import router from './router';
import store from './store';
import './plugins/element';
// 引入时间戳序列化
import './plugins/dateFormat';
// 引入公共样式
import Public from './assets/css/public.css';
// 引入所有自定义封装的组件
import './components/CommonCommponts/GlobalComponents';
import startup from './startup';
 
// 使用公共样式
Vue.use(Public);
 
Vue.config.productionTip = false;
Vue.prototype.$echarts = echarts;
 
function vue() {
 new Vue({
 router,
 store,
 render: h => h(App)
 }).$mount('#app');
}
startup(vue, router);

(2)全局组件的GlobalComponents.js

这里需要安装2个插件upperFirst和camelCase

下面是组件相对于这个文件的路径,因为我的封装组件和这个js文件在同一级,所以直接 . 就可以了。

然后是是否查询子目录,即这个路径下你又新建了文件夹,把各个组件区分开,那么就会嵌套很多层,查询子目录可以方便的使我们找到它们。

然后是正则表达式,因为我的所有组件名都是Rdapp开头的,这里看大家的文件命名,不需要的话删除前面的Rdapp即可。

然后下面的部分就可以不用动了。

import Vue from 'vue';
import upperFirst from 'lodash/upperFirst';
import camelCase from 'lodash/camelCase';
 
const requireComponent = require.context(
 // 其组件目录的相对路径
 '.',
 // 是否查询其子目录
 true,
 // 匹配基础组件文件名的正则表达式
 /Rdapp[A-Z]\w+\.(vue|js)$/,
);
 
requireComponent.keys().forEach((fileName) => {
 // 获取组件配置
 const componentConfig = requireComponent(fileName);
 
 // 获取组件的 PascalCase 命名
 const componentName = upperFirst(
 camelCase(
  // 获取和目录深度无关的文件名
  fileName
  .split('/')
  .pop()
  .replace(/\.\w+$/, ''),
 ),
 );
 
 // 全局注册组件
 Vue.component(
 componentName,
 // 如果这个组件选项是通过 `export default` 导出的,
 // 那么就会优先使用 `.default`,
 // 否则回退到使用模块的根。
 componentConfig.default || componentConfig,
 );
});

2、组件封装以及命名

这里新建了一个文件夹,其中js文件是上面的配置文件,用于全局注册并引用的,然后下面是封装的组件,请使用驼峰命名法。

Vue封装的组件全局注册并引用

3、组件引入

组件引入使用 - 语法,以每个驼峰为标记,例如AccBdd的命名,引入就是<acc-bdd></acc-bdd>即可

<template>
 <div class="ER-left-box">
 <rdapp-animation-group animationType="leftToRight">
  <!-- 标题一 -->
  <rdapp-animation-item speed="fast">
  <rdapp-title
   :textStyle="leftData.LeftTitle1"
   class="header-title"
  ></rdapp-title>
  </rdapp-animation-item>
  <!-- 火灾警告 -->
  <rdapp-animation-item speed="slow">
  <rdapp-early-warning :textStyle="HandleEventInfo"></rdapp-early-warning>
  </rdapp-animation-item>
  <!-- 标题二 -->
  <rdapp-animation-item speed="fast">
  <rdapp-title
   :textStyle="leftData.LeftTitle2"
   class="header-title"
  ></rdapp-title>
  </rdapp-animation-item>
  <!-- 描述 -->
  <rdapp-animation-item speed="normal">
  <rdapp-describe
   :textStyle="{ description: HandleEventInfo.description }"
  ></rdapp-describe>
  </rdapp-animation-item>
  <!-- 视频 -->
  <rdapp-animation-item speed="slow">
  <rdapp-video ref="video" :cameraNum="0"></rdapp-video>
  </rdapp-animation-item>
 </rdapp-animation-group>
 </div>
</template>

这样我们就完成了组件的封装以及所有组件的全局注册和使用,便于我们的开发以及后期可维护性。

这里附带一个组件的封装写法:

这里封装的是一个标题的组件,为了方便用户传参,使用了对象作为参数,通过计算属性以及Object.assign方法,可以更方便的合并用户传递的参数,即如果用户只在对象中传入了text属性,那么其他属性就会使用默认值,这样无疑提高了组件的丰富性。

<template>
 <div class="BgTitle-box" :style="getStyle">
 {{getStyle.text}}
 </div>
</template>
 
<script>
export default {
 name: 'RdappBgTitle',
 props: {
 textStyle: Object,
 },
 computed: {
 getStyle() {
  return Object.assign({
  text: '基本信息',
  width: '300px',
  height: '54px',
  lineHeight: '54px',
  textAlign: 'center',
  fontSize: '16px',
  fontColor: '#fff',
  }, this.textStyle);
 },
 },
};
</script>
 
<style scoped>
 .BgTitle-box{
 background: url("../../static/img/PreliminaryJudge/assess.png") no-repeat center center;
 }
</style>

好了,以上就是组件封装以及全局注册引用的方法,希望对你有帮助。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js取得url地址参数实例
Feb 22 Javascript
时间戳转换为时间 年月日时间的JS函数
Aug 19 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 Javascript
使用Require.js封装原生js轮播图的实现代码
Jun 15 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
Dec 11 Javascript
vue自定义一个v-model的实现代码
Jun 21 Javascript
详解swipe使用及竖屏页面滚动方法
Jun 28 Javascript
vue+element模态框中新增模态框和删除功能
Jun 11 Javascript
Node.js API详解之 V8模块用法实例分析
Jun 05 Javascript
解决js中的setInterval清空定时器不管用问题
Nov 17 Javascript
vue子路由跳转实现tab选项卡
Jul 24 #Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
Jul 24 #Javascript
Vue.js路由实现选项卡简单实例
Jul 24 #Javascript
vue滚动tab跟随切换效果
Jun 29 #Javascript
Vue.js实现tab切换效果
Jul 24 #Javascript
javascript面向对象三大特征之多态实例详解
Jul 24 #Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 #Javascript
You might like
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
php通过修改header强制图片下载的方法
2015/03/24 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
Opacity.js
2007/01/22 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
机电专业毕业生推荐信
2013/11/10 职场文书
韩国商务邀请函
2014/01/14 职场文书
幼儿教师求职信
2014/05/24 职场文书
报效祖国演讲稿
2014/09/15 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
班级班风口号大全
2015/12/25 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Redis性能监控的实现
2021/07/09 Redis
Hive HQL支持2种查询语句风格
2022/06/25 数据库