1. ES6新特性
1.1 let、var、const的区别
var在作用域外还能访问,let只作用在声明的区域内,const赋值后不能被修改
1.2 解构表达式
//针对普通数组进行解构
let arr = [1,2,3];
const [x,y,z] = arr;
console.log(x);
console.log(y);
console.log(z);
//针对对象
const person = {
name:"奥力给",
age:21,
language: ['java','javaee','spring']
}
const {name,age,language} = person
console.log(name)
console.log(age)
console.log(language)
1.3 函数优化
//当调用时若不传参数b,则默认b=1
function add(a , b = 1) {
return a + b;
}
1.4 箭头函数
//如果有多行代码啊 可以用{}括起来
let sum2 = (a,b) => {
console.log(a)
console.log(b)
return a+b
}
//调用
console.log(sum2(1,2))
1.5 set和map结构
1.5.1 set
Set,本质与数组类似。不同在于Set中只能保存不同元素,如果元素相同会被忽略。
创建set
// Set构造函数可以接收一个数组或空
let set = new Set();
set.add(1);// [1]
// 接收数组
let set2 = new Set([2,3,4,5,5]);// 得到[2,3,4,5]
普通方法
set.add(1);// 添加
set.clear();// 清空
set.delete(2);// 删除指定元素
set.has(2); // 判断是否存在
set.keys();// 返回所有key
set.values();// 返回所有值
set.entries();// 返回键值对集合
// 因为set没有键值对,所有其keys、values、entries方法返回值一样的。
set.size; // 元素个数。是属性,不是方法。
1.5.2 map
map,本质是与Object类似的结构。不同在于,Object强制规定key只能是字符串。而Map结构的key可以是任意对象。即:
● object是 <string,object>集合
● map是<object,object>集合
创建map
// map接收一个数组,数组中的元素是键值对数组
const map = new Map([
['key1','value1'],
['key2','value2'],
])
// 或其它map
const map3 = new Map(map);
普通方法
map.set(key,value);// 添加
map.clear();// 清空
map.delete(2);// 删除指定元素
map.has(2); // 判断是否存在
map.keys();// 返回所有key
map.values();// 返回所有值
map.entries();// 返回键值对集合
map.size; // 元素个数。是属性,不是方法。
1.6 模块化
类似于java中包的概念
模块功能主要由两个命令构成:export和import。
● export命令用于规定模块的对外接口,
● import命令用于导入其他模块提供的功能。
1.6.1 导出
导出方式1:
export let star = '奥利给';
export function sing(){
console.log('奥利给唱歌')
}
导出方式2:
let star = '奥利给';
function sing(){
console.log('奥利给唱歌')
}
export {star, sing}
1.6.2 导入
导入方式1:
<script type="module">
//普通导入,根据别名调用
import * as m1 from './hello.js'
console.log(m1)
console.log(m1.star)
</script>
导入方式2:
<script type="module">
//解构表达式导入
import {star, sing} from './hello.js'
console.log(star)
sing()
</script>
2. Vue
Model:模型,其中存放数据信息
View:视图,展示给用户的页面
2.1 Vue入门
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
<h2>{{name}},非常帅</h2>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
name:"龙龙"
}
})
</script>
</html>
2.2 双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
<h2>{{name}},非常帅!有{{num}}位女生喜欢他</h2>
<!--为输入框绑定模型中的数据-->
<input type="text" v-model="num">
<!--为点击事件绑定操作模型中数据的事件-->
<button v-on:click="num++"></button>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
name:"龙龙",
num:99
}
})
</script>
</html>
当输入框输入数据,或点击按钮时,上面的文字内容也会改变
2.3 Vue实例中的方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
{{num}}
<!--点击按钮时调用vue实例中的方法-->
<button v-on:click="add">+</button>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
num:1
},
methods:{//定义模型中方法
//当add调用时,让num值增加
add:function (){
//this代表当前vue实例
this.num++;
}
}
})
</script>
</html>
点击+就能调用vue实例中的add方法,改变视图中的数据
2.4 v-text和v-html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
v-text:<span v-text="hello"></span><br/>
v-html:<span v-html="hello"></span>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
hello:'<h1>ikun</h1>'
}
})
</script>
</html>
v-text不会解析数据中的html内容,而v-html会解析html内容
v-text和v-html是单向绑定,只能在修改vue实例中数据后改变视图中显示的内容,但若直接修改视图中显示的内容则不能影响vue实例中数据的值
2.5 v-model
v-model可以实现双向绑定,即模型和视图可以互相影响,用户通过页面数据元素修改内容,也能影响模型中对应的数据的值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
<!--通过v-model为当前页面的输入元素绑定模型中的数据-->
<input type="checkbox" v-model="language" value="Java" />Java<br/>
<input type="checkbox" v-model="language" value="Js" />Js<br/>
<input type="checkbox" v-model="language" value="PHP" />PHP<br/>
<!--对模型中的数据进行实时显示-->
<h1>
你选择了:{{language.join(',')}}
</h1>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
language:[]
}
})
</script>
</html>
2.5 v-on
用于给页面视图元素绑定事件,语法如下
v-on:事件名="js片段或函数名"
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--这里div代表视图视图-->
<div id="app">
<h2>{{name}}</h2>
<h2>{{num}}</h2>
<!--通过js代码-->
<button v-on:click="num++">+</button>
<!--通过调用模型方法,可以用@代替v-on:-->
<button @click="decrement">-</button>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
name:"ikun",
num:100
},
methods:{
decrement (){
this.num--;
}
}
})
</script>
</html>
2.6 v-for
语法:
v-for="item in items"
● items:要遍历的数组,需要在vue的data中定义好。
● item:迭代得到的数组元素的别名
例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 这里div代表视图视图-->
<div id="app">
<!--不需要下标的循环-->
<li v-for="user in users">
{{user.name}}-{{user.age}}
</li>
<br>
<!--需要下标的循环-->
<li v-for="(user,index) in users">
{{index+1}} {{user.name}}-{{user.age}}
</li>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
users:[
{name:'奥利给', gender:'女', age: 21},
{name:'王总', gender:'男', age: 18},
{name:'二龙', gender:'女', age: 24}
]
},
})
</script>
</html>
2.6 v-if和v-show的区别
v-if只有当条件成立时才会渲染,而v-show不管是否成立都会渲染,当条件不成立时会将其display属性设置为none
2.7 v-bind
将模型的数据绑定到html标签的属性上
<div id="app">
<!--将模型中的tiltle数据值绑定到div元素的title属性上-->
<div v-bind:title="title" style="border: 1px solid red; width: 50px; height: 50px;"></div>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
title: "奥利给",
}
})
</script>
2.7 计算属性
定义计算属性
var vm = new Vue({
el:"#app",
data:{
birthday:1629999123201 // 毫秒值
},
//定义计算属性
computed:{
birth(){// 计算属性本质是一个方法,但是必须返回结果
const d = new Date(this.birthday);
return d.getFullYear() + "-" + d.getMonth() + "-" + d.getDay();
}
}
})
调用计算属性
<div id="app">
<h1>您的生日是:{{birth}} </h1>
</div>
计算属性和普通方法的区别:使用计算属性时,当其中计算的数据没有修改时,后续调用时不会再进行调用,而是直接取得之前计算的结果,而如果是普通方法,则每次调用时都会执行
2.8 watch
watch可以让我们监控一个值的变化。从而做出相应的反应
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 这里div代表视图视图-->
<div id="app">
<!--将输入框内容绑定到模型的msg上-->
<input type="text" v-model="msg">
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
//定义模型中的数据
data:{
msg:""
},
//监控msg的变化,并打印出两个值
watch:{
msg(newVal,oldVal){
console.log(newVal,oldVal);
}
}
})
</script>
</html>
2.9 组件化
在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航。
但是如果每个页面都独自开发,这无疑增加了我们开发的成本。所以我们会把页面的不同部分拆分成独立的组件,然后在不同页面就可以共享这些组件,避免重复开发。
2.9.1 全局组件
我们通过Vue的component方法来定义一个全局组件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 这里div代表视图视图-->
<div id="app">
<!--使用全局组件,注意组件必须要在绑定了vue实例的元素内才能使用-->
<counter></counter>
<!--可以多次复用,且每个组件中的数据相互独立,互补影响-->
<counter></counter>
<counter></counter>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//定义全局组件,参数1是组件名称,参数2是组件参数
Vue.component("counter",{
//template代表组件中的视图
template:'<button @click="num++">我被点击了{{num}}次</button>',
//data代表当前组件中的模型数据
data(){
return{
num:0
}
}
});
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
})
</script>
</html>
2.9.2 局部组件
一旦全局注册,就意味着即便以后你不再使用这个组件,它依然会随着Vue的加载而加载,因此,对于一些并不频繁使用的组件,我们会采用局部注册。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 这里div代表视图视图-->
<div id="app">
<!--使用局部组件-->
<counter></counter>
</div>
<div id="app1">
<!--因为为app1绑定的vue实例中并没有挂载counter局部组件,所以这里调用失败-->
<counter></counter>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//定义局部组件
const counter={
//template代表组件中的视图
template:'<button @click="num++">我被点击了{{num}}次</button>',
//data代表当前组件中的模型数据
data(){
return{
num:0
}
}
}
//创建并初始化vue实例模型
let app = new Vue({
//为实例绑定视图
el:'#app',
components:{
//挂载局部组件,只能在绑定了当前vue实例的页面视图元素中使用这个组件
//组件名:组件内容
//myCounter:counter, //在id为app的元素内调用时要使用myCounter
//当只声明局部组件名时,调用组件时的名字就是局部组件名,在id为app的元素内调用时就使用counter
counter
}
})
//创建并初始化vue实例模型
let app1 = new Vue({
//为实例绑定视图
el:'#app1',
})
</script>
</html>
2.9.3 组件通信
组件之间可以互相嵌套,形成父子组件
2.9.3.1 父组件传递参数给子组件
规则:
- 定义子组件时,通过props接收父组件数据,其中定义接收父组件数据的数据名
- 调用子组件并使用父组件时数据时,自定义对应的数据名(数据名任意,与props中定义的名字要一致,后面跟要传递的数据在父组件中的数据名)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 这里div代表视图视图-->
<div id="app">
<!--:num1为在子组件counter的props中声明的名字,后面为父组件中的数据名-->
<counter :num1="num"></counter>
</div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
//定义全局组件,参数1是组件名称,参数2是组件参数
Vue.component("counter",{
//template代表组件中的视图
template:'<button v-on:click="num1++">我被点击了{{num1}}次</button>',
//声明在子组件中用num1代表父组件中的对应数据
props:["num1"]
});
//创建并初始化vue实例模型
var app = new Vue({
//为实例绑定视图
el:'#app',
//num属于父组件中的数据
data:{
num:10
}
})
</script>
</html>
传递过程:
2.9.3.2 父组件传递方法给子组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>num:{{num}}</h2>
<!--使用全局组件,注意组件必须要在绑定了vue实例的元素内才能使用-->
<counter :num="num" @inc="add" @dec="minus"></counter>
</div>
</body>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
//定义全局组件,参数1是组件名称,参数2是组件参数
Vue.component("counter",{
template:'\
<div>\
<button @click="plus">加</button>\
<button @click="reduce">减</button>\
</div>',
props:["num"]
,methods:{
plus(){
this.$emit("inc");
},
reduce(){
this.$emit("dec");
}
}
});
var app = new Vue({
el:"#app",
data:{
num:0
},
methods:{ // 父组件中定义操作num的方法
add(){
this.num++;
},
minus(){
this.num--;
}
}
})
</script>
</html>
调用过程
2.10 vue-router
安装:
npm install vue-router@2.0.0
定义登录组件
const loginForm = {
template:"<div>" +
"<h2>登录页</h2>" +
"用户名<input type='text'>" +
"密码<input type='password'>" +
"</div>"
}
定义注册组件
const registerForm = {
template:"<div>" +
"<h2>注册页</h2>" +
"用户名<input type='text'>" +
"密码<input type='password'>" +
"确认密码<input type='password'>" +
"</div>"
}
编写主页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!--to当中填写路由地址,点击时就会访问对应的path-->
<span><router-link to="/login">登录</router-link></span>
<span><router-link to="/register">注册</router-link></span>
<div>
<!--路由锚点-->
<router-view></router-view>
</div>
</div>
</body>
<script src="../node_modules/vue/dist/vue.js"></script>
<script src="user/login.js"></script>
<script src="user/register.js"></script>
<!--引入路由js文件-->
<script src="../node_modules/vue-router/dist/vue-router.js"></script>
<script>
//创建VueRouter
const router = new VueRouter({
routes:[ //配置路由规则,当对应的path被访问时,其中的component就会被加载到页面的锚点上
{
//请求路径,以/开头
path: '/login',
//要加载的组件名称
component:loginForm
},
{
//请求路径,以/开头
path: '/register',
//要加载的组件名称
component:registerForm
}
]
})
var app = new Vue({
el:"#app",
components:{
loginForm,
registerForm
},
//引用router对象
router
})
</script>
</html>
通电点击事件切换组件
2.11 vue-cli
创建脚手架项目
vue create 项目名称
启动脚手架内置服务器
npm run serve
打包项目
npm run build