1.框架与库的区别?
框架是一套完整的解决方案,对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目。库提供某一个小功能,对项目的侵入性较小,如果某个库无法完成某些需求,可以很容易切换到其他库实现需求。
2.node中的mvc与前端中的mvvm是区别?
mvc是后端分层开发概念,MVVM是前端视图层的概念,主要关注于视图层的分离,也就是说MVVM把前端的视图层,分成了三部分model,view,vm viewmodel
3.业务逻辑图

4.vue知识入门
4.1安装
通过创建HTML文件,然后通过如下方式引入vue;
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
或者
<!-- 生产环境版本,优化了尺寸和速度 --> <script src="https://cdn.jsdelivr.net/npm/vue"></script>
vue.js的核心是一个允许采用简洁的模板语法来声明式将数据渲染进dom 的系统:
入门案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{message}}
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</html>
<div id="app-2">
<span v-bind:title="message">
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
var app2 = new Vue({ el: '#app-2', data: { message: '页面加载于 ' + new Date().toLocaleString() } })
这里的v-bind被称为指令,指令带有前缀v-,以表示它们是vue的特殊属性
<div id="app-3">
<p v-if="seen">你看到我来了吗</p>
</div>
var app3=new Vue({ el:'#app-3', data:{ seen:true } })
这里的v-if是选择指令,当为true时,会显示在页面上,当为false时,则没有显示
<table id="app-4">
<tr>
<td v-for="todo in todos">
{{todo.text}}
</td>
</tr>
</table>
var app4=new Vue({ el:"#app-4", data:{ todos:[ {text:'学习java'}, {text:'学习python'}, {text:'学习c++'} ]} })
上面的v-for表示循环指令,可以循环打印出内容
<div id="app-5"> {{message}}<br> <input v-model="message" type="text"/> </div> var app5=new Vue({ el:"#app-5", data:{ message:"我爱vue" } })
通过v-model来实现双向绑定,当页面输入元素时可以立马发生变化
把v-on:简化为@写法如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app1">
<button @click="hello">点击</button>
回车键事件:
<input type="text" @keyup.enter="getValue" v-model="value"/>
</div>
</body>
<script>
var app=new Vue({
el:"#app1",
data:{
},
methods:{
hello(){
alert(1);
},
getValue(){
alert(this.value);
}
}
})
</script>
</html>
实现简单的计数器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>实现简单的计数器</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app1">
<button @click="reduce">-</button>
{{count}}
<button @click="add">+</button>
</div>
</body>
<script>
var app=new Vue({
el:"#app1",
data:{
count:0
},
methods:{
reduce(){
this.count--;
},
add(){
this.count++;
}
}
})
</script>
</html>
v-show:根据真假切换元素的显示状态(true显示,false隐藏),此指令后面的表达式都会解析为布尔值,数据可以是动态的。原理是修改display的属性实现显示与隐藏。用于频繁的切换显示与隐藏。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>实现简单的计数器</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<button @click="changeStatus">按钮切换状态</button>
<span v-show="isShow">我显示啦</span>
</div>
</body>
<script>
var app=new Vue({
el:"#app",
data:{
isShow:false
},
//方法都放在这里
methods:{
changeStatus(){
this.isShow=!this.isShow
},
}
})
</script>
</html>
在v-if后面可以紧跟v-else来进行判断,和普通的if和else类似。要注意的是v-else的使用必须紧跟在v-if后面,不能单独使用。
<body>
<div id="app">
<p v-if="flag">flag为真</p>
<h1 v-else>flag为假</h1>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
flag: true,
}
})
</script>
v-bind可以用于绑定属性,就是对标签的属性进行绑定,如src,class,title等。
<body>
<div id="app">
<a v-bind:href="url">百度</a>
<img v-bind:src="imgUrl">
</div>
</body>
<script>
var app=new Vue({
el:"#app",
data:{
url:"http://www.baidu.com",
imgUrl:"http://oss.nainu.top/blog/ed101eaff4054de99e134c4408e61415.jfif"
},
})
</script>
以上的v-bind可以简写,简写的部分如下(后面的均采用简写的写法):
<a :href="url">百度</a> <img :src="imgUrl">
4.2过滤器filter
过滤器用于一些常见的文本格式化。
定义语法1:在实例化之前定义
Vue.filter(filterName,function(data,arg){ //data是要过滤的数据,arg是传递的参数,这个方法必须进行return //arg如果不需要可以省略 })
4.3侦听器watch
侦听器watch是用来监听某一数据变化的,当发生变化就会触发对应的function操作。
实例:输入两个数字,计算他们的和。只要其中的一个数字发生变化时就重新计算结果并显示
<body>
<div id="app">
<input v-model.number="one">+
<input v-model.number="two">=
<input v-model.number="result" disabled>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
one: 0,
two: 0,
result: 0
},
watch: {
//如果one发生变化就执行这个方法
one: function (newVal,oldVal) {
this.result = eval(newVal + this.two)
},
//如果two数字发生变化就执行这个方法
two: function (newVal,oldVal) {
this.result = eval(this.one + newVal)
}
}
})
</script>
实例中,v-model.number是将输入的值转化为数字,方便计算。watch来监听数据的变化,里面的’one‘代表如果one对应的数据发生变化就执行后面的这个方法,’two‘也是类似的。后面的function中有两个参数,第一个是新的值,表示的是数据的最新值(数据改变之后的值);后一个参数是旧值,表示数据改变之前的值。一般第二个参数可以省略,用不上。
4.4动画
v-enter:动画进入之前的状态
v-enter-to:动画进入完成之后的状态
v-enter-active:动画进入的时间段
v-leave:动画离开之前的状态
v-leave-to:动画离开之后的状态
v-leave-active:动画离开的时间段
实例1:点击按钮实现文字的淡出和淡入动画
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>使用过渡元素实现动画</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
/* 设置动画效果 */
/*设置动画开始和终止的状态*/
.v-enter,
.v-leave-to {
opacity: 0;/*设置透明度为0 */
}
/*设置动画的时间*/
.v-enter-active,
.v-leave-active {
transition: 1s;/*设置动画的时间*/
}
</style>
</head>
<body>
<div id="app">
<button @click="flag=!flag">动画</button>
<transition>
<h2 v-show="flag">我是一个小伙子</h2>
</transition>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
flag: false
}
})
</script>
</html>
这里使用了transition标签,这是vue自带的,可以把需要被控制动画的元素放在transition里面,然后设置相应的vue自带的css即可。
实例2:点击按钮实现文字从右到左飘入式的淡入与淡出动画
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>使用过渡元素实现动画</title>
<script src="js/vue.js"></script>
<style>
/* 设置动画效果 */
/*设置动画开始和终止的状态*/
.v-enter,
.v-leave-to {
opacity: 0;/*设置透明度为0 */
transform: translateX(200px);/*设置初始的x坐标位置*/
}
/*设置动画的时间*/
.v-enter-active,
.v-leave-active {
transition: 0.6s;/*设置动画的时间*/
}
</style>
</head>
<body>
<div id="app">
<button @click="flag=!flag">动画</button>
<transition>
<h2 v-show="flag">我是一个小伙子</h2>
</transition>
</div>
</body>
<script>
var app = new Vue({
el: '#app',
data: {
flag: false
}
})
</script>
</html>
4.5组件
定义:组件是为了拆分vue的代码量,以不同的组件来划分不同的功能模块,如果需要什么功能就去调用对应的组件即可。
组件化与模块化的区别:组件化是从UI角度进行划分的,方便代码的重用;模块化是从代码的逻辑角度划分的,方便分层开发。
4.5.1定义全局的组件
第一步:使用Vue.extend初始化组件模板对象
Vue.extend({ template:'HTML结构' })
第二步:使用Vue.compotent来定义组件
Vue.component('组件名称',组件模板对象)
注意:在定义组件名称时,有两种方法,一种是定义为驼峰式的,另一种就是定为非驼峰式的。对于非驼峰式的,在第三步中就原样使用;对于驼峰式的,在第三步中要把每个单词的大写变成小写,并且单词之间使用'-'连接。
第三步:在body中把组件名称作为html标签的形式来使用组件
<组件名称></组件名称>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>定义组件</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 组件名称是非驼峰式的使用 -->
<mycom1></mycom1>
<!-- 组件名称是驼峰式的使用 -->
<my-com1></my-com1>
</div>
</body>
<script>
// 1.使用Vue.extend初始化组件模板对象
var com1 = Vue.extend({
template:'<h1>我是一个组件</h1>'
})
//2.定义组件
// 组件名称是非驼峰式
Vue.component('mycom1',com1)
// 组件名称是驼峰式
Vue.component('myCom1',com1)
var app = new Vue({
el: '#app',
})
</script>
</html>
经过简化后常用的格式如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>定义组件的第一种方式</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<mycom1></mycom1>
</div>
<!-- 给模板指定id -->
<template id="temp">
<h1>这是一个组件</h1>
</template>
</body>
<script>
//定义组件
Vue.component('mycom1',{
// 使用模板的id
template:'#temp'
})
var app = new Vue({
el: '#app',
})
</script>
</html>
4.5.2多个组件之间的切换
实例1:使用v-if和v-else实现点击登录显示登录页面,点击注册显示注册页面的例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>不同组件之间的切换</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
.login{
width: 200px;
height: 100px;
background-color: burlywood;
}
.register{
width: 200px;
height: 100px;
background-color:coral;
}
</style>
</head>
<body>
<div id="app">
<a href="javascript:void(0)" @click="flag=true">登录</a>
<a href="javascript:void(0)" @click="flag=false">注册</a>
<login v-if="flag"></login>
<register v-else="flag"></register>
</div>
<template id="temp1">
<div class="login">
<h1>我是登录页面</h1>
</div>
</template>
<template id="temp2">
<div class="register">
<h1>我是注册页面</h1>
</div>
</template>
</body>
<script>
Vue.component('login', {
template: '#temp1',
})
Vue.component('register', {
template: '#temp2',
})
var app = new Vue({
el: '#app',
data: {
flag: true
}
})
</script>
</html>
4.6路由
后端路由:所有的URL请求地址都对应着服务器上的资源,那么这些URL就是后端路由。
前端路由:对于单页面程序,主要通过URL中的hash(#)的改变来实现不同页面之间的切换,就叫做前端路由。hash的一个特点是http请求中不包含hash相关的内容。
第一步:导入vue-router.js
<script src="js/vue-router.min.js"></script>
在导入js后就有了一个叫做VueRouter的全局的路由构造函数。
在vue-cli中的导入方式
import Vue from 'vue' import vueRouter from 'vue-router' vue.use(vueRouter)
第二步:定义两个组件模板对象
// 组件模板对象 var login={ template:'<h1>登录组件</h1>' }
第三步:创建vueRouter对象
在创建对象时,可给构造函数传递一个配置对象。这个配置对象中有routes属性,表示路由匹配规则。它是一个数组,里面可以放多个匹配规则,每个匹配规则都是一个对象,此对象有两个必要的属性path和component。其中path表示监听的路由链接地址,component表示对应path的组件模板对象。
var vueRouterObj=new VueRouter({ routes:[ {path:'路由地址',component:组件模板对象} ] })
第四步:把路由规则对象注册到vm实例
router: vueRouterObj
作用是监听URL的变化,展示对应的组件。
第五步:添加router-view标签进行占位
<router-view></router-view>
第六步:添加两个a标签进行测试
vue-router中提供了一种标签,可以替代a标签,它就是router-link,下面添加了一个,标签点击登录去请求/login链接。
<router-link to="/login">登录</router-link>
对于router-link,它的默认值是<a>标签,也可以换成其他的标签,使用tag属性指定即可。如指定为按钮:<router-link to="/login" tag="button">登录</router-link>。
router-link标签还有一个属性replace,禁止浏览器中的→和←的操作。<router-link to="/login" replace>登录</router-link>。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路径的基本使用</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!-- 导入vue-router -->
<script src="vue-router.min.js"></script>
</head>
<body>
<div id="app">
<!-- router-link默认是一个a标签 -->
<router-link to="/login" >登录</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
</div>
</body>
<script>
// 组件模板对象
var login={
template:'<h1>登录组件122</h1>'
}
var register={
template:'<h1>注册组件</h1>'
}
var vueRouterObj=new VueRouter({
routes:[
{path:'/login',component:login},
{path:'/register',component:register}
]
})
var app = new Vue({
el: '#app',
router: vueRouterObj
})
</script>
</html>