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 相关文章推荐
JavaScript中json使用自己总结
Aug 13 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
js实现仿Windows风格选项卡和按钮效果实例
May 13 Javascript
Javascript中With语句用法实例
May 14 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
JS中判断null的方法分析
Nov 21 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
Jan 25 Javascript
vue.js实现插入数值与表达式的方法分析
Jul 06 Javascript
vue props传值失败 输出undefined的解决方法
Sep 11 Javascript
使用Vue 实现滑动验证码功能
Jun 27 Javascript
实现vuex原理的示例
Oct 21 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 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
PHP之autoload运行机制实例分析
2014/08/28 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
offsetParent 算法分析
2010/04/05 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
基于构造函数的五种继承方法小结
2017/07/27 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
python代码实现ID3决策树算法
2017/12/20 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
往来会计岗位职责
2013/12/19 职场文书
年度考核评语
2014/01/19 职场文书
三八节主持词
2014/03/17 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
鲁迅故里导游词
2015/02/05 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis