必看
目录
一、(了解)课程介绍
课程介绍
项目介绍
二、邂逅Vuejs
(一) 、内容概述
(二)、(理解)认识Vue.js
1.为什么要学习Vue.js
2.简单认识一下Vuejs
(三)、(掌握)Vue.js安装
(四)、(掌握)Vue初体验
1.Hello Vuejs
2.Vue列表显示
3.案例:计数器
(五)、(理解)Vue中的MVVM
1.Vue中的MVVM
MVVM的实现原理:MVVM的实现主要是三个核心点:
2.计数器中的MVVM
(六)、(理解)Vue中的options
1.创建Vue实例传入的options
2.Vue的生命周期
三、基础语法
(一)、内容概述
(二)、(了解)定义Vue中的template
VScode中的template
(三)、(掌握)插值操作
1. Mustache
2.v-once
3.v-html
4.v-text
5.v-pre
6.v-cloak
(四)、绑定属性(v-bind)
1.v-bind介绍
2.(掌握)v-bind基础
3.v-bind动态绑定class
4.(掌握)v-bind绑定class--(对象语法)
5.(了解)v-bind绑定class--(数组语法)
6.(完成) 作业:v-bind和v-for的结合--点击哪项,该项变红色
7.v-bind绑定style
8.(掌握)v-bind绑定style--对象语法
9.(了解)v-bind绑定style--数组语法
(五)、计算属性
1.(掌握)什么是计算属性?计算属性的基本使用
2.(掌握)计算属性的复杂操作
3.(理解)计算属性的setter和getter
4.(掌握)计算属性的缓存(计算属性和methods的对比)
(六)、(掌握)ES6补充
1.(掌握)块级作用域--let/var
2.(理解)三种方案对比(ES5没有闭包-有闭包-ES6的let)
3.(掌握)const的使用和注意点
4.(掌握)ES6对象字面量的增强写法
(七)、(掌握)事件监听v-on
1.事件监听
2.v-on基础
3.v-on参数
4.v-on修饰符
(八)、条件判断v-if、v-else-if、v-else
1.v-if、v-else-if、v-else
3.条件渲染案例--登录切换
4.(理解)案例小问题--登录切换input的复用
5.(掌握)v-show的使用以及和v-if的区别
(九)、遍历循环v-for
1.(掌握)v-for遍历数组
2.(掌握)v-for遍历对象
3.(理解)组件的key属性--v-for绑定key和没有绑定key的区别
4.(掌握)数组中哪些方法是响应式的?
5.(掌握)阶段案例--图书购物车
6.(掌握) JavaScript高阶函数的使用
(十)、(掌握)表单绑定v-model
1.表单绑定v-model
2.v-model原理
3.v-model结合radio类型使用
4.v-model结合checkbox类型使用
5.v-model结合select类型使用
6.input中的值绑定
7.v-model 修饰符的使用
视频对应目录
(具体请查看资料里的xmind文件)
(这个项目的接口需找老师获取)
- 认识Vuejs
- 为什么学习Vuejs
- 简单认识一下Vuejs
- Vuejs安装方式
- CDN引入
- NPM安装管理
- 下载和引入
- Vuejs初体验
- Hello Vuejs
- Vue列表展示
- 案例:计数器
- Vuejs的MVVM
- Vue中的MVVM
(附:Vue官网)
(开发环境:源码没有经过压缩,可以直接查看源码,学习阶段使用CDN更慢)
代码:
{{message}}
{{name}}
{{message}}
代码:
- {{item}}
响应式:vue如何监听data的属性变化
模板解析:vue的模板是如何被解析的
渲染:vue模板是如何被渲染成HTML的
Vue中的MVVM
代码:
当前计数: {{counter}}
生命周期: 事物从诞生到消亡的整个过程
官网详细描述
Vue的生命周期图示
超详细vue生命周期解析(详解)
vue生命周期
vue之生命周期(详细)
vue生命周期钩子函数详解
Vue生命周期(11个钩子函数)
- 插值操作
- 绑定属性
- 计算属性
- 事件监听
- 条件判断
- 循环遍历
- 阶段案例
- v-model
创建
使用(回车即可出现定义的template)
代码:
{{message}}
{{message}}, 李银河!
{{firstName + lastName}}
{{firstName + ' ' + lastName}}
{{firstName}} {{lastName}}
{{counter * 2}}
{{url}}
{{message}}, 李银河!
, 李银河!
{{message}}
{{message}}
{{message}}
用法一:直接通过{}绑定一个类
Hello World
用法二:也可以通过判断,传入多个值
Hello World
用法三:和普通的类同时存在,并不冲突
注:如果isActive和isLine都为true,那么会有title/active/line三个类
Hello World
用法四:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
Hello World
代码:
{{message}}
{{message}}
用法一:直接通过[]绑定一个类
Hello World
用法二:也可以传入多个值
Hello World
用法三:和普通的类同时存在,并不冲突
注:会有title/active/line三个类
Hello World
用法四:如果过于复杂,可以放在一个methods或者computed中
注:classes是一个计算属性
Hello World
Title
-
{{index}}-{{m}}
:style="{color: currentColor, fontSize: fontSize + 'px'}"
{{message}}
{{message}}
{{message}}
{{message}}
代码:
{{firstName + ' ' + lastName}}
{{firstName}} {{lastName}}
{{getFullName()}}
{{fullName}}
附:高阶函数reduce的补充
代码:
总价格: {{totalPrice}}
用到了set
{{fullName}}
在浏览器控制台查看缓存:
(fullName没有变化,就调用了一次)
(fullName有变化,重新调用)
代码:
{{firstName}} {{lastName}}
{{getFullName()}}
{{getFullName()}}
{{getFullName()}}
{{getFullName()}}
{{fullName}}
{{fullName}}
{{fullName}}
{{fullName}}
1.变量作用域: 变量在什么范围内是可用
// 下面是一个代码块。{} 就是一个代码块,有没有{}对于定义变量来说没任何意义 内外都可以使用name
{
var name = 'why';
console.log(name);
}
console.log(name); // 可以使用name
补充:JS:代码块{},及代码块的作用是什么?
2.没有块级作用域引起的问题: if的块级
if (true) {
var name = 'why';
}
console.log(name);// 可以打印
if (true) {
var name = 'why';
}
console.log(name);// 可以打印
var func;
if (true) {
var name = 'why';
func = function () { // 这个变量是为了打印这里的name
console.log(name);
}
// func();// 可以打印
}
name = 'kobe'; // 这里把变量改掉了,不应该能改
func(); // 依然可以打印
// console.log(name);
3.没有块级作用域引起的问题: for的块级
监听按钮的点击
综上,if和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)
}
补充:立即执行函数
// 立即执行函数
(function () {
}())
(function () {
})()
var name = "yyyy";
function abc(name) {
console.log(name);
}
name="why";
abc('aaaaaa');// 无论外部怎么改变name,打印的还是aaaa
var name = 'why'
function abc(bbb) { // bbb = 'why'
console.log(bbb);
}
abc(name);// 也不会有任何冲突 name还是why
name = 'kobe'
补充:关于一些闭包的文章
闭包,看这一篇就够了——带你看透闭包的本质,百发百中
【JS】函数闭包(重点)
前端面试题:闭包
总之,记住
ES5中的var是没有块级作用域的(if/for)
ES6中的let是由块级作用的(if/for)
// es6写法
const btns = document.getElementsByTagName('button')
for (let i = 0; i < btns.length; i++) {
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{ i = 0
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{ i = 1
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{ i = 2
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{ i = 3
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{ i = 4
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
// ES5
var i = 5
{
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
{
btns[i].addEventListener('click', function () {
console.log('第' + i + '个按钮被点击');
})
}
const a=20;
a=30;// 错误:不可以修改
const name; // 错误:const修饰的标识符必须赋值
// 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);
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的写法:
// ES5的写法
const obj = {
name: name,
age: age,
height: height
}
console.log(obj);
ES6的写法:
// ES6的写法
const obj = {
name,
age,
height,
}
console.log(obj);
ES5的写法
// ES5的写法
const obj = {
run: function () {
},
eat: function () {
}
}
ES6的写法
// ES6
const obj = {
run() {
},
eat() {
}
}
代码:
{{counter}}
代码:
代码:
○ v-if的使用
abc
abc
abc
abc
abc
{{message}}
○ v-if 和v-else 的使用
abc
abc
abc
abc
abc
{{message}}
isShow为false时, 显示我
○ v-if 、v-else-if和v-else 的使用
优秀
良好
及格
不及格
{{result}}
代码:
这是因为Vue在进行DOM渲染时,出于性能考虑,会尽可能的复用已经存在的元素,而不是重新创建新的元素。
在上面的案例中,Vue内部会发现原来的input元素不再使用,直接作为else中的input来使用了
解决方案
如果我们不希望Vue出现类似重复利用的问题,可以给对应的input添加key
并且我们需要保证key的不同
代码:
代码:
{{message}}
{{message}}
代码:
- {{item}}
-
{{index+1}}.{{item}}
代码:
- {{item}}
- {{value}}-{{key}}
- {{value}}-{{key}}-{{index}}
代码:
- {{item}}
补充:
vue 过滤器filter(全面)
HTML代码:
书籍名称
出版日期
价格
购买数量
操作
{{item.id}}
{{item.name}}
{{item.date}}
{{item.price | showPrice}}
{{item.count}}
总价格: {{totalPrice | showPrice}}
购物车为空
CSS代码:
table {
border: 1px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0;
}
th, td {
padding: 8px 16px;
border: 1px solid #e9e9e9;
text-align: left;
}
th {
background-color: #f7f7f7;
color: #5c6b77;
font-weight: 600;
}
JS代码:
const app = new Vue({
el: '#app',
data: {
books: [
{
id: 1,
name: '《算法导论》',
date: '2006-9',
price: 85.00,
count: 1
},
{
id: 2,
name: '《UNIX编程艺术》',
date: '2006-2',
price: 59.00,
count: 1
},
{
id: 3,
name: '《编程珠玑》',
date: '2008-10',
price: 39.00,
count: 1
},
{
id: 4,
name: '《代码大全》',
date: '2006-3',
price: 128.00,
count: 1
},
]
},
methods: {
// getFinalPrice(price) {
// return '¥' + price.toFixed(2)
// }
increment(index) {
this.books[index].count++
},
decrement(index) {
this.books[index].count--
},
removeHandle(index) {
this.books.splice(index, 1)
}
},
computed: {
totalPrice() {
let totalPrice = 0
for (let i = 0; i < this.books.length; i++) {
totalPrice += this.books[i].price * this.books[i].count
}
return totalPrice
// 其他计算总价格方法
// for (let i in/of this.books)
// reduce
}
},
filters: { // 过滤器
showPrice(price) { // 参数是你要过滤的东西
// toFixed 保留两位小数
return '¥' + price.toFixed(2)
}
}
})
计算总价格其他方法 :
computed: {
totalPrice() {
// 1.普通的for循环
// let totalPrice = 0
// for (let i = 0; i < this.books.length; i++) {
// totalPrice += this.books[i].price * this.books[i].count
// }
// return totalPrice
// 2.for (let i in this.books)
// let totalPrice = 0
// for (let i in this.books) {
// const book = this.books[i]
// totalPrice += book.price * book.count
// }
//
// return totalPrice
// 3.for (let i of this.books)
// let totalPrice = 0
// for (let item of this.books) {
// totalPrice += item.price * item.count
// }
// return totalPrice
return this.books.reduce(function (preValue, book) {
return preValue + book.price * book.count
}, 0)
}
},
也可以使用高阶函数reduce,下面介绍高阶函数
// 编程范式: 命令式编程/声明式编程
// 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
// filter/map/reduce
// filter中的回调函数有一个要求: 必须返回一个boolean值
// true: 当返回true时, 函数内部会自动将这次回调的n加入到新的数组中
// false: 当返回false时, 函数内部会过滤掉这次的n
const nums = [10, 20, 111, 222, 444, 40, 50]
// 高阶函数 本身参数也是一个函数
// let total = nums.filter(n => n < 100).map(n => n * 2).reduce((pre, n) => pre + n);
// console.log(total);
let total = nums.filter(function (n) {
return n < 100
}).map(function (n) {
return n * 2
}).reduce(function (prevValue, n) {
return prevValue + n
}, 0)
console.log(total);
// 1.filter函数的使用
// 10, 20, 40, 50
let newNums = nums.filter(function (n) {
return n < 100
})
// console.log(newNums);
// 2.map函数的使用
// 20, 40, 80, 100
let new2Nums = newNums.map(function (n) { // 20
return n * 2
})
console.log(new2Nums);
// 3.reduce函数的使用
// reduce 作用对数组中所有的内容进行汇总
let total = new2Nums.reduce(function (preValue, n) {
return preValue + n
}, 0)
console.log(total);
// 第一次: preValue 0 n 20
// 第二次: preValue 20 n 40
// 第二次: preValue 60 n 80
// 第二次: preValue 140 n 100
// 240
// 普通写法
// 1.需求: 取出所有小于100的数字
let newNums = []
for (let n of nums) {
if (n < 100) {
newNums.push(n)
}
}
// 2.需求:将所有小于100的数字进行转化: 全部*2
let new2Nums = []
for (let n of newNums) {
new2Nums.push(n * 2)
}
console.log(new2Nums);
// 3.需求:将所有new2Nums数字相加,得到最终的记过
let total = 0
for (let n of new2Nums) {
total += n
}
console.log(total);
{{message}}
{{message}}
单选按钮radio的value会影响v-model的值(input得有value属性,value是什么获取到的就是什么)
您选择的性别是: {{sex}}
代码:
您选择的是: {{isAgree}}
篮球
足球
乒乓球
羽毛球
您的爱好是: {{hobbies}}
代码:
您选择的水果是: {{fruit}}
您选择的水果是: {{fruits}}
代码:
{{message}}
{{age}}-{{typeof age}}
您输入的名字:{{name}}