Vue组件的注册使用
toqiye 2024-11-27 21:09 8 浏览 0 评论
前言:在单页面应用开发中,大多数情况下只有一个html页面,那么单页面的页面跳转,其实就是各组件之间的切换,那么这个组件其实就充当的是一个一个独立的html页面的角色,只不过这个组件之间可以复用,传值,随意调用,在vue中通常由(vue-router)和组件(component)来配合完成,那么这个component就是我们下来将要学习的组件。
什么是组件?
官方说组件是可复用的 Vue 实例,且带有一个名字,它与 new Vue 拥有相同的选项,比如它拥有生命周期钩子、data、computed、methods 等,与 new Vue 的唯一区别是不拥有 el 这样的根实例选项。
注册组件的两种方式
全局注册
Vue.component('my-component-name', {/*...*/})
局部注册
var ComponentA = { /*....*/ }
new Vue({
el: '#app',
components: {
'component-a': ComponentA
}
})
无论是全局注册还是局部注册,每个组件都需要有个名字。比如在全局注册的my-component-name和局部注册的component-a都是组件的名称, 组件名称推荐的命名方式hello-word的方式,也就是字母全小写,不同字母使用连字符。
全局注册组件的使用场景
<div id="app">
<btn-success></btn-success>
</div>
<script type="text/javascript">
Vue.component('btn-success', {
template: '<div> <button class="btn-success" @click="onSuccessClick">成功</button> </div>',
methods:{
onSuccessClick: function(){
alert('点击了Success按钮');
}
}
});
var vm = new Vue({
el: "#app",
})
</script>
上面的案例中我们注册了一个全局组件btn-success,可以看到我们为这个组件提供了一个模板template,这个模板里的内容其实就是这个组件最终要渲染的内容,并给它添加了一个点击事件 onSuccessClick,点击 btn-success 就会触发 onSuccessClick 方法。
这就是一个单独模块,它可以独立去维护自己的点击事件以及生命周期钩子,当我们需要使用它时,只需要通过 <btn-success></btn-success> 标签名的方式就可以把它展示在我们的 el 中,在使用VueCli构建工具开发的时候,组件将会被拆分成.vue后缀的单独文件,并且各个组件相互独立,互不干扰。
需要注意的是,组件中的data选项的指向不再是一个对象{},而变成了一个方法funvtion(){return {}},并通过return返回一个独立的对象。
举个例子 我们将刚才上边的例子改造为一个累加的效果,点击按钮一次加一!
<div id="app">
<!-- 调用全局组件 -->
<btn-success></btn-success>
<btn-success></btn-success>
<btn-success></btn-success>
</div>
<script type="text/javascript">
// 定义全局组件btn-success
Vue.component('btn-success', {
template: '<div> 当前值:{{ count }} <button class="btn-success" @click="onSuccessClick">成功</button> </div>',
data:function(){
return {
count: 0
}
},
methods:{
onSuccessClick: function(){
this.count += 1
}
}
});
var vm = new Vue({
el: "#app",
})
</script>
注意:此时在组件中定义的count值目前只能在组件中调用,el中不能调用,还需要注意的是通过全局注册的组件,无论是否对它进行了引用,它总会包含在最终的构建结果中,试想一下,当我们费尽心思来优化工具配置,希望最终构建结果尽可能精简时,这是不是一件非常令人绝望的事情?
基于此,vue更推荐使用局部注册的方式来进行组件的定义。
局部注册组件的使用场景
依然以刚才的示例为底,我们改造一下变成局部注册组件的方式,完成累加任务!
<div id="app">
<!-- 调用全局组件 -->
<btn-success></btn-success>
<btn-success></btn-success>
<btn-success></btn-success>
</div>
<script type="text/javascript">
var btnCountAdd = {
template: '<div><span>当前count的值:{{count}}</span><button @click="onCountAddClick">count++</button></div>',
data: function () {
return {
count: 0
}
},
methods: {
onCountAddClick: function () {
this.count += 1;
}
}
};
var vm = new Vue({
el: "#app",
components:{
'btn-success': btnCountAdd
}
})
</script>
在上面的代码中首先声明了一个变量 btnCountAdd,并为它指定了 template、data、methods 选项,然后在 new Vue 中通过 components 选项来注册了一个 btn-success 组件使其指向 btnCountAdd,这样就完成了一个组件的局部注册。
这似乎和全局注册组件没有很好的区分,这是因为,在实际项目中我们一般不这样用,一般是通过模块化的方式来引入组件,我们来模拟一下真实环境!
// 项目结构
├── index.html
├── btn-count-add.js
└── main.js
// index.html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
<btn-count-add></btn-count-add>
<btn-count-add></btn-count-add>
<btn-count-add></btn-count-add>
<btn-count-add></btn-count-add>
</div>
// 这里通过 ES6 module的方式导入模块,type类型必须设置为module
<script src="./main.js" type="module"></script>
// main.js
import { btnCountAdd } from './btn-count-add.js'
var vm = new Vue({
el: '#app',
components: {
'btn-count-add': btnCountAdd
}
});
// btn-count-add.js
var btnCountAdd = {
template: '<div><span>当前count的值:{{count}}</span><button @click="onCountAddClick">count++</button></div>',
data: function () {
return {
count: 0
}
},
methods: {
onCountAddClick: function () {
this.count += 1;
}
}
};
// ES6的导出语法,将其导出
export { btnCountAdd };
我们把 btnCountAdd 抽象进btn-count-add.js文件中,并通过es6的导出语法将其导出,这就形成了一个单独的模块,当需要使用 btnCountAdd 的时候,便可以通过 import { btnCountAdd } from './btn-count-add.js' 来引入 btnCountAdd,并通过 components 选项来把它注册到 Vue 中。
这种引入方式在真实的项目环境中会经常使用,特别是当我们使用一些大搞工具(如:webpack, gulp)的时候,这种情况尤其普遍。
当使用局部注册的方式来注册组件的时候,虽然这种方式可以方便对项目进行模块化,并且有利于对打包的结果进行优化,但是同样会有一个小的问题——那就是每使用一个组件都需要通过 import 来把它进行引用。
当组件过多的时候,这不免是一个很麻烦的事情。为此 Vue 提供了一个更为便利的方式用于自动全局注册,当我们使用 Webpack+Vue-CLI 来构建项目的时候,可以在 main.js 中 new Vue 之前这样做:
// 需要 npm import --save lodash
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'
const requireComponent = require.context(
// 其组件目录的相对路径
'./components',
// 是否查询其子目录
false,
// 匹配基础组件文件名的正则表达式,获取.vue结尾的文件
/.vue$/
)
requireComponent.keys().forEach(fileName => {
// 获取组件配置
const componentConfig = requireComponent(fileName)
// 获取组件的 PascalCase 命名
const componentName = upperFirst(
camelCase(
// 剥去文件名开头的 `./` 和结尾的扩展名
fileName.replace(/^\.\/(.*)\.\w+$/, '$1')
)
)
// 全局注册组件
Vue.component(
componentName,
// 如果这个组件选项是通过 `export default` 导出的,
// 那么就会优先使用 `.default`,
// 否则回退到使用模块的根。
componentConfig.default || componentConfig
)
});
比如 BtnSuccess.vue 则可以直接通过 <btn-success></btn-success> 来直接使用,并且未被使用到的组件并不会打包到构建结果之中。
下一节:组件之间的传参! 欢迎大家关注,一起学习探讨交流!
感谢您的阅读,如果对您有帮助,欢迎关注"CRMEB"。码云上有我们开源的商城项目,知识付费项目,JAVA版全开源商城系统,学习研究欢迎使用,老铁顺手点个star呗,老板奖励五毛,分你两毛五,关注我们保持联系!
- 上一篇:java大文件分片上传、断点续传、急速秒传
- 下一篇:对红黑树的认识总结
相关推荐
- 基于Python查找图像中最常见的颜色
-
如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确定水果的成熟度,我们可以通过检查水果的颜色是否落在特定范围内,来判断它们是否已经成熟。接下来我们将使...
- 出大要几次/圣彼得堡悖论
-
程序:fromrandomimportrandomdeffn():n=1whilerandom()<0.5:n+=1returnny=[fn()...
- 使用OpenCV测量图像中物体之间的距离
-
原文链接:https://www.pyimagesearch.com/2016/04/04/measuring-distance-between-objects-in-an-image-with-op...
- 让颜色更加饱满和有冲击力:图像颜色校正
-
大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:第一张图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。第一张图片是有色...
- Python 数据分析 : 实例
-
1、构建矩阵生成4x4形式的矩阵,矩阵中的数据是1~10之间的随机数random_list=np.random.random(16)random_list=np.round(...
- 用这些免费开源的图标库,为你的项目画龙点睛
-
精致好看的图标能够为你的项目增色不少,今天我就整理了一期图标库精选系列,希望你可以从中找到自己喜欢的图标库。下面就跟我来一场视觉的盛宴,我会一一介绍GitHub上品牌、流行、极小,各具特色的免费精...
- ICON设计规范之图标尺寸
-
编辑导语:图标设计是UI设计中不可缺少的元素,它看似简单,但其实内含门道。本篇文章里,作者就对icon设计的相关知识和icon绘制方法做出经验介绍。如果你对icon设计也想要有所了解的话,那就点进来看...
- PHP开发必备VSCode插件(大全)
-
通用chinese(simplified...):简体中文语言包liveserverhtml:实时预览prettier-codeformatter:最流行的代码格式化插件...
- 增强用户体验:前端开发中HTML5和CSS3表格属性的应用与优化研究
-
摘要:本文探讨了在前端开发中HTML5和CSS3表格属性的应用与优化。首先介绍了HTML5中常用的表格元素和CSS3中丰富的表格样式属性,旨在帮助开发人员定制表格的外观和样式。其次,研究了表格结构的优...
- 产品经理小技术:图片素材随手找,原型设计快又好
-
数十万互联网从业者的共同关注!作者:牛冰峰博客:http://uxfeng.com/画图——这项古老而精细的做法,是一代代产品狗们得以传承的立足之本。草图、线框图、思维导图、PPT插图、数据汇报图表、...
- MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI
-
前言最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请...
- webstorm常用的插件
-
1、AtomMaterialIcons推荐原因:这款插件不仅...
- 「智能家居」自动化平台nodered第三方节点dashboard的使用
-
自带节点库讲完了,开始说说第三方节点库dashboard,该库提供另一个可配置的UI页面,可以配置一些表单元素,以及图表。先来看一下别人使用dashboard制作的面板吧,是不是很漂亮。接下来我们一...
- 「炫丽」从0开始做一个WPF+Blazor对话小程序
-
大家好,我是沙漠尽头的狼。...
- MAUI使用Masa blazor组件库
-
上一篇(点击阅读)我们实现了UI在Web端(BlazorServer/Wasm)和客户端(Windows/macOS/Android/iOS)共享,这篇我加上MasaBlazor组件库的引用,并...
你 发表评论:
欢迎- 一周热门
-
-
如何评估预测值与真实值之间的匹配质量
-
如何解决npm安装依赖报错ERESOLVE unable to resolve dependency tree
-
超详细的cmder工具介绍及功能、快捷键说明
-
畅网 N5105 四口 2.5G 小主机安装 WIN10 对比 WIN11 跑分
-
常见面试第三题之Activity的几种启动模式介绍
-
软件推荐丨gocron —— 定时任务管理系统
-
一分钟带你认识了解电信光猫(电信光猫有什么用途)
-
聊聊C++20最大的变革之一 —— Coroutine,看不懂你打我(一)
-
硬核!Rust异步编程方式重大升级:新版Tokio如何提升10倍性能详解
-
Vite 4.0 正式发布(vite版本)
-
- 最近发表
- 标签列表
-
- systemproperties (65)
- npm版本管理 (61)
- localhost:15672 (59)
- materialtheme (86)
- node-ssh (68)
- 图床搭建 (62)
- vue3addeventlistener (60)
- mybatisselectone (78)
- css圆形进度条 (69)
- androidble蓝牙开发 (62)
- android-gif-drawable (60)
- appender-ref (64)
- springbootmockito (68)
- css边框渐变色和圆角 (58)
- gsonfastjson (59)
- 依赖注入的方式 (62)
- cookie跨域共享 (63)
- easyexcel导出图片 (77)
- dp数组 (61)
- js获取兄弟节点 (68)
- sysctl-a (60)
- java知音 (58)
- window.target (62)
- apimodel注解的作用 (60)
- window.onerror (66)