一幅长文细学Vue(三)——组件基础(上)

3 组件基础(上)

摘要

​ 在本文中,我们将学习什么是SPA,以及Vue中组件的基本使用。

声明:为了文章的清爽性,在文章内部的代码演示中只会附上部分演示代码,main.js文件的代码通常不贴出,如果感兴趣可以前往代码仓库获取

作者:来自ArimaMisaki创作

文章目录

  • 3 组件基础(上)
    • 3.1 SPA
      • 3.1.1 单页面应用程序
      • 3.1.2 创建工程化的SPA项目
      • 3.1.3 Vite创建项目
      • 3.1.4 Vite基本使用
    • 3.2 组件
      • 3.2.1 组件化开发
      • 3.2.2 组件结构
      • 3.2.3 组件注册
      • 3.2.4 注册组件时名称的大小写
      • 3.2.5 通过name属性注册组件
      • 3.2.6 组件冲突的解决
      • 3.2.7 样式穿透
      • 3.2.8 props
      • 3.2.9 动态绑定HTML的class

3.1 SPA

3.1.1 单页面应用程序

说明:单页面应用程序(Single Page Application)简称SPA,即在Web网站中只有唯一的一个HTML页面,所有功能与交互都在一个页面内完成。

特点:所有功能局限于一个页面中,这就意味着如果想要做出切换页面的效果,就需要通过JS来动态变化HTML的内容,做出一种切换页面的假象。

优点

  • 良好用户体验
  • 良好的前后端工作分离
  • 减轻服务器压力

缺点

  • 首屏加载慢
  • 不利于SEO(搜索引擎优化),但可以使用SSR服务器端渲染

3.1.2 创建工程化的SPA项目

说明:Vue官方提供了两种快速创建工程化SPA项目的方式,即ViteVue-cli

区别

image-20220820225020973


3.1.3 Vite创建项目

创建项目

  1. 运行npm init vite-app
  2. 进入项目
  3. npm i安装所有依赖包
  4. npm run dev可执行脚本启动项目

项目结构

image-20220820225509580

运行流程:通过main.js将App.vue渲染到index.html的指定区域中。


3.1.4 Vite基本使用

说明:按照运行流程,我们应该做如下的几件事

  1. 在vue文件中编写模板结构,模板上采用html语法书写,用template标签括起
  2. 在index.html中预留一块区域给vue模板。常用div,并且用id指明模板名称,如app
  3. 在main.js中关联模板和html,书写如下:
//1 按需导入createApp函数
import { createApp } from "vue";//2 导入组件
import App from './App.vue';// 3 调用createApp函数,创建SPA应用实例
const app = createApp(App);// 4 调用mount()把APP组件的模板结构渲染到指定的el区域中,这里我们渲染到index.html标签id为app的元素中
app.mount('#app');

3.2 组件

3.2.1 组件化开发

说明:从宏观来看,我们可以把可复用的结构封装为组件,然后在index.html上进行多次使用。从而方便项目的开发和维护。

vue组件化:vue是一个完全支持组件化开发的框架,vue中规定组件的后缀名为.vue

vue组件结构:vue的组件可以由三个节点组成

  • template:相当于html,是组件的模板结构
  • script:组件的js行为
  • style:组件的样式

3.2.2 组件结构

template:在vue3.x版本中,可以在该模板定义多个根节点,但在vue2.x版本中,仅支持定义一个根节点。

script:可以在script中定义行为,并且通过ES6模块化暴露语法export default来暴露模板中的内容,除此之外还可以定义一些属性来为组件提供功能性辅助。

  • name:键值对形式;用于指定模板名称,名称建议首字母大写。
  • data:函数形式;用于渲染模板的数据,需要采用return返回一个对象的形式来返回模板所需的数据
  • methods:对象形式;对象中的每个属性都是一个方法。

style:可以编写组件的样式,其中可以通过添加标签属性lang来指定style采用什么语言编写样式,lang="css"则采用css方式,这也是默认方式,lang="less"则采用less方式。不过要使用less之前需要使用npm i less来安装依赖包获得less语法的编译支持。


3.2.3 组件注册

说明:组件中可以引入其他组件进行使用,这也就催生了两种组件的注册方式,即全局注册局部注册

  • 全局注册:可以在全局被任何一个组件使用
  • 局部注册:在当前注册的范围内使用

全局注册的方法:使用app.component(‘使用的标签名’,组件)

局部注册的方法:在需要导入的模块下的script节点中导入组件,并声明components选项,该选项是一个对象,可以按照使用的标签名形式填写。

提示:在官方文档中,我们把module.exports对象中的各个属性称为选项。如components选项,data选项,name选项。

<script>
import MyArticle from './Article.vue';
export default {name:'MyApp',components:{MyArticle}
}
</script>

3.2.4 注册组件时名称的大小写

说明:在进行组件的注册时,定义组件注册名称的方式有两种

  • 使用kebab-case命名法,即短横线命名法,如my-swiper
  • 使用PascalCase命名法,即大驼峰命名法,如MySwiper

如果使用的标签名使用短横线命名法的方式,则在使用标签时只能严格按照自己命名的名称来使用,但如果使用的是帕斯卡命名法,则在后续的使用中都可以转换为短横线命名来表示。


3.2.5 通过name属性注册组件

说明:组件的注册也可以使用组件中暴露出的name属性


3.2.6 组件冲突的解决

组件冲突原因:如果一个组件里面嵌套一个子组件,则在渲染样式时,有可能会影响子组件的样式。出现这种情况的根本原因是因为vue文件下的模板节点我们写的结构都是虚拟DOM,而所有的组件都是基于唯一的index.html页面来呈现的。

解决方法:为每个组件分配唯一的自定义属性,在编写组件样式时,在传统的选择器后跟一个中括号,里面放你分配的自定义属性名,这样就可以解决冲突了。

<template><div class="container">//自定义data-v-001属性<h3 data-v-001></h3></div>
</template><style>.container[data-v-001]{border:1px soild red;}
</style>

更好的方法:如果手动指定自定义样式,这样会很麻烦。为此,vue为style节点提供了scoped属性,让vue自动为各个组件分配随机的属性。


3.2.7 样式穿透

说明:如果给当前组件的style节点添加了scoped属性,则当前组件的样式对其子组件不再生效。如果想让某些样式对子组件生效,可以在选择器前添加:deep()

原理:当加上样式穿透后,scoped的效果由原先的选择器[自定义属性]变为了[自定义属性] 选择器

<style scoped>:deep() p {color: gold;}   
</style>

3.2.8 props

引入:为了提高组件的复用性,我们在封装组件时要遵循的规则是

  • 组件的DOM结构和style样式要尽量复用
  • 组件中展示的数据,尽量由组件的使用者提供

比较显著的一个例子是:我们封装轮播图组件,组件的外观和轮换时间我们希望都一样,但是轮播图里的图片我们可不希望一样。我们希望在调用组件时,轮播图的图片由我们自己提供。

说明:如果我们希望数据由组件使用者提供,那我们就要使用到props。props是组件的一个选项,可以通过props暴露想要传递的数据。当我们在编写组件模板的时候,模板中需要数据的地方用插值表达式来声明,而后在module.exports对象中新增props,以数组形式编写插值表达式对应的位置数据。当我们需要使用模板时,在data中提前准备好数据,利用v-bind传到组件上即可。

提示:在组件的插值表达式中不允许声明未定义的props。如果传递了未声明的props属性,则这些属性会被忽略,无法被子组件使用。

命名问题:props数组中存放的数据命名也采用短横线和帕斯卡命名的方式,声明帕斯卡时也可以转换短横线。

<template><div><h3>标题:{{title}}</h3><h5>作者:{{author}}</h5><h6>发布时间:{{pubTime}}</h6></div>
</template><script>
export default {name:'MyArticle',// 外界可以传递数据到当前的组件中props:['title','author','pubTime']
}
</script>
<template><div><h1>这是App.vue根组件</h1><hr><my-article :title = "info.title" :author = "'post by '+info.author" :pubTime="info.pubTime"></my-article></div>
</template><script>
import MyArticle from './Article.vue';
export default {name:'MyApp',data(){return {info:{title:'abc',author:'123',pubTime:'1989'},}},components:{MyArticle}
}
</script>

3.2.9 动态绑定HTML的class

说明:我们可以通过三元表达式,动态的为元素绑定class的类名。

绑定多个class:如果元素需要动态地绑定多个class类名,可以使用数组的语法格式,不同的三元表达式之间采用逗号分隔。

简化:使用数组语法动态绑定class会导致模板结构臃肿的问题,此时可以使用对象语法进行简化。

以对象语法绑定内联style:使用:style可以在模板结构标签中添加内联样式,这种语法的本质是一个js。

<template><div><!-- <h3 class = "thin" :class = "isItalic ? 'italic':''">MyStyle组件</h3> --><!-- <h3 class = "thin" :class = "[isItalic ? 'italic':'',isDelete ? 'delete':'']">MyStyle组件</h3><button @click="isItalic = !isItalic">Toggle Italic</button><button @click = "isDelete = !isDelete">Toggle Delete</button> --><h3 class = "thin" :class = "classObj">MyStyle组件</h3><button @click="classObj.italic = !classObj.italic ">Toggle Italic</button><button @click = "classObj.delete = !classObj.delete">Toggle Delete</button><hr><div :style = "{color:active,fontSize:fSize + 'px',backgroundColor:bgcolor}">人才</div><button @click="fSize ++">字号 +1</button><button @click="fSize --">字号 -1</button></div>
</template><script>
export default {name:'Mystyle',data(){return {isItalic:false,isDelete:false,classObj:{italic:false,delete:false,},// 高亮的文本颜色active:'red',//文字的大小fSize:30,// 背景颜色bgcolor:'pink',}},
}
</script><style>.thin{font-weight: 200;}.italic{font-style: italic;}.delete{text-decoration: line-through;}</style>
<template><div><!-- <h3 class = "thin" :class = "isItalic ? 'italic':''">MyStyle组件</h3> --><!-- <h3 class = "thin" :class = "[isItalic ? 'italic':'',isDelete ? 'delete':'']">MyStyle组件</h3><button @click="isItalic = !isItalic">Toggle Italic</button><button @click = "isDelete = !isDelete">Toggle Delete</button> --><h3 class = "thin" :class = "classObj">MyStyle组件</h3><button @click="classObj.italic = !classObj.italic ">Toggle Italic</button><button @click = "classObj.delete = !classObj.delete">Toggle Delete</button><hr><div :style = "{color:active,fontSize:fSize + 'px',backgroundColor:bgcolor}">人才</div><button @click="fSize ++">字号 +1</button><button @click="fSize --">字号 -1</button></div>
</template><script>
export default {name:'Mystyle',data(){return {isItalic:false,isDelete:false,classObj:{italic:false,delete:false,},// 高亮的文本颜色active:'red',//文字的大小fSize:30,// 背景颜色bgcolor:'pink',}},
}
</script><style>.thin{font-weight: 200;}.italic{font-style: italic;}.delete{text-decoration: line-through;}</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

综合练习:词频统计

下载一首英文的歌词或文章 将所有,.&#xff1f;&#xff01;’:等分隔符全部替换为空格 将所有大写转换为小写 生成单词列表 fopen(news.txt,r) newsf.read() f.close() sep,.!"?: for c in sep:newsnews.replace(c, )wordListnews.lower().split()for w in wordList:pr…

linux中fcntl()、lockf、flock的区别

fcntl()、lockf、flock的区别 ——lvyilong316 这三个函数的作用都是给文件加锁&#xff0c;那它们有什么区别呢&#xff1f;首先flock和fcntl是系统调用&#xff0c;而lockf是库函数。lockf实际上是fcntl的封装&#xff0c;所以lockf和fcntl的底层实现是一样的&#xff0c;对文…

iOS开发拓展篇—音频处理(音乐播放器6)

一、图片处理 说明&#xff1a; Aspect表示按照原来的宽高比进行缩放。 Aspectfit表示按照原来的宽高比缩放&#xff0c;要求看到全部图片&#xff0c;后果是不能完全覆盖窗口&#xff0c;会留有空白。 Aspectfill表示按照原来的宽高比缩放&#xff0c;但只能看到部分图片。引发…

词频统计预处理之综合练习

下载一首英文的歌词或文章 news , 生成词频统计 sep,.;:"" for c in sep:newsnews.replace(c, )wordlistnews.lower().split()wordDict{} for w in wordlist:wordDict[w]wordDict.get(w,0)1wordSetset(wordlist) for w in wordSet:wordDict[w]wordlist.count(w)f…

一幅长文细学Vue(五)——组件高级(上)

5 组件高级&#xff08;上&#xff09; 摘要 ​ 在本文中&#xff0c;我们会详细讨论watch侦听器的基本使用&#xff0c;并且了解vue中常用的生命周期函数、实现组件之间的数据共享&#xff0c;最后学习如何在vue3.x项目中全局配置axios。 声明&#xff1a;为了文章的清爽性&am…

流行的编程语言及其趋势

转&#xff1a;StackOverflow上的编程趋势 http://www.csdn.net/article/2013-07-08/2816144-StackOverflow-Programming-Trends 摘要&#xff1a;相信每个程序员都知道StackOverflow问答网站&#xff0c;本文作者dodgy_coder通过StackExchange Data Explorer Query收集了该网站…

CentOS7.0 安装 tomcat-9.0

2019独角兽企业重金招聘Python工程师标准>>> 1、解压 # tar -zxvf apache-tomcat-9.0.0.M4.tar.gz -C /opt/usr/local 改个名字好以后操作&#xff1a; # mv apache-tomcat-9.0.0.M4.tar.gz tomcat 2、启动&停止 # /opt/usr/local/tomcat/bin/start…

一幅长文细学华为MRS大数据开发(四)——HBase

4 HBase 摘要&#xff1a;HBase是一种非关系型数据库&#xff0c;它是基于谷歌BigTable的开源实现&#xff0c;和BigTable一样&#xff0c;支持大规模海量数据的存储&#xff0c;对于分布式并发数据处理的效率极高&#xff0c;易于扩展且支持动态伸缩&#xff0c;适用于廉价设备…

AOP技术基础

1、引言2、AOP技术基础 3、Java平台AOP技术研究4、.Net平台AOP技术研究2.1 AOP技术起源 AOP技术的诞生并不算晚&#xff0c;早在1990年开始&#xff0c;来自Xerox Palo Alto Research Lab&#xff08;即PARC&#xff09;的研究人员就对面向对象思想的局限性进行了分析。他们研…

TCP 协议的三次握手、四次分手

详细描述了 TCP 协议的连接和关闭的整个过程。解释了为什么 TCP 协议是面向连接的、可靠的数据传输协议。 TCP 在互联网上之间的通信交流&#xff0c;一般是基于 TCP (Transmission Control Protocol&#xff0c;传输控制协议) 或者 UDP (User Datagram Protocol&#xff0c;用…

[Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Discuss]Description 马上就是小苗的生日了&#xff0c;为了给小苗准备礼物&#xff0c;小葱兴冲冲地来到了商店街。商店街有n个商店&#xff0c;并且它们之间的道路构成了一…

Tiny框架2.0版火热推出

方法论 方法论决定了可以达到的高度 方法论&#xff0c;就是人们认识世界、改造世界的根本方法。 它是人们用什么样的方式、方法来观察事物和处理问题。概括地说&#xff0c;世界观主要解决世界“是什么”的问题&#xff0c;方法论主要解决“怎么办”的问题。 方法论是一种以解…

Java--Socket通信

下面内容是Java开发内容的高级知识点&#xff0c;需要对Java中的面向对象、IO、多线程、以及网络相关知识有一定的基础。(知识永远都有深度&#xff0c;本章节长期更新内容) 1、网络基础知识 网络通信的条件&#xff1a;1、两个通信的端都要有各自的IP地址作为唯一标识&#xf…

一幅长文细学华为MRS大数据开发(五)——MapReduce和Yarn

5 MapReduce和Yarn 摘要&#xff1a;本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce&#xff0c;包括MapReduce的原理、流程、使用场景&#xff0c;以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。 作者&#xff1a;来自ArimaMisaki创作…

Tensorflow从入门到精通之——Tensorflow基本操作

前边的章节介绍了什么是Tensorflow&#xff0c;本节将带大家真正走进Tensorflow的世界&#xff0c;学习Tensorflow一些基本的操作及使用方法。同时也欢迎大家关注我们的网站和系列教程&#xff1a;http://www.tensorflownews.com/&#xff0c;学习更多的机器学习、深度学习的知…

一幅长文细学Vue(七)——路由

7 路由 摘要&#xff1a;在本文中我们会谈及路由的知识点&#xff0c;了解前端路由工作的过程以及如何在Vue3中配置路由&#xff0c;知道怎么使用嵌套路由和实现动态路由匹配&#xff0c;以及使用编程式导航和导航守卫。 声明&#xff1a;为了文章的清爽性&#xff0c;在文章内…

Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)

A B C 给你N(N<30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i1]min(cost[i1],cost[i]*2) 再从后往前扫一遍cost[i]min(cost[i],cost[i1) 保证了价格的最优化 然后从0开始到30 如果二进制有当前体积的…

android baidupush

实战 QQ demo源码&#xff08;本例中有该应用&#xff09; 服务器端下载&#xff1a;http://download.csdn.net/download/knight_black_bob/9822551 android eclipse 版&#xff1a;http://download.csdn.net/download/knight_black_bob/9822553 android stdio 版本&#xff1…

jQuery源码分析--Event模块(1)

jQuery的Event模块提供了强大的功能&#xff1a;事件代理&#xff0c;自定义事件&#xff0c;自定义数据等。今天记录一下它实现的原理。 我们都知道&#xff0c;在js的原生事件中&#xff0c;有事件对象和回调函数这两样东西。但是事件对象是只读的&#xff0c;所以jQuery就用…

JSP内置对象(9个常用的内置对象)

为什么80%的码农都做不了架构师&#xff1f;>>> 2012-08-06 1.request对象 客户端的请求信息被封装在request对象中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后做出响应。它是HttpServletRequest类的实例。 序号 方 法 说 明 1 object getAttribute(S…