视频地址:第一谈:企业案例实战讲解Vue2&Vue3_哔哩哔哩_bilibili
项目实战 - SpringBoot结合Vue2.x群统计项目_哔哩哔哩_bilibili
课前所需工具
相关工具和文档
官网
官网:Vue.js
v2文档:介绍 — Vue.js
v3文档:介绍 | Vue.js
vscode工具下载
Visual Studio Code - Code Editing. Redefined
hbuilder工具下载
idea开发工具
IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains
vue2.x下载
CDN
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
npm
npm install vue
axios下载
npm install axios
下载jquery
npm intall jquery@1.12.4
vue3下载
npm install vue@next
Vue课程目标
课程目标1
1、了解VUEJS作用及MVVM框架
2、掌握VUEJS中常用指令
3、了解VUEJS的生命周期
4、掌握VUEJS中通过AXIOS完成异步请求
5、计算属性Computed
6、完成实战开发—SpringBoot搭建ssm和Vue实现学相伴统计项目开发
课程目标2
1、Vue的高级编程-组件Component开发
1-1、Props
1-2、槽点solt
2、Vue的高级编程-过滤器Filter
3、Vue的高级编程-指令Directive
4、Vue的高级编程-混入mixin
5、Vue的高级编程-响应式属性Set编译
6、Vue的高级编程-继承extend
7、Vue的高级编程-动态编译Compile
8、Vue的高级编程-动画aniamte和transition使用
9、实战开发、自定义组件-模拟完成elementui或者antd的组件组件和按钮组件
课程目标3
1、Vue的路由管理vue-router
2、Vue的状态管理vuex
3、Vue-cli项目的搭建和自定义组件的定义和融合
4、Axios的框架的在认识和项目的结合重构
5、项目实战开发:使用elementui或者vue-admin-ui完成实战开发统计数据后台管理
课程目标4
1、反思vue的本质和核心是什么
2、反思vue和我们学习的js/css/html/jquery有什么关联
3、如果看待其他的框架react/angularjs
4、如何看待微信小程序和uniapp
课程目标5
后记
什么是Vue
引文来自官方:深入响应式原理 — Vue.js
参考:介绍 — Vue.js
01、Vue2.x的概述
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架
。
与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
02、理解vue的核心理念1
那么,怎样理解什么是渐进式框架?在这之前,我们首先要理解什么是框架.在最初的前端开发中,为了完成某个功能,我们需要通过js在HTML页面中获得dom节点,随后获得dom节点中的文本内容或者在dom节点上添加事件,进行一系列的程序操作,但是,如果任务量很大的情况下,代码会随着业务的增加而变得臃肿和混乱,在现实的开发中,负责的逻辑和巨大的开发量,是原生js无法完成的.
这个时候,开发人员将js代码分为了三个板块,数据(Model),逻辑控制(*),视图(View),数据板块只负责数据部分,视图板块负责更改样式,逻辑控制负责联系视图板块和数据板块,这样子有很大的好处,当需求发生变动时,只需要修改对应的板块就好
这种开发模式,就是所谓的MV结构,我们现在了解的MVC,MVP,MVVM都是MV的衍生物,对比这几种框架模式,我们会总结出来一个本质的特点,那就是这些开发模式都是让视图和数据间不会发生直接联系.对比用原生JS获得dom的操作,你会发现原生dom流其实是将dom作为数据,从dom中获得Model,随后又更改dom来实现更新视图,视图和模型其实混在一起,所以代码自然混乱,不易维护.
在具有响应式系统的Vue实例中,DOM状态只是数据状态的一个映射 即 UI=VM(State) ,当等式右边State改变了,页面展示部分UI就会发生相应改变。很多人初次上手Vue时,觉得很好用,原因就是这个.不过,Vue的核心定位并不是一个框架,设计上也没有完全遵循MVVM模式,可以看到在图中只有State和View两部分, Vue的核心功能强调的是状态到界面的映射,对于代码的结构组织并不重视, 所以单纯只使用其核心功能时,它并不是一个框架,而更像一个视图模板引擎,这也是为什么Vue开发者把其命名成读音类似于view的原因。
上文提到,Vue的核心的功能,是一个视图模板引擎,但这不是说Vue就不能成为一个框架。如下图所示,这里包含了Vue的所有部件,在声明式渲染(视图模板引擎)的基础上,我们可以通过添加组件系统、客户端路由、大规模状态管理来构建一个完整的框架。更重要的是,这些功能相互独立,你可以在核心功能的基础上任意选用其他的部件,不一定要全部整合在一起。可以看到,所说的“渐进式”,其实就是Vue的使用方式,同时也体现了Vue的设计的理念.
03、理解vue的核心理念2
先了解一下前端开发模式的发展。
静态页面
最初的网页以HTML为主,是纯静态的网页。网页是只读的,信息流只能从服务的到客户端单向流通。开发人员也只关心页面的样式和内容即可。
异步刷新,操作DOM
- 1995年,网景工程师Brendan Eich 花了10天时间设计了JavaScript语言.
随着JavaScript的诞生,我们可以操作页面的DOM元素及样式,页面有了一些动态的效果,但是依然是以静态为主。 - ajax盛行:
- 2005年开始,ajax逐渐被前端开发人员所重视,因为不用刷新页面就可以更新页面的数据和渲染效果。
- 此时的开发人员不仅仅要编写HTML样式,还要懂ajax与后端交互,然后通过JS操作Dom元素来实现页面动态效果。比较流行的框架如Jquery就是典型代表。——jquery—-ajax—-js——jquery全部所有浏览器的兼容性问题。
MVVM,关注模型和视图
- M:即Model,模型,包括数据和一些基本操作
- V:即View,视图,页面渲染结果
- VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)—-vue
在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。
而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:
- 只要Model发生了改变,View上自然就会表现出来。
- 当用户修改了View,Model中的数据也会跟着改变。
把开发人员从繁琐的DOM操作中解放出来,把关注点放在如何操作Model上。
而今天要学习的,就是一款MVVM模式的框架:Vue
好处:数据和视图分离,便于维护和升级。
04、小结
Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象
。而当你修改它们时
,视图会进行更新
。这使得状态管理非常简单直接。好处就是:数据和视图分离,便于维护和升级。
创建一个 Vue 实例
01、vue2.x下载和安装
CDN
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
npm
npm install vue
02、创建一个vue实例
一个 Vue 应用由一个通过 new Vue 创建的根 Vue 实例,如下:
var vm = new Vue({
# 挂载目标
el:"#app",
// 数据模型
data:{},
// 生命周期
created: function () {
// `this` 指向 vm 实例
console.log('a is: ' + this.a)
},
// 事件定义
methods:{
}
})
Vue模板语法-插入值表达式
官网参考:模板语法 — Vue.js
01、目标
数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值
02、插入值的方式
- { {data中的key} }
- v-bind:属性=”data中的key”
模板语法
<span>Message: { { msg } }</span>
它也支持
{ { number + 1 } }
{ { ok ? 'YES' : 'NO' } }
{ { message.split('').reverse().join('') } }
<div v-bind:id="'list-' + id"></div>
VueJs指令:v-on:click
官网参考:事件处理 — Vue.js
01、目标
目标掌握vuejs的点击事件
02、语法
v-on:click="事件名(定义在methods)"
@click="事件名(定义在methods)"
03、具体实现如下
双击:demo03.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>VueJs指令:v-on:click</title>
</head>
<body>
<div id="app">
<h1>{ {title} }</h1>
<button v-on:click="clickme()">点我</button>
<button @click="clickme()">@点我</button>
</div>
<script src="js/vue.min.js"></script>
<script>
var vue = new Vue({
el:"#app",
data:{
title:"VueJs指令:格式: v-on:事件类型"
},
//一系列事件定义的位置,这个固定名字。
methods:{
clickme:function(){
alert("点我了,触发我了...")
}
}
});
</script>
</body>
</html>
04、思考问题:事件的作用?
05、小结
1:v-on:事件类型(click,mouseenter) =”事件名”.
事件名必须定义在methods中。以key:value的方式存在
2:v-on在vuejs有简写。@事件类型=“事件名”
VueJs指令:v-on:keydown
官网参考:事件处理 — Vue.js
01、目标
目标掌握键盘按下事件
02、语法
v-on:keydown="事件名(定义在methods)"
@keydown="事件名(定义在methods)"
03、具体实现如下
双击:demo04.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>VueJs指令:v-on:keydown</title>
</head>
<body>
<div id="app">
<textarea name="" cols="30" rows="10" maxlength="140" id="content" @keyup="inputcontent" @keydown="inputcontent">
</textarea>
<span>你可以输入{ {size} }字</span>
</div>
<script src="js/vue.min.js"></script>
<script>
var vue = new Vue({
el:"#app",
data:{
content:"",
size:140,
},
methods:{
inputcontent:function(){
// 1: 获取每次用户输入的值
var cnt = document.getElementById("content").value;
// 2: 用140减去用户输入内容的长度就得到还可以输入的字数。
this.size = 140 - cnt.length;
}
}
})
</script>
</body>
</html>
04、效果如下
05、小结
获取键盘码使用的是event的那个方法? keyCode
VueJs指令:v-on:mouseover & mouseleave
官网参考:事件处理 — Vue.js
01、目标
掌握鼠标悬停事件
02、语法
v-on:mouseover="事件名(定义在methods)"
@mouseover="事件名(定义在methods)"
03、具体实现如下
双击:demo04.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>VueJs指令:v-on:mouseenter</title>
<style>
#divbox{transition: 1s;}
</style>
</head>
<body>
<div id="app">
<div id="divbox" @mouseenter="enter" @mouseleave="outer">我是以div,鼠标移动进来会可以效果哦</div>
</div>
<script src="js/vue.min.js"></script>
<script>
var vue = new Vue({
el:"#app",
data:{
},
methods:{
enter:function(){
console.log(1);
document.getElementById("divbox").style.background = "red";
document.getElementById("divbox").style.color = "#fff";
document.getElementById("divbox").style.fontSize = "24px";
},
outer:function(){
console.log(2);
document.getElementById("divbox").style.background = "green";
document.getElementById("divbox").style.color = "#fff";
document.getElementById("divbox").style.fontSize = "14px";
}
}
})
</script>
</body>
</html>
04、效果如下
鼠标进入的效果:mouseenter
鼠标离场的效果:mouseleave
VueJs指令:v-on:事件修饰符
官网参考:事件处理 — Vue.js
01、目标
掌握事件指令v-on事件操作符应用场景
02、概述
在事件处理程序中调*用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。
为了解决这个问题,Vue.js 为 v-on
提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。
.stop
:阻止事件冒泡.prevent
:阻止默认事件发生.capture
:使用事件捕获模式.self
:只有元素自身触发事件才执行。(冒泡或捕获的都不执行).once
:只执行一次
03、具体实现如下
双击:demo06.html
.prevent
:阻止默认事件发生
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<form action="index.jsp" method="get">
<p>用户:<input type="text"></p>
<p>密码:<input type="password"></p>
<input type="submit" @click.prevent="login" value="提交">
<button @click.prevent="login">提交2</button>
<a href="http://www.baidu.com" @click.prevent="tologin">点我去百度</a>
</form>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
login:function(){
alert(1);
},
tologin:function(){
alert("点我了...")
}
}
})
</script>
</body>
</html>
真实案例解决a连接锚点置定问题:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<p>sdfsdf</p>
<a href="#" @click.prevent="loadmore">加载更多</a>
<a href="javascript:void(0);" @click="loadmore">加载更多</a>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
loadmore:function(){
alert("加载点我了....");
}
}
})
</script>
</body>
</html
04、小结
事件修饰符的作用是什么? 简化开发
VueJs指令:v-on:按键修饰符
官网参考:事件处理 — Vue.js
01、目标
掌握v-on的按键修饰符
02、概述
Vue 允许为 v-on 在监听键盘事件时添加按键修饰符
全部的按键别名:
.enter(enter键)
.tab (Tab键)
.delete (捕获 “删除” 和 “退格” 键)
.esc (退出键)
.space(空格键)
.up (向上)
.down(向下)
.left(向左)
.right(向右)
.ctrl
.alt
.shift
.meta
注意:在 Mac 系统键盘上,meta 对应 command 键 (⌘)。在 Windows 系统键盘 meta 对应 Windows 徽标键 (⊞)。在 Sun 操作系统键盘上,meta 对应实心宝石键 (◆)。在其他特定键盘上,尤其在 MIT 和 Lisp 机器的键盘、以及其后继产品,比如 Knight 键盘、space-cadet 键盘,meta 被标记为“META”。在 Symbolics 键盘上,meta 被标记为“META”或者“Meta”。
非上面的键码参考ascii码表:
03、具体实现如下
双击:demo07.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<form action="index.jsp" method="get">
<p>用户:<input type="text"></p>
<p>密码:<input type="password" placeholder="请输入enter提交" @keydown.enter="tologin"></p>
<p>密码:<input type="password" placeholder="请输入enter提交" @keydown.13="tologin"></p>
<p>密码:<input type="password" placeholder="请输入ctrl+enter提交" @keydown.ctrl.enter="tologin"></p>
<!-- <input type="submit" @click.stop.prevent="tologin" value="提交">-->
</form>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
tologin:function(){
alert("我去提交登录表单了....")
}
}
})
</script>
</body>
</html>
04、小结
按键修饰符有哪些?请说出三个 enter space tab delete
VueJs指令:v-text与v-html
官网参考:API — Vue.js
官网参考:API — Vue.js
01、目标
掌握文本输出与样式渲染输出
提示:v-text不支持标签解析,v-html支持标签解析
02、具体实现如下
双击:demo07.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<h1>{ {content} }</h1>
<hr/>
<h1 v-text="content"></h1>
<h1 v-html="content"></h1>
<hr/>
<h1>{ {price + num} }</h1>
<h1>{ {price - num} }</h1>
<h1>{ {price * num} }</h1>
<h1>{ {price / num} }</h1>
<h1>{ {price % num} }</h1>
<hr/>
<h1 v-text="price + num"></h1>
<h1 v-text="price - num"></h1>
<h1 v-text="price * num"></h1>
<h1 v-text="price / num"></h1>
<h1 v-text="price % num"></h1>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue v-text v-html指令
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
content:"<strong style='color:green'>我太帅了,被自己迷倒了....</strong>",
price:11.2,
num:11
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
}
});
</script>
</body>
</html>
04、小结
v-html/v-text 它也可以达到也{ {} }插值表达式类同的效果
VueJs指令:v-bind
官网参考:API — Vue.js
01、目标
掌握绑定html标签的属性值
提示:{ {} } 是不能直接使用在属性上,需要借助v-bind指令来解决此问题!
02、具体实现如下
双击:demo07.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<div v-bind:title="content">{ {content} }</div>
<!--可以简化成-->
<div :title="content">{ {content} }</div>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
content:"我太帅了,太迷人了..."
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
}
})
</script>
</body>
</html>
04、小结
1、{ {} } 是不能直接使用在属性上,需要借助v-bind指令来解决此问题!
2、v-bind: 可以简写成什么? :
VueJs指令:v-bind-Class 与 Style 绑定
参考网址:Class 与 Style 绑定 — Vue.js
01、概述
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
02、:class具体实现
02-1、对象语法
我们可以传给 v-bind:class 一个对象,以动态地切换 class:
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
></div>
数据层
data: {
isActive: true,
hasError: false
}
结果渲染
<div class="static active"></div>
02-2、数组语法
我们可以把一个数组传给 v-bind:class,以应用一个 class 列表
视图层:
<div v-bind:class="[activeClass, errorClass]"></div>
#如果你也想根据条件切换列表中的 class,可以用三元表达式:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
数据层
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
结果渲染
<div class="active text-danger"></div>
02、:style具体实现
02-1、对象语法
v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:
视图层:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
#或者直接绑定到一个样式对象通常更好,这会让模板更清晰:
<div v-bind:style="styleObject"></div>
数据层
data: {
activeColor: 'red',
fontSize: 30,
styleObject: {
color: 'red',
fontSize: '13px'
}
}
03、多重值
从 2.3.0 起你可以为 style 绑定中的 property 提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex。
案例分析:
VueJs指令:v-model
官网参考:API — Vue.js
01、目标
掌握model的值绑定
02、具体实现如下
双击:demo07.html
如果参数不多的情况下使用如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model指令</title>
</head>
<body>
<div id="app">
<form action="index.jsp" method="get">
<p>用户:<input type="text" v-model="username"></p>
<p>密码:<input type="password" v-model="password"></p>
<input type="submit" @click.prevent="login" value="提交">
<p>你输入的值是:{ {username} } == { {password} }</p>
</form>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
// v-model: 它含义:双向数据绑定,改变视图会改变数据,改变数据会改变视图。
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
username:"",
password:""
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
login:function(){
var username = this.username;
var password = this.password;
console.log("用户输入的账号和密码是:",username,password);
}
}
})
</script>
</body>
</html>
如果参数过多建议使用对象包裹:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model指令</title>
</head>
<body>
<div id="app">
<form action="index.jsp" method="get">
<p>用户:<input type="text" v-model="user.username"></p>
<p>密码:<input type="password" v-model="user.password"></p>
<input type="submit" @click.prevent="login" value="提交">
<p>你输入的值是:{ {user.username} } == { {user.password} }</p>
</form>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
// v-model: 它含义:双向数据绑定,改变视图会改变数据,改变数据会改变视图。
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
//js对象可以动态扩展属性
user:{}
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
login:function(){
var username = this.user.username;
var password = this.user.password;
console.log("用户输入的账号和密码是:",username,password);
}
}
})
</script>
</body>
</html>
04、小结
v-model绑定的是什么? Model |
v-model与v-bind的区别是什么? bind绑定的标签的属性 |
如果参数多个用什么方式处理:对象 |
VueJs指令:v-for
官网参考:API — Vue.js
v-for参考:列表渲染 — Vue.js
01、目标
掌握迭代数组 |
---|
掌握迭代对象 |
掌握迭代对象数组 |
02、具体实现如下
双击:demo07.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model指令</title>
</head>
<body>
<div id="app">
<h1>普通数据类型</h1>
<h1>{ {title} }</h1>
<h1>{ {num} }</h1>
<h1>{ {flag} }</h1>
<hr>
<h1>对象取值</h1>
<p>{ {user.id} }</p>
<p>{ {user.name} }</p>
<p>{ {user.age} }</p>
<hr>
<h1>数组</h1>
<p>{ {users[0]} }</p>
<p>{ {users[1]} }</p>
<p>{ {users[2]} }</p>
<h1>v-for循环---数组对象</h1>
<div v-for="(user,index) in users">
<p>{ {index + 1} }:{ {user.id} } == { {user.name} }==={ {user.age} }</p>
</div>
<hr/>
<hr>
<h1>v-for循环---数组</h1>
<div v-for="(f,index) in friends">
{ {f} }
</div>
<hr>
<h1>v-for循环---对象</h1>
<div v-for="(key,value) in user">
{ {value} }==={ {value} }
</div>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
// v-model: 它含义:双向数据绑定,改变视图会改变数据,改变数据会改变视图。
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
title:"我太帅了",
num:10,
flag:true,
// 数组
friends:["张三","李四","wangwu"],
// 对象
user:{
id:1,
name:"张三",
age:34
},
// 对象数组
users:[
{
id:1,
name:"张三1",
age:31
},
{
id:2,
name:"张三2",
age:32
},
{
id:3,
name:"张三3",
age:33
}
]
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
}
})
</script>
</body>
</html>
03、小结
<div v-for="(a,b) in arr"> 这个迭代数组中,a和b 那个代表数组的索引? b
所以建议命名规范是很重要的事情 |
VueJs指令:v-if与v-show
官网参考:API — Vue.js
官网参考:API — Vue.js
01、目标
掌握如何隐藏一个页面中的元素
02、具体实现如下
双击:demo07.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model指令</title>
</head>
<body>
<div id="app">
<h1>用户编号:{ {user.id} }</h1>
<h1>用户名字:{ {user.name} }</h1>
<h1>用户性别:</h1>
<h1 v-if="user.male==0">女</h1>
<h1 v-if="user.male==1">男</h1>
<h1 v-if="user.male==2">保密</h1>
<hr>
<h1 v-if="user.male==0">女</h1>
<h1 v-else-if="user.male==1">男</h1>
<h1 v-else-if="user.male==3">男</h1>
<h1 v-else>保密</h1>
<hr>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
// v-model: 它含义:双向数据绑定,改变视图会改变数据,改变数据会改变视图。
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
user:{
id:1,
name:"张三",
male:2 // 1 男 0 女 2 保密
}
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
}
})
</script>
</body>
</html>
v-if和v-show的区别
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-model指令</title>
</head>
<body>
<div id="app">
<div v-if="flag">v-if我显示了</div>
<div v-show="flag">v-show我显示了</div>
<button @click="changeFlag">点击改变flag</button>
</div>
<script src="js/vue.min.js"></script>
<script>
// 1 : 实例化vue
// v-model: 它含义:双向数据绑定,改变视图会改变数据,改变数据会改变视图。
var vue = new Vue({
// 2 : 指定渲染的范围
el:"#app",
// 3 :数据定义的位置也就是Model
data:{
flag:true
},
// 4: 事件定义的位置,@事件类型="事件名"
methods:{
changeFlag:function(){
// 设定开关
this.flag = !this.flag;
/* if(this.flag){
this.flag = false
}else{
this.flag = true;
}*/
}
}
})
</script>
</body>
</html>
03、小结
v-if 是 根据值是否渲染页面元素 还是 根据值切换元素的display css属性? 是否渲染页面元素 |
v-show 是 根据值是否渲染页面元素 还是 根据值切换元素的display css属性?切换元素的display css |
VueJs指令总结
01、目标
掌握常用vue指令
获取值得方式是:{ {} } 插值表达式,支持四则运算。
1:文本指令:v-html / v-text 和插值表达式,名字也必须定义在data中。
2:事件指令:v-on:click=”事件名”,缩写:@click=”事件名”,注:事件名定义在:methods中
3:属性指令:v-bind:属性名=”data的key” 缩写 : 属性名=”data的key” .注意动静拼接的问题
4:控制指令:v-model=”data的key”,用于获取form控制元素的值。如果的多余3个建议使用对象去定义和获取
5: 循环指令:v-for =”(obj,index) inf data中定义数组的名字” 。
6:条件指令:v-if / v-else-if /v-else 注意中间不能出现标签,否则会出现断层。
7:显示指令:v-show 控制元素的隐藏和显示。(鼠标事件 + v-show /v-if选项卡)
02、小结
VueJs的生命周期
官网参考:Vue 实例 — Vue.js
01、目标
VueJs的生命周期
02、概述
掌握它的生命周期是为了用它的生命周期的方法:一共8个,两两一组
这些方法不用我们触发,都是由vue自己触发的方法,知道这些方法的调用时机就可以了
创建时期:beforeCreate created
挂载时期:beforeMount mounted
更新时期:beforeUpdate updated
死亡时期:beforeDestory destoryed
方法和时期的作用
你可以在这些方法中,去变更data的数据,vuejs会把你修改的数据进行渲染。
03、图解
04、核心代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>生命周期</title>
<script src="js/vue.min.js"></script>
</head>
<body>
<div id="app">
{ {message} }
<button @click="changeupdate">更新数据</button>
</div>
<script>
var vm = new Vue({
el : "#app",
data : {
message : 'hello world',
users:[]
},
methods:{
changeupdate:function(){
this.message = "4";
}
},
beforeCreate : function() {
console.log(this);
showData('创建vue实例前', this);
},
created : function() {
// 在这个阶段可以修改
this.message = "1.";
showData('创建vue实例后', this);
},
// 替换和编译阶段
beforeMount : function() {
this.message="2";
showData('挂载到dom前', this);
},
mounted : function() {
// 这里有一个问题?
this.message = "3";
showData('挂载到dom后', this);
},
beforeUpdate : function() {
showData('数据变化更新前', this);
},
updated : function() {
showData('数据变化更新后', this);
},
beforeDestroy : function() {
showData('vue实例销毁前', this);
},
destroyed : function() {
showData('vue实例销毁后', this);
}
});
function realDom() {
console.log('真实dom结构:' + document.getElementById('app').innerHTML);
}
function showData(process, obj) {
console.log(process);
console.log('data 数据:' + obj.message)
console.log('挂载的对象:')
console.log(obj.$el)
realDom();
console.log('------------------')
console.log('------------------')
}
// 忘记注释
vm.message = "good...";
vm.$destroy();
</script>
</body>
</html>
05、小结
vuejs的生命周期钩子有几个?分别是?
创建时期:beforeCreate created
挂载时期:beforeMount mounted
更新时期:beforeUpdate updated
死亡时期:beforeDestory destoryed
06、为什么要学习生命周期:
1:是因为开放的过程,有一些逻辑的数据初始化需要在页面加载完毕的时候就去执行。那么必须要知道那个地方执行即可:
created
mounted
一般在开放中我们都会使用这个两个方法去初始化和改变数据,然后给手续进行渲染和替换。不是beforeMounte不行,是因为mounted更适合。
Vuejs计算属性:computed
官网参考:计算属性和侦听器 — Vue.js
01、目标
使用vuejs计算属性完成
在插值表达式中使用js表达式是非常方便的,而且也经常被用到。
02、具体实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vuejs测试</title>
</head>
<body>
<div id="app">
<h2>
当前时间是:{ {birth} }
</h2>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:"#app",//el即element,要渲染的页面元素
data: {
birthday:1429032123201
},
computed: {
// 1:计算属性 可以当做属性直接使用。不需要定义切记
birth() {
// 2:获取当前时间
const date = new Date(this.birthday);
// 3: 日期格式化日志,返回进行回显页面
return dateFormat("yyyy-MM-dd HH:mm:ss",date);
}
},
// 生命周期函数
created() {
// 4:每隔1秒执行一次时间获取
setInterval(()=>{
this.birthday = new Date().getTime();
},1000);
}
});
// 日期格式化函数
function dateFormat(fmt, date) {
let ret;
const opt = {
"y+": date.getFullYear().toString(), // 年
"m+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"M+": date.getMinutes().toString(), // 分
"s+": date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
</script>
</body>
</html>
VueJs的异步请求:axios介绍
01、目标
掌握和学习异步处理组件axios.
02、概述
Vuejs 并没有直接处理ajax的组件,但可以使用axios或vue-resource组件实现对异步请求的操作。
vue-resource
vue-resource是Vue.js的插件提供了使用XMLHttpRequest或JSONP进行Web请求和处理响应的服务。 当vue更新
到2.0之后,作者就宣告不再对vue-resource更新,而是推荐axios。
vue-resource的github: https://github.com/pagekit/vue-resource
axios简介
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中进行异步调用
axios的github:GitHub - axios/axios: Promise based HTTP client for the browser and node.js
03、安装下载
# 如果使用npm则可以如下安装
npm install axios
或者也可以直接使用公共的CDN(内容分发网络)服务:
<!-- 开发环境版本,包含了用帮助的命令行警告 -->
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
04、axios可以使用的方法有:
axios({
url: '',
method: 'get'
})
- axios(config)
- axios.get(url[, config]).
- axios.delete(url[, config])
- axios.head(url[, config])
- axios.post(url[, data[, config]])
- axios.put(url[, data[, config]])
- axios.patch(url[, data[, config]])
config请求配置
这些是创建请求时可以用的配置选项。只有 url
是必需的。如果没有指定 method
,请求将默认使用 get
方法。
{
// `url` 是用于请求的服务器 URL
url: '/user',
// `method` 是创建请求时使用的方法
method: 'get', // 默认是 get
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: 'https://some-domain.com/api/',
// `transformRequest` 允许在向服务器发送前,修改请求数据
// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
transformRequest: [function (data) {
// 对 data 进行任意转换处理
return data;
}],
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse: [function (data) {
// 对 data 进行任意转换处理
return data;
}],
// `headers` 是即将被发送的自定义请求头
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json'
},
// `params` 是即将与请求一起发送的 URL 参数
// 必须是一个无格式对象(plain object)或 URLSearchParams 对象
params: {
ID: 12345
},
// `data` 是作为请求主体被发送的数据
// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
// 在没有设置 `transformRequest` 时,必须是以下类型之一:
// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
// - 浏览器专属:FormData, File, Blob
// - Node 专属: Stream
data: {
firstName: 'Fred'
},
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求话费了超过 `timeout` 的时间,请求将被中断
timeout: 1000,
// `withCredentials` 表示跨域请求时是否需要使用凭证
withCredentials: false, // 默认的
// `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
responseType: 'json', // 默认的
// `maxContentLength` 定义允许的响应内容的最大尺寸
maxContentLength: 2000,
// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
validateStatus: function (status) {
return status >= 200 && status < 300; // 默认的
},
// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
// 如果设置为0,将不会 follow 任何重定向
maxRedirects: 5 // 默认的
}
响应结构
{
// `data` 由服务器提供的响应
data: {},
// `status` 来自服务器响应的 HTTP 状态码
status: 200,
// `statusText` 来自服务器响应的 HTTP 状态信息
statusText: 'OK',
// `headers` 服务器响应的头
headers: {},
// `config` 是为请求提供的配置信息
config: {}
}
05、具体实现和参数处理
1、在页面引入js库:axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
2、get请求参数处理:
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
axios.get('/user',{params:{ID:12345} })
.then(function (response) {
// handle success
console.log(response);
})
3、post请求参数处理
axios.post('/user',{ID:12345,name:'小飞飞'})
.then(function (response) {
// handle success
console.log(response);
})
注意:后台的mvc方法中如果是pojo或者map必须增加@RequestBody
/**
* 新增用户方法
* @return
*/
@PostMapping("/api/user/save")
public User saveuser(@RequestBody User user){
return userService.saveUser(user);
}
06、小结
小结 |
---|
要进行axios异步请求,第一步要怎么做? |
axios中的get请求怎么带参数? |
axios中的post请求怎么带参数? |