当前位置: 首页 > news >正文

class 6: vue.js 3 组件化开发

  • 组件化开发实际上就是问题拆解,分而治之。将页面拆分为一个个小的功能块,每个功能块负责完成属于自己的独立功能,这使得整个页面的管理和维护就变得非常容易了
  • 组件化可以简化开发进程,代码复用率更高,并有利于后期维护
  • 使用Vue.createApp()函数时需要接收一个对象作为参数,改对象本质上就是一个组件,属于Vue.js 3的根组件。Vue.js 3的应用程序由一个个独立可复用的小组件构成,最终会被抽象成一颗组件树

接下来我们来注册一个全局组件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"></div><template id="my-app"><div class="comps-b"><input type="text" v-model="message"><h4> {{ message }}</h4></div><div class="comps-a"><h4>{{ title }}</h4><p>{{ desc }}</p><button @click="btnClick">按钮单击</button></div></template><script src="./js/vue.js"></script><script>const App = {template: '#my-app',data() {return {message: 'Hello World',title: '标题',desc: '内容显示区域...'}},methods: {btnClick() {console.log('按钮发生点击');}}}Vue.createApp(App).mount('#app')</script>
</body>
</html><style>.comps-a,.comps-b {border: 1px solid #999;}
</style>
  • 在Vue.js 3中,注册组件分成如下两种:
  1. 全局组件:在任何其他组件中都可以使用的组件
  2. 局部组件:只有在注册的组件中才能使用的组件

注册全局组件需要通过全局创建的Vue实例(app)来使用app.component方法,传入组件名称和组件对象来进行注册

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"></div><template id="my-app"><div class="comps-b"><input type="text" v-model="message"><h4> {{ message }}</h4></div><!-- 使用全局组件 --><component-a></component-a></template><!-- component-a 全局组件的模板 --><template id="component-a"><div class="comps-a"><h4>{{ title }}</h4><p>{{ desc }}</p><button @click="btnClick">按钮单击</button></div></template><script src="./js/vue.js"></script><script>const App = {template: '#my-app',data() {return {message: "Hello World"}}}const app = Vue.createApp(App) // 创建一个Vue实例// 用app注册一个component-a全局组件app.component('component-a', {template: '#component-a', // 引入第一步定义的模板data() {return {title: '标题',desc: '内容显示区域...'}},methods: {btnClick() {console.log('按钮发生点击');}}})app.mount('#app')</script>
</body>
</html><style>.comps-a,.comps-b {border: 1px solid #999;}
</style>
  • 上面的例子中,首先将classcomps-b<div>元素抽取到idcomponent-a的模板中;接着调用app.component方法注册一个全局组件,该方法需要接收两个参数:全局组件名称和组件对象。组件对象中的template属性绑定的是idcomponent-a的模板,该组件对象中定义了datamethods属性还定义了对应的变量和方法,可以提供给idcomponent-a的模板使用;然后把注册好的component-a组件放到根组件的模板上使用,这样就完成了一个全局组件的注册和使用
  • 这样实现的效果与最上面的全局组件实现的效果一致

也可以再提取出一个component-b全局组件来

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"></div><template id="my-app"><!-- 使用全局组件 --><component-b></component-b><component-a></component-a></template><!-- component-a 全局组件的模板 --><template id="component-a"><div class="comps-a"><h4>{{ title }}</h4><p>{{ desc }}</p><button @click="btnClick">按钮单击</button></div></template><!-- component-b 全局组件的模板 --><template id="component-b"><div class="comps-b"><input type="text" v-model="message"><h4>{{ message }}</h4></div></template><script src="./js/vue.js"></script><script>const App = {template: '#my-app'}const app = Vue.createApp(App) // 创建一个Vue实例// 用app注册一个component-a全局组件app.component('component-a', {template: '#component-a', // 引入第一步定义的模板data() {return {title: '标题',desc: '内容显示区域...'}},methods: {btnClick() {console.log('按钮发生点击');}}})// 再注册一个component-b全局组件app.component('component-b', {template: '#component-b',data() {return {message: "Hello World"}}})app.mount('#app')</script>
</body>
</html><style>.comps-a,.comps-b {border: 1px solid #999;}
</style>
  • 这也能实现相同的效果,这说明Vue.js 3中可以支持注册多个全局组件

组件是有命名规范的。推荐使用短横线隔开命名法(kebab-case),也就是a-b-c这种命名,不要出现大写字母

  • 随着项目越来越复杂,我们需要采用组件化的方式进行开发,这意味着每个组件都会有自己的模板、脚本逻辑和样式等。虽然我们可以将它们抽离到单独的JavaScriptCSS文件中,但它们依然会分离,而且引入全局作用域下的JavaScript文件很容易出现命名冲突,也不支持ES6语法的转换等
  • 为了解决上面这些问题,Vue.js 3的开发模式推荐使用.vue单文件组件(Single-File Components, SFC)来编写Vue.js组件,然后使用webpack、vite或Rollup等构建工具对其进行打包转换

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微服务--Nacos配置管理
  • axios返回的是promise对象如何处理?
  • Mysql高阶语句(1)
  • Python教程:使用 Python 和 PyHive 连接 Hive 数据库
  • HALCON 错误代码 #7709
  • 缓存分布式一致性问题
  • Golang 小项目(3)
  • 【重学 MySQL】六、MySQL 的下载、安装、配置
  • npm、yarn、pnpm小节
  • css三点闪烁(可用于加载样式、标题等)
  • AWS EC2安全组配置:轻松开放端口访问
  • DataX导入或导出hive数据
  • 小程序使用iconfont字体图标
  • 注册安全分析报告:央视网
  • 【系统架构设计师-2021年】综合知识-答案及详解
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ECS应用管理最佳实践
  • Elasticsearch 参考指南(升级前重新索引)
  • hadoop集群管理系统搭建规划说明
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Javascript 原型链
  • Java多态
  • Js基础——数据类型之Null和Undefined
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Boot快速入门(一):Hello Spring Boot
  • tab.js分享及浏览器兼容性问题汇总
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于使用markdown的方法(引自CSDN教程)
  • 判断客户端类型,Android,iOS,PC
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端技术周刊 2019-01-14:客户端存储
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微服务核心架构梳理
  • 运行时添加log4j2的appender
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • # Redis 入门到精通(一)数据类型(4)
  • #{}和${}的区别?
  • #微信小程序:微信小程序常见的配置传值
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ${ }的特别功能
  • (06)Hive——正则表达式
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (小白学Java)Java简介和基本配置
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转) ns2/nam与nam实现相关的文件
  • (转) 深度模型优化性能 调参
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net core 6.0 升8.0
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景