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的数组的扩展实例代码
Jul 09 Javascript
jQuery 阴影插件代码分享
Jan 09 Javascript
JQuery+CSS实现图片上放置按钮的方法
May 29 Javascript
js实现延时加载Flash的方法
Nov 26 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 Javascript
IE9 elementUI文件上传的问题解决
Oct 17 Javascript
ES6数组与对象的解构赋值详解
Jun 14 Javascript
JavaScript中Dom操作实例详解
Jul 08 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
JavaScript实现Tab选项卡切换
Feb 13 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 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
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
javascript hashtable实现代码
2009/10/13 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jquery中$each()方法的使用指南
2015/04/30 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
Angularjs分页查询的实现
2017/02/24 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
es6中reduce的基本使用方法
2019/09/10 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python实现字典依据value排序
2016/02/24 Python
Python之文字转图片方法
2018/05/10 Python
详解python3中zipfile模块用法
2018/06/18 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
Python中print函数简单使用总结
2019/08/05 Python
Python常用库大全及简要说明
2020/01/17 Python
Python 如何展开嵌套的序列
2020/08/01 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
为什么要用EJB
2014/04/17 面试题
python用tkinter开发的扫雷游戏
2021/06/01 Python