大家现在已经学了最基础的前端开发的三件套:HTML+CSS+JS。对如何开发前端有了一定的了解,但是距离形成一个真正的网站还有一定的距离,本次课程将介绍一个前端开发的框架:vue.js框架
vue.js官网:https://cn.vuejs.org/
vue.js是一套用于构建用户界面的渐进式框架。vue被设计为可以自底向上逐层应用。vue的核心只关注视图层。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
document.getElementById("")的方式来更改,这样使得我们的网页不是动态响应,而vue是基于数据绑定的,即我们不需要操作DOM就可以更改页面数据,我们要做的就是将js变量和页面元素进行绑定,从而我们更改了js变量,页面的数据也会发生相应的改变。vue是单页面应用,在基于vue.js的网站中,你所看到的每个页面其实是由一个后缀为.vue的文件渲染出来的,在不同的页面之间切换的时候其实把不同的.vue文件渲染出来的结果。
这里我们以uniapp创建的模板来说明框架的文件目录:
关于如何用uniapp创建一个小项目请参见:https://www.limfx.pro/readarticle/719/uniapp-cai-keng-ji-lu
public:public中有一个index.html文件,这是一个模板文件,作用是生成项目的入口文件,我们浏览器访问项目的时候会默认打开这个文件。index.html的内容:
之前谈到了vue是单页面应用,所有.vue的内容会被渲染成html插入到id为“app”的div中,如上图红色框框住的地方,也就是我们不同页面的切换,其实是这个div内的内容的切换。
src:这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:
static: 静态文件目录,放置一些图片和字体,如logo等,或者是我们下载的css库之类的。
pages: 不同的页面的.vue文件会放在这里。
components:组件的.vue文件会放在这里。
App.vue: 项目入口文件。
main.ts: 项目的核心文件,一般会在这里进行一些全局的功能配置。这里的.ts文件是typescript文件,TypeScript是JavaScript类型的超类,它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计算机和任何操作系统上运行,并且是开源的。两者在语法上非常类似。vue+ts相比vue+js使用起来更加方便。
package.json:项目配置文件,json格式,里面写明了你的项目安装了哪些包的名称和版本号。在该文件的目录下用命令行执行npm install,然后就会根据文件中的包名和版本号为你安装“包”,并生成node_modules文件夹。node_modules文件夹一般比较大,为了减小整个项目的体积,在与别人交流的时候,会把node_modules文件夹删掉,这样传给别人后,别人直接执行npm install就能把包给安装上。
pages.json:页面配置文件。所有的page需要在这个文件里面注册。
这里我们可以看到第一个page是的路径是index.vue这个文件,也就是项目的首页是这个index.vue渲染出来的页面。
xxx.config.xxx:有类似名字的一般为配置文件,在这里不细讲,一般不做更改,后面遇到了要改的情况再说。
.vue文件vue是单页面应用,无论是页面还是组件都是写成.vue文件的形式,一个.vue的文件包含:
<template>
//页面/组件的模板部分
</template>
<script lang="ts">
import Vue from 'vue';
import { Component } from 'vue-property-decorator';
@Component({})
export default class XXX extends Vue {
//ts代码写在这里
}
</script>//ts的部分用来写页面/组件的逻辑
<style>//样式表,用来写页面/组件的样式
</style>我们从上面的.vue文件中可以看到,我们每个页面/组件的模板、逻辑、样式都是封装在一起的,即不同.vue文件之间是分离开来的,这样的好处是在开发的过程中我们只需要关注.vue文件,即视图层,开发网站可以看做是搭积木一样,把不同.vue文件搭在一起就可以构成一个网页,当然这些.vue文件之间是需要建立联系的。
我们先来看看在一个.vue文件内部各部分是如何配合的:
在<script></script>中的前两行import xxx from xxx是导入模块或其他组件到这个.vue文件中来。@Components({})这个是vue+ts中的装饰器,每个.vue文件最好都加一个这个,具体有什么用,后面再说。
数据绑定:这里以uniapp创建的模板来举例子。
<template>
<view>
<cu-custom bgColor="bg-gradual-blue" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">导航栏</block>
</cu-custom>
<text>{{ text }}</text>
</view>
</template>
<script lang="ts">
import Vue from 'vue';
import { Component } from 'vue-property-decorator';
@Component({})
export default class index extends Vue {
text:string = 'I love limfx';
}
</script>
<style>
</style>现在有一个名为text的变量,它的类型是string,这里是ts的定义变量的语法:
text:string = 'I love limfx' //变量名:类型 = 值在模板中我们可以用两个花括号将变量名括起来来代替变量的值:
{{ text }}结果如下图:
只要我们改变了变量text的值就可以改变在页面中的显示。
除了花括号的这种形式,还有表单类的元素,可以用v-model:
<template>
<view>
<cu-custom bgColor="bg-gradual-blue" :isBack="true">
<block slot="backText">返回</block>
<block slot="content">导航栏</block>
</cu-custom>
请输入内容:<input style="border: groove orange;" v-model="text" @input="inputEvent"></input>
<text>{{ inputValue }}</text>
</view>
</template>
<script lang="ts">
import Vue from 'vue';
import { Component } from 'vue-property-decorator';
@Component({})
export default class index extends Vue {
text:string = '';
inputValue:string = '';
inputEvent() {
this.inputValue = this.text;
}
}
</script>
<style>
</style>我写了一个输入框,在输入框里输入的内容与变量text绑定起来,然后在输入框下面有变量inputValue,当我在输入框里输入的时候,我直接将text的值赋予了inputValue,那么输入框下面的文本会同步变化。
此外还有其他的指令:v-if、v-else、v-show、v-html,都比较常用,使用方法也差不多,可自行去了解。
函数:
函数的声明比较简单:
func(param1:type,param2:type,...):type{
...
return XXX;
}
//for example
login(username:string, password:string):boolean {
var islogin;
if(username=="123" && password=="123"){
islogin = true;
}else{
islogin = false;
}
return islogin;
}
var loginState = login("123", "123");
console.log(loginState);
//结果为true这个函数就是有两个都是string类型的参数,返回值也是string类型
关于事件响应调用相应的函数,比如说按按钮、输出、聚焦的时候调用函数:
<input @input="inputEvent"></input>//输入的时候调用inputEvent()函数
<input @blur="blurEvent"></input>//聚焦的时候调用blurEvent()函数
<button @click="clickEvent"></input>//点击的时候调用clickEvent()函数
......//还有很多其他的事件需要注意的是,在script中调用变量的时候需要用:this.变量名的形式调用,具体可以参考我之前的代码,在函数内定义的局部变量则不需要,可以直接调用。
现在我创建一个登录的组件login:
注意到这个@Prop()代表该组件的属性,即可以由外部直接赋予。
现在我要在index中调用这个组件:
注意我框起来的部分,首先你得需要import你要调用的组件,然后在@Components({})中注册该组件,然后你就可以将login作为标签使用:<login></login>来直接向index中插入我们的组件,效果如上图所示。
现在我想向login组件中传递数据,之前说过了我们设置了两个属性,现在我们在index中向login中传递数据:
你看现在账号密码显示出来了我们传递的值了,注意到一点我在通过属性传值的过程中用的是:
<login :userName="userNameData" :passWord="passWordData"></login>在属性前加了个冒号,这代表后面的引号中的内容是变量名而不是字符串,这个其实等效于:
<login userName="hhh" passWord="123456"></login>如果不加冒号的话,结果会是怎么样的呢,可以在下方评论回答。
更多组件之间通信的操作我们下一次再详细介绍。
作业
根据我上面的所讲的内容做一个小demo,尝试一下上面的代码(不局限于我写的,可以是自己找的一些验证vue语法,不过得是vue+ts的)并写一个简单的小报告(就把你的代码和结果附上并做简要说明),本周日前交。