00-ES6补充
01-块级作用域
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<script>
//ES5中的var是没有块级作用域的(if/for)
//ES6中的let是有块级作用域的(if/for)
// ES5之前因为if和for都没有块级作用域的概念,所以在很多时候,我们都必须借助于function的作用
// 域来解决应用外面变量的问题,
// ES6中,加入了let,let它是有if和for的块级作用域
// 1.变量作用域:变量在什么范围内是可用
// {
// var name='why';
// console.log(nname);
// }
// console.log(name);
// 2.没有块级作用域引起的问题:if的块级
// var func;
// if(true){
// var name='why';
// func=function () {
// console.log(name);
// }
// func()
// }
// name='kobe'
// func()
// console.log(name);
var name='why'
function abc(bbb) {// bbb='why
console.log(bbb);
}
abc(name)
name='kobe'
// 3.没有块级作用域引起的问题:for的块级
// 为什么闭包可以解决问题:函数是一个作用域,
// var btns=document.getElementsByTagName('button');
// for(var i=0;i<btns.length;i++){
// (function (num) {// 0
// btns[i].addEventListener('click',function () {
// console.log('第'+num+'个按钮被点击');
// })
// })(i)
// }
const btns=document.getElementsByTagName('button')
for(let i=0;i<btns.length;i++){
btns[i].addEventListener('click',function () {
console.log('第'+i+'个按钮被点击');
})
}
</script>
</body>
</html>
02-const的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
// 1.注意一:一旦给const修饰的标识符被赋值之后,不能修改
// const name='why';
// name='abc';
// 2.注意二:在使用const定义标识符时,必须进行赋值
// const name;
// 3.注意三:常量的含义是指向的对象不能修改,但是可以改变对象内部的属性
const obj={
name:'why',
age:18,
height:1.88
}
//obj={}
console.log(obj);
obj.name='kobe';
obj.age=40;
obj.height=1.87;
console.log(obj);
</script>
</body>
</html>
03-对象字面量的增强写法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
// const obj=new Object()
// const obj={
// name:'why',
// age:18,
// run:function () {
// console.log('在奔跑');
// },
// eat:function () {
// console.log('在次东西');
// }
// }
// 1.属性的增强写法
const name='why';
const age=18;
const height=1.88
//ES5的写法
// const obj={
// name:name,
// age:age,
// height:height
// }
// const obj={
// name,
// age,
// height
// }
//
// console.log(obj);
// 2.函数的增强写法
// ES5的写法
// const obj={
// run:function (){
//
// },
// eat:function () {
//
// }
// }
const obj={
run(){
},
eat(){
}
}
</script>
</body>
</html>
01-Vue初体验
01-HelloVuejs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h1>{{message}}</h1>
<h2>{{name}}</h2>
</div>
<div>{{message}}</div>
<script src="../js/vue.js"></script>
<script>
// //let(变量)/const(常量)
// 编程范式:声明式编程
const app=new Vue({
el:'#app',// 用于挂载要管理的元素
data:{// 定义数据
message:'你好啊,李银河!',
name:'ahhhh'
}
})
// 元素js的做法(编程范式:命令式编程)
// 1.创建div元素,设置id属性
// 2.定义额一个变量交message
// 3.将message变量放在前面的div元素中显示
// 4.修改message的数据:今天天气不错!
// 5.将修改后的数据再次替换到div元素
</script>
</body>
</html>
02-Vue列表展示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<ul>
<li v-for="item in movies">{{item}}</li>
</ul>
</div>
<script src="../js/vue.js"></script>
<script>
const app=new Vue({
el:'#app',
data:{
message:'你好啊',
movies:['星际穿越','大话西游','少年派','盗梦空间']
}
})
</script>
</body>
</html>
03-Vue案例-计数器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>当前计数: {{counter}}</h2>
<!-- <button v-on:click="counter++">+</button>-->
<!-- <button v-on:click="counter--">-</button>-->
<button v-on:click="add">+</button>
<button @click="sub">-</button>
</div>
<script src="../js/vue.js"></script>
<script>
// 语法糖 :简写(v-on: -> @)
// proxy
const obj={
counter:0,
message:'abc'
}
const app=new Vue({
el:'#app',
data:obj,
methods:{
add:function (){
console.log('add被执行');
this.counter++
},
sub:function (){
console.log('sub被执行');
this.counter--
}
},
beforeCreate:function () {
},
created:function () {
console.log('created');
},
mounted:function () {
console.log('nounted');
}
})
// 1.拿button元素
// 2.添加监听事件
</script>
</body>
</html>
04-Vue的template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
</body>
</html>
02-插值的操作
01-Mustache语法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<<div id="app">
<h2>{{message}}</h2>
<h2>{{message}},李银河!</h2>
<!--
mustache语法中,不仅仅可以直接写变量,也可以写简单的表达式
mustache语法只能使用在content内容文本中,不能写在标签属性中
-->
<h2>{{firstName+lastName}}</h2>
<h2>{{firstName+' '+lastName}}</h2>
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{counter*2}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
firstName:'kobe',
lastName:'bryant',
counter:100
}
})
</script>
</body>
</html>
02-v-once指令的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<<div id="app">
<h2>{{message}}</h2>
<!-- 使用v-once之后,该h2中内容不会随着message数据的改变而改变-->
<h2 v-once>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
</body>
</html>
03-v-html指令的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{url}}</h2>
<!-- 使用v-html时,后面的string中往往会含有html标签,通过v-html将该string的html解析出来-->
<h2 v-html="url"></h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
url:'<a href="http://www.baidu.com">百度一下</a>'
}
})
</script>
</body>
</html>
04-v-text指令的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<<div id="app">
<h2>{{message}},李银河!</h2>
<!-- 使用v-text效果和{{}}一样,但是不够灵活,若h2标签中还有文字,message中的文字会将其覆盖-->
<h2 v-text="message">,李银河!</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
</body>
</html>
05-v-pre指令的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!-- 使用v-pre时,可以将标签中的内容原封不动的显示出来,而不做任何解析-->
<h2 v-pre>{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
</script>
</body>
</html>
06-v-cloak指令的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
[v-cloak]{
display: none;
}
</style>
</head>
<body>
<div id="app" v-cloak>
{{message}}
</div>
<script src="../js/vue.js"></script>
<script>
// 在vue解析之前,div中有一个属性v-cloak
// 在vue解析之后,div中没有一个属性v-cloak
setTimeout(function () {
const app = new Vue({
el: '#app',
data: {
message: '你好啊'
}
})
},1000)
</script>
</body>
</html>
03-动态绑定属性
01-v-bind的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 错误的做法:这里不可以使用mustache语法-->
<!-- <img src="{{imgURL}}" alt="">-->
<!-- 正确的做法:使用v-bind指令-->
<img v-bind:src="imgURL" alt="">
<a v-bind:href="aHref">百度一下</a>
<!-- <h2>{{}}</h2>-->
<!-- 语法糖的写法-->
<img :src="imgURL" alt="">
<a :href="aHref">百度一下</a>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
imgURL:'https://img12.360buyimg.com/pop/s590x470_jfs/t1/158445/24/22770/89909/61c06457E2c49610a/128d3d2dda8b1bfa.jpg.webp',
aHref:'http://www.baidu.com'
}
})
</script>
</body>
</html>
02-v-bind动态绑定class(对象语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.active{
color: red;
}
</style>
</head>
<body>
<div id="app">
<!-- <h2 class="active">{{message}}</h2>-->
<!-- <h2 :class="active">{{message}}</h2>-->
<!-- <h2 v-bind:class="{key1:value1,key2:value2}">{{message}}</h2>-->
<!-- <h2 v-bind:class="{类名1:true,类名二:boolean}">{{message}}</h2>-->
<h2 class="title" v-bind:class="{active:isActive,line:isLine}">{{message}}</h2>
<h2 class="title" v-bind:class="getClasses()">{{message}}</h2>
<button v-on:click="btnClick">按钮</button>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
isActive:true,
isLine:true
},
methods:{
btnClick:function () {
this.isActive=!this.isActive
},
getClasses:function () {
return {active:this.isActive,line:this.isLine}
}
}
})
</script>
</body>
</html>
03-v-bind动态绑定class(数组语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2 class="title" :class="[active,line]">{{message}}</h2>
<h2 class="title" :class="getClass()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
active:'aaaaaa',
line:'bbbbbb'
},
methods:{
getClass:function () {
return [this.active,this.line]
}
}
})
</script>
</body>
</html>
04-v-bind动态绑定style(对象语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- <h2 :style="{key(属性名):value(属性值)}">{{message}}</h2>-->
<!-- '50px'必须加上单引号,否则是当作一个变量去解析-->
<!-- <h2 :style="{fontSize:'50px'}">{{message}}</h2>-->
<!-- finalSize当成一个变量使用-->
<!-- <h2 :style="{fontSize:finalSize}">{{message}}</h2>-->
<h2 :style="{fontSize:finalSize+'px',backgroundColor:finalColor}">{{message}}</h2>
<h2 :style="getStyles()">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
finalSize:100,
finalColor:'red',
},
methods:{
getStyles:function () {
return {fontSize:this.finalSize+'px',backgroundColor:this.finalColor}
}
}
})
</script>
</body>
</html>
05-v-bind动态绑定style(数组语法)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="app">
<h2 :style="[baseStyle,baseStyle1]">{{message}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
message: '你好啊',
baseStyle:{backgroundColor:'red'},
baseStyle1:{fontSize:'100px'}
}
})
</script>
</body>
</html>
04-计算属性
01-计算属性的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{firstName+' '+lastName}}</h2>
<h2>{{firstName}} {{lastName}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{fullName}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'Lebron',
lastName:'James'
},
// computed:计算属性()
computed:{
fullName:function () {
return this.firstName+' '+this.lastName
}
},
methods:{getFullName() {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
</body>
</html>
02-计算属性的复杂操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>总价格:{{totalPrice}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
books:[
{id:110,name:'Unix编程艺术',price:119},
{id:111,name:'代码大全',price:105},
{id:112,name:'深入理解计算机原理',price:98},
{id:113,name:'现代操作系统',price:87},
]
},
computed:{
totalPrice:function (){
let result=0
for(let i=0;i<this.books.length;i++){
result+=this.books[i].price
}
return result
// for(let i in this.books){
// this.books[i]
// }
//
// for(let book of this.books){
//
// }
}
}
})
</script>
</body>
</html>
03-计算属性的getter和setter
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<h2>{{fullName}}</h2>
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'Kobe',
lastName:'Bryant'
},
computed:{
// fullName:function () {
// return this.firstName+' '+this.lastName
// }
// name:'coderwhy'
// 计算属性一般是没有set方法,只读属性;
fullName:{
set:function (newValue) {
console.log('------',newValue);
const names=newValue.split(' ');
this.firstName=names[0];
this.lastName=names[1];
},
get:function () {
return this.firstName+' '+this.lastName
}
}
// fullName:function () {
// return this.firstName+' '+this.lastName
// }
}
})
</script>
</body>
</html>
04-计算属性和methods的对比
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<!-- 1.直接拼接:语法过于繁琐-->
<!-- <h2>{{firstName}} {{lastName}}</h2>-->
<!-- 2.通过定义methods-->
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<h2>{{getFullName()}}</h2>
<!-- 3.通过computed-->
<!-- <h2>{{fullName}}</h2>-->
<!-- <h2>{{fullName}}</h2>-->
<!-- <h2>{{fullName}}</h2>-->
<!-- <h2>{{fullName}}</h2>-->
<!-- <h2>{{fullName}}</h2>-->
</div>
<script src="../js/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
firstName:'Kobe',
lastName:'Bryant'
},
methods:{
getFullName:function () {
console.log('getFullName');
return this.firstName + ' ' + this.lastName
}
},
computed:{
fullName:function () {
console.log('fullName');
return this.firstName+' '+this.lastName
}
}
})
</script>
</body>
</html>