前端黑洞网 首页
资源下载

前端电子书

前端视频教程

前端小游戏

前端脚本

前端项目实战

其他资源

博客 问答 程序员的那些事
写博客 登录 注册

程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网: it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(3)

Vue--》详解vue组件及其组件化的使用

发布于2022-11-19 06:39     阅读(852)     评论(0)     点赞(1)     收藏(0)


目录

Vue组件

非单文件组件

单文件组件

组件的组成部分

组件中定义methods方法

vue-cli中组件的使用步骤

vue-cli中注册全局组件

组件的props属性

props中的常用属性

组件间的样式冲突


Vue组件

vue是一个支持组件化开发的前端框架。什么是组件化开发?组件化开发是指:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发与维护。vue中规定:组件的后缀名是.vue。用vue-cli搭建自动生成的App.vue文件本质上就是一个vue组件。

组件

定义:用来实现局部(特定)功能效果的代码集合(html/css/js/images...)

作用:一个界面的功能很复杂,组件能复用编码,简化项目编码,提高运行效率

组件化

当应用中的功能都是多组件的方式来编写的,那么这个应用就是一个组件化的应用

非单文件组件

非单文件组件:一个文件中包含有n个组件,说白了就是借助vue框架链接书写,这种开发方式日常项目用的很少,在此讲解仅作了解即可。

要想使用组件,应该知道其使用的步骤是啥,如下:

一、定义组件(创建组件)

使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别,如下:

el不要写:最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

data必须写成函数:避免组件被复用时,数据存在引用关系。

二、注册组件

局部注册:靠new Vue的时候传入components选项

全局注册:靠Vue.component('组件名',组件)

三、使用组件(书写组件标签)

<组件名></组件名>

  1. <body>
  2. <div id="root">
  3. <!-- 第三步:编写组件标签 -->
  4. <school></school>
  5. {{msg}}
  6. <hr>
  7. <student></student>
  8. <hello></hello>
  9. </div>
  10. <script src="../Vue.js/vue.js"></script>
  11. <script>
  12. Vue.config.productionTip = false; //阻止 vue 在启动时生成生产提示
  13. // 第一步:创建school组件
  14. const school = Vue.extend({
  15. template:`
  16. <div>
  17. <h2>学校名称:{{schoolName}}</h2>
  18. <h2>学校地址:{{address}}</h2>
  19. </div>
  20. `,
  21. data(){
  22. return {
  23. schoolName:'清华',
  24. address:'北京'
  25. }
  26. }
  27. });
  28. // 第一步:创建student组件
  29. const student = Vue.extend({
  30. template:`
  31. <div>
  32. <h2>学生姓名:{{studentName}}</h2>
  33. <h2>学生性别:{{studentSex}}</h2>
  34. <button @click="showName">点击弹窗显示学生姓名</button>
  35. </div>
  36. `,
  37. data(){
  38. return {
  39. studentName:'张三',
  40. studentSex:'男'
  41. }
  42. },
  43. methods: {
  44. showName(){
  45. alert(this.studentName)
  46. }
  47. },
  48. })
  49. // 第一步:创建全局组件Hello
  50. const hello = Vue.extend({
  51. template:`
  52. <div>hello {{name}}</div>
  53. `,
  54. data(){
  55. return {
  56. name:'world'
  57. }
  58. }
  59. })
  60. // 第二步:注册全局组件
  61. Vue.component('hello',hello)
  62. const vm = new Vue({
  63. data:{
  64. msg:'hello world'
  65. },
  66. // 第二步:注册组件
  67. components: {
  68. school,
  69. student
  70. },
  71. })
  72. vm.$mount('#root')
  73. </script>
  74. </body>

单文件组件

单文件组件:一个组件都是以 .vue 结尾的文件,便于文件数据的管理,在日常项目开发中经常使用这种方式。

组件的组成部分

每个 .vue 组件都由三部分构成,分别是:

template:组件的模板结构

script:组件的JavaScript行为

style:组件的样式

  1. <!-- 书写页面结构 -->
  2. <template>
  3. <div class="Vue">
  4. Vue--{{username}}
  5. </div>
  6. </template>
  7. <!-- 书写JS行为 -->
  8. <script>
  9. // 固定写法:默认导出!
  10. export default {
  11. // 在组件中 data 必须是个函数
  12. data() {
  13. return {
  14. // 这个 return 出去的{},可以定义数据
  15. username:'组件'
  16. }
  17. },
  18. }
  19. </script>
  20. <!-- 书写组件的样式 -->
  21. <style>
  22. .Vue{
  23. color:#008c8c;
  24. }
  25. </style>

组件中定义methods方法

在vue组件中定义的methods方法和调用vue库时使用方式一致,如下:

  1. <!-- 书写页面结构 -->
  2. <template>
  3. <div class="Vue">
  4. Vue--{{username}}
  5. <button @click="changeName">点击改变名字</button>
  6. </div>
  7. </template>
  8. <!-- 书写JS行为 -->
  9. <script>
  10. // 固定写法:默认导出!
  11. export default {
  12. // 在组件中 data 必须是个函数
  13. data() {
  14. return {
  15. // 这个 return 出去的{},可以定义数据
  16. username:'组件'
  17. }
  18. },
  19. methods:{
  20. changeName(){
  21. if(this.username=='组件'){
  22. this.username = 'zujian'
  23. }else{
  24. this.username = '组件'
  25. }
  26. }
  27. },
  28. // 当前组件中的侦听器
  29. watch:{},
  30. // 当前组件中的计算属性
  31. computed:{},
  32. // 当前组件中的过滤器
  33. filters:{}
  34. }
  35. </script>
  36. <!-- 书写组件的样式 -->
  37. <style>
  38. .Vue{
  39. color:#008c8c;
  40. }
  41. </style>

vue-cli中组件的使用步骤

项目中除了根组件还可以自定义其他组件使用。组件在被封装好之后,彼此之间是相互独立的,不存在父子关系,在使用组件的时候,根据彼此的嵌套关系,形成了父子关系、兄弟关系

那么如何在项目中使用其他自定义组件呢?看如下的组件使用步骤:

  1. <template>
  2. <div class="app-container">
  3. <h2>vue组件</h2>
  4. <Left></Left>
  5. <Right></Right>
  6. </div>
  7. </template>
  8. <script>
  9. import Left from '@/components/Left.vue'
  10. import Right from '@/components/Right.vue'
  11. // 固定写法:默认导出!
  12. export default {
  13. components:{
  14. Left,
  15. Right
  16. },
  17. }
  18. </script>
  19. <style>
  20. .app-container{
  21. color:#008c8c;
  22. }
  23. </style>

我们在App.vue注册使用Left和Right组件,但是在Left中是不能用Right组件的,如果想用又得重新在Left中注册Right组件,能不能简化这种方式呢?

vue-cli中注册全局组件

在vue项目的 main.js 入口文件中,通过 Vue.component() 方法,可以注册全局组件,如下:

  1. // 导入需要全局注册的组件
  2. import Global from '@/components/Global.vue'
  3. // 参数1:字符串格式,表示组件的“注册名称”
  4. // 参数2:需要被全局注册的那个组件
  5. Vue.component('Myglobal',Global)

能够设置为全局组件的,一定是频繁使用的组件。

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. // 导入需要被全局注册的那个组件
  4. import Global from '@/components/Global.vue'
  5. Vue.component('Myglobal',Global)
  6. Vue.config.productionTip = false
  7. // 创建 Vue 的实例对象
  8. new Vue({
  9. // 把render函数指定的组件,渲染到 HTML 页面中。
  10. render: h => h(App),
  11. }).$mount('#app')

组件的props属性

props是组件的自定义属性,允许使用者通过自定义属性,为当前组件指定初始值,在封装全局(通用)组件的时候,合理地使用props可以极大的提高组件的复用性。 其语法格式如下:

  1. <script>
  2. export default{
  3. // 自定义属性,props中的数据可以直接在模板结构被使用
  4. props:['init'],
  5. data(){
  6. return {
  7. Global:this.init
  8. }
  9. }
  10. }
  11. </script>

vue规定:组件中封装的自定义属性是只读的,程序员不能直接修改 props 的值。否则会直接报错:

如果要想修改 props 的值,可以把 props 的值转存到 data 中,因为 data 中的数据是可读可写的。

  1. props:['init'],
  2. data(){
  3. return {
  4. Global:this.init
  5. }
  6. }

props中的常用属性

在声明自定义属性时,可以通过 default属性 来定义属性的默认值,代码如下:

  1. export default{
  2. props:{
  3. init:{
  4. // 如果外界使用该组件时,没有传递init属性,则默认值生效
  5. default:0
  6. }
  7. }
  8. }

在声明自定义属性时,可以通过 type属性 来定义属性的值类型,代码如下:

  1. export default{
  2. props:{
  3. init:{
  4. // 用default属性定义属性的默认值
  5. default:0,
  6. // 用type属性定义属性的值类型,如果传递过来的值不符合此类型,则会在终端报错
  7. type:Number //还可以是其他类型:字符串、数组、布尔、对象等等
  8. }
  9. }
  10. }

在声明自定义属性时,可以通过 required属性 来规定是否是必填项,代码如下:

  1. props:{
  2. init:{
  3. // 用default属性定义属性的默认值
  4. default:0,
  5. // 用type属性定义属性的值类型,如果传递过来的值不符合此类型,则会在终端报错
  6. type:Number,
  7. // 必填项校验,如果使用该组件没有使用 init 属性就会报错
  8. required:true
  9. }
  10. },

组件间的样式冲突

默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题

导致组件之间冲突的根本原因是:

1)单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面呈现的

2)每个组件中的样式,都会影响整个index.html页面的DOM结构

如果想防止组件与组件之间的样式污染,需要在style标签加一个 scoped 属性。

scoped的属性原理是给样式一个唯一标识来书写属性:

那么如何在父组件中修改子组件的样式呢?在子组件修改我们的样式显然是不明智的,不便于后期的灵活修改,所以我们如何在父组件中修改子组件呢?如下:

PS/deep/  是之前的写法,虽然弃用但还是能用的,现在的写法是 ::v-deep ,当然随便你怎么用吧,能达到效果就行。

注意:在日常开发中,我们一般是使用第三方组件库的时候,如果想修改其默认样式在父组件的文件下,我们就需要用到 /deep/ 也就是 ::v-deep 这个属性。


window属性:controllers

2022年最受欢迎的8大编程语言

为什么都说程序员找不到女朋友,但是身边程序猿的却没一个单身的

30岁以上你还死磕技术,别说拿高薪,可能你连饭碗都会保不住

程序员被开除,老板:“有你参与的项目全黄了!”

笑话:一个测试工程师走进一家酒吧

趣图:程序员头疼的4种原因

笑话:面试官:请拿出一段体现你水平的代码。我: sudo rm -rf /*面试官:这体现了你哪方面能力?

网友说:做开发,不被领导喜欢怎么办?

前端精选:在 WPF 中实现融合效果



所属网站分类: 技术文章 > 博客

作者: Jjxj

链接: http://www.qianduanheidong.com/blog/article/455474/5822f60fcc7f7025d388/

来源: 前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)




程序员的那些事(new)

window属性:controllers

2022年最受欢迎的8大编程语言

为什么都说程序员找不到女朋友,但是身边程序猿的却没一个单身的

30岁以上你还死磕技术,别说拿高薪,可能你连饭碗都会保不住

程序员被开除,老板:“有你参与的项目全黄了!”

笑话:一个测试工程师走进一家酒吧

趣图:程序员头疼的4种原因

笑话:面试官:请拿出一段体现你水平的代码。我: sudo rm -rf /*面试官:这体现了你哪方面能力?

网友说:做开发,不被领导喜欢怎么办?

前端精选:在 WPF 中实现融合效果

电子书(new)

CSS3学习必备书籍(CSS3 实战).pdf

CSS网站布局实录(第二版).pdf

CSS禅意花园.pdf

HTML5权威指南.pdf

HTML5移动Web开发指南.pdf

零基础学HTML+CSS [第三版].pdf 下载

数据结构与算法 JavaScript 描述.pdf

客户端存储技术.pdf 下载

前端100本高清pdf电子书打包下载

深入理解HTML5:语义、标准与样式 PDF 下载

脚本(new)

压扁小鸟小游戏

.美女拼图游戏源码

JavaScript按键控制坦克移动

JavaScript打地鼠游戏

HTML5实现抓怪物小游戏

网页版-别踩白块游戏

网页版扫雷

HTML5实现拼图游戏

网页版2048

HTML5箭头射击游戏代码

博客(new)

Web 页面之间传递参数的几种方法

uniapp安卓离线打包步骤

Vue--》深入理解 Vue 3 导航守卫,掌握前端路由的灵魂技能!

java图片转二进制流_java将文件转化成二进制流

个人简历html网页代码(使用chatgpt完成web开发课的实验)

【HTTP 协议】掌握 Web 的核心技术

Three.js指定路径漫游(站走切换、路径动画、展示路线、开始、暂停、继续、退出、镜头跟随)

完全卸载vscode

flex布局优化(两端对齐,从左至右)

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

视频教程(new)

带你快速入坑ES6

0到1快速构建自己的后台管理系统

基于Element-UI二次封装业务组件-前端视频教程

基于WebAR实现3D任务书桌上跳舞

Tensorflow.js 实现垃圾分类

全方位入门git

六个案例学会响应式布局

Ajax实战案例之列表渲染

Phaser从0到1实战微信2D小游戏【钢琴方块】

元旦贺卡-前端视频教程

项目实战(new)

NodeJS+Express+MongoDB实战项目

打造仿小米电商网站

2020版uni-app项目实战

2020前端React项目实战

小程序全栈开发之喵喵交友

Vue实战项目之喵喵电影

实战项目之网易云

实战项目之头条

前端实战项目之幸福西饼

实战项目之拉勾网

问答(new)

居中网站内容 + 垂直导航栏

如何将项目左对齐(标题)

Nunjucks 嵌套变量

文本显示在图像上悬停

HTML/CSS - 按钮在另一个元素下排列

MathJax 库在公式中留下滚动条

如何在MVC5中用Razor将一行设为红色

在 Razor 页面 WebApplication 中将帖子从文本区域保存到数据库

响应式图像背景尺寸封面

将图像放入图像内

游戏(new)

jQuery坦克大战网页小游戏

JS俄罗斯方块游戏代码

Vue.js注意力大考验小游戏代码

HTML欢乐打地鼠小游戏

HTML5糖果消消乐闯关小游戏

扑克牌翻牌记忆小游戏

HTML翻牌小游戏代码

HTML5拉杆子过关小游戏代码

HTML5倾斜迷宫小游戏

HTML5五子棋小游戏

其他资源(new)

jQuery益智拼图游戏

HTML5制作的2048游戏

.小球撞击游戏源码

驴子跳跳网页游戏源码

.jQuery五子棋游戏

HTML5街头霸王游戏源码

.网页版台球小游戏

地图拼图游戏

HTML5中国象棋游戏

Maven+JSP+SSM+Mysql实现的音乐网站

聚圣源是什么符号已婚女人梦见蛇格林童话故事100篇最新三级姓贾的起个名字烘培坊起名字大全魔力结晶搬家起名速度与激情7经典台词张锦程女医生的秘密15年没上班仍发工资结婚为什么电视剧黑道圣徒3重制版今天出身男孩起名南方tvs2李思起名商标起名和设计要多少钱女孩姓史起什么名字好啊漫画威龙北新集团建材股份有限公司五年级上册语文第一单元作文烧烤店的起名字网上能起名公司怎么起名好亲戚建群起什么群名好属鼠的男孩子起什么名字好生煎包店起名字卤味店起名小青年论坛淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化