Vue 3简单使用
vue3的官方文档 简介 | Vue.js (vuejs.org) 对于从来没有用过vue的初学者有很多看不懂的内容。
要不看视频教程B站上有很多,或者系统的找一个电子书学习一下基础知识。
我参考了Fullstack Vue The Complete Guide to Vue.js and Friends
这本书,用例子的方式一步一步的引入vue的各种特性。
官方教程上来就用vue-cli来创建一个vue应用,模版程序里面有多个组件,但这时新手对于组件一点概念也没有,也不知道应用程序目录下的那一堆程序文件分别是什么作用。
JavaScript
2012年做web开发的时候用的还是JQuery,里面的各种快捷的操作和取元素以及结合ajax处理客户端事件操作DOM对象已经很方便了,现在看了技术发展会提供越来越多的框架和语法糖,提高开发效率,硬件配置的提升,弱化了性能的要求。JavaScript语言规范ECMAScript(ES)也有了很大的发展。
2015年完成的ES6规范提供了大量的更新,目前主流的浏览器都已经支持了。标准委员会自此每年发布一个版本。
静态网页
当一个页面要显示内容,可以在div中嵌套内容,把具体显示的内容,链接,图片都以硬编码的方式写在html中,这是最简单直接的方式,也是最不灵活的。例如:
1 | <div class="media-content"> |
响应式界面
通过数据驱动界面的显示,当数据变化了view就可以动态更新显示内容和效果。
数据模型
简单模拟数据模型,把数据定义在一个js对象中,例如Seed.js
文件中定义了一个投票数据列表,有了这个submissions数据对象,在页面上就可以直接使用submissions[i]来访问每一个数据
1 | window.Seed = (function () { |
应用程序实例
应用程序是vue应用的入口点,一个应用程序实例接受一个options对象,这个对象描述了这个实例的模版(template),数据(data),方法(methods)等属性。根应用程序实例可以和一个DOM元素绑定(mount),这个DOM元素就是它的容器。要创建一个vue的应用实例,得先在页面中引入vue.js和相关的应用js代码。
引入vue.js
<script src="https://unpkg.com/vue"></script>
html中的这句引入了最新版本的vue.js。
<script src="./main.js"></script>
这句引入了应用程序的主要代码
1 |
|
创建应用
在main.js中可以创建一个应用实例或者称为根组件
1 | const upvoteApp = { |
这里应用绑定在id名称为app的div元素上,这个div元素作为应用的容器,其中可以使用应用的数据,方法和模板。
其中upvoteApp就是应用程序根组件的options对象,这里目前定义了应用的三个属性:
- data 用来返回这个组件的数据对象,例如submissions变量返回了Seed.js中的Seed.submissions对象,在vue的表达式中就可以使用这个submissions变量。
- computed 标识这个组件计算属性,只要计算函数中的数据变化,计算就会发生,而页面中可以像使用数据变量一样使用计算对象
- components 应用程序或根组件中可以定义它里面的子组件,子组件的名称为
submission-component
,它的options对象为submissionComponent
,通过props可以把数据传递给子组件。 - methods 用来定义这个组件中支持的方法
- this 使用this可以访问这个实例的数据成员
使用数据
- 对于html标签的属性,可以使用v-bind来动态绑定vue程序的数据,例如超链接的href就可以直接使用data中的submissions对象.
v-bind
可以缩写为:
- 标签的内容可以使用Mustache
模板来使用数据变量,而这个语法可以和后端服务结合生成不同的模板
1 | <div id="app"> |
列表渲染
对于数据列表,对每一个数据都手动写html代码太繁琐了,通过使用v-for语法可以遍历数据列表中的每一个元素,通过指定唯一key来让vue使用列表的每一个对象来创建子内容。下面例子中,article标签中使用了v-for语法,所以article标签会被按列表元素重复创建,key为每一个元素的唯一标识id,和其他语言中的for each语法一样,submission是列表sortedSubmissions中的每一个元素的代称,在下面就可以使用submission遍历每一个列表项了,而不用索引。同时根据数据有多少个,就会创建多少个article,而且可以根据数据的不同每个article可以有自己的动态设置。
v-bind:class="{ 'blue-border': submission.votes>=20}"
表示当一个submission对象的votes变量的值大于20后,给article增加一个样式’blue-border’,即蓝色边框
1 | <article |
列表排序
Computed属性用来处理界面view显示的需要复杂计算的数据,在容器中可以像使用数据Data一样使用计算属性的字段。sortedSubmissions就是返回使用了JavaScript的sort排序后的submissions。
1 | computed: { |
处理事件
通过v-on:
给一个标签增加事件处理,类似原生的JavaScript的事件处理函数,只是这里可以使用vue实例对象或组件的方法作为事件处理函数。Methods属性中定义的方法只有显示调用才会执行。v-on:
可以缩写为@
<span class="icon is-small" v-on:click="upvote(submissions[0].id)">
就给这个span的内容绑定了一个click事件,当点击后,会调用vue组件的upvote()
方法,并以一个submission对象的id作为参数,这样处理函数内通过参数submissionId就知道点击了列表中的哪一个,把这个对象的投票数增加。由于vue的响应式机制,当submission.votes的变化后,computed属性的sortedSubmissions()会自动触发计算,随后,view会用最新的数据动态刷新界面
1 | methods: { |
组件
随着开发功能模块 越来越多,方便相同的代码复用,例如一个数据的列表显示在多个功能的列表显示中都会用到,就可以把数据列表显示作为一个组件。根组件下面可以使用多个子组件。
组件也是vue的实例,可以有自己的模版(html),处理逻辑(JS),样式(CSS)。
在根组件中声明它的子组件submission-component
1 | const upvoteApp = { |
然后就可以在容器中使用子组件了,通过把上面html中的每一个article的内容作为一个组件,并把定义的子组件作为article的内容。子组件中的v-bind就是子组件需要从父组件中获取的对象,在子组件中就可以使用这两个对象了。
1 | <article |
通过定义子组件的options对象submissionComponent,原来在根组件中的方法和数据可以移入子组件中,例如根组件不关心每一个分组的投票增加,所以可以把这个处理函数移入子组件中。子组件中会用到两个变量submission和submissions对象,这两个对象需要用props属性让根组件传递给子组件。
- 子组件通过props定义需要通过上一级组件传递过来的对象
- 使用v-bind把父组件的对象传递给子组件
1 | const submissionComponent = { |
通过把原来在article的内容封装在子组件中,方便代码的维护和复用。模版属性template中如果有多行字串,需要使用`来包括所有的多行字串内容。