/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>ES6//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 学习网站: //imgq01.71396.com/ca/ek/11c5be704182423e.jpgttps://es6.ruanyifeng.com/ /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>箭头函数//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>普通函数 //普通函数 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis 指向调用时所在的对象(可变) let fn = function fn(a, b) { console.log(a, b); } fn(1, 2);箭头函数: 箭头函数t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis指向声明时所在的对象(不可变) let fn2 = (c, d) => { console.log(c, d); } fn2(3, 4);如果只有一个参数,可以省略圆括号 let fn3 = c => { } fn3(6);如果函数体内只有一条 return 语句,可以省略 {} return let fn4 = d => d; fn4(7)箭头函数与普通函数的区别: t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis 指向问题:普通函数 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis 指向调用时所在的对象(可变); 箭头函数 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis 指向定义时所在对象(不可改变) let obj={"name":"gao","age":18}; function fn(){ console.log(t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis); } fn();//t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis-->window fn.call(obj);//fn-->t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis-->obj let fn2=()=>{ console.log(t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis); } fn2(); fn2.call(obj)//无法改变t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis指向,还是window构造函数问题:普通函数 可以当做构造函数 可以 new ; 箭头函数 不可以当做构造函数,不可以 new function Gou(name, age) { t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.name = name; t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.age = age; } let o1 = new Gou("Gao", 19); console.log(o1); //Gou {name: "Gao", age: 19} //----------------------- let Gou2 = (name, age) => { t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.name = name; t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.age = age; } let o2 = new Gou2("wang", 18); console.log(o2);参数问题:普通函数 arguments 获取所有的实参,组成伪数组 ; 箭头函数不可以使用 arguments 用 rest 参数(...参数) function fn3(){ console.log(arguments); } fn3(1,2,3,4,5); let fn4=(...x)=>{ console.log(x); } fn4(1,2.3,4,5);//箭头函数无arguments,可以使用... //普通函数可以使用...????--->可以 function fn5(...x){ console.log(x); } fn5(1,2,3,4,5); //可以使用...不可以使用 yield 命令,因为箭头函数不能用作 Generator 函数;首先可以把它理解成 Generator 函数是一个状态机,封装了多个内部状态. function *fn5(){//写法或者function* fn5() yield "1"; yield "2"; yield "3"; //yield产出 return "d" } let f = fn5(); for( let v of f){ console.log(v); } console.log( f.next() ); console.log( f.next() ); console.log( f.next() ); console.log( f.next() ); //console.log( f.next() ); //console.log( f.next() ); //console.log( f.next() );/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Symbol//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>let a = Symbol(); let b = Symbol(); console.log(a); console.log(b); console.log(a == b, a === b); //应用-->对象的key,保证唯一,不被覆盖 //组长:对象{name:"gao"} //自己:对象{name:"王"} let obj = { [a]: "gao" }; let obj2 = { [b]: "王" }; console.log(obj[a]); console.log(obj2); //将obj2合并到obj对象上,----如果属性名相同,覆盖,但是属性名是Symbol独一无二 Object.assign(obj, obj2); console.log("合并后", obj);/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Set//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>//Set :类似数组的数据结构,但是成员值唯一 let a = new Set([1, 2, 3, 1, 2]); //类数组转数组 let arr = Array.from(a); console.log(a); console.log(arr); //是否存在 console.log(a.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(1)); //true console.log(a.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(2)); //true console.log(a.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(3)); //true console.log(a.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(4)); //false //添加add() a.add(555); console.log(a); //删除 delete() a.delete(2); console.log(a); //清空clear(); // a.clear(); console.log(a); //属性size长度 console.log(a.size);/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Map//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>//定义一个普通的对象,key 为字符串 let obj = { "name": "gao", "12": 23232 }; //key为字符串 console.log(obj); //map :类似对象的数据结构,但是 key 可以为任何数据类型 //定义一个Map()结构 let m = new Map(); // 设置值set() m.set(true, "呵呵"); //这里key为true,可以为null,还可以为function m.set(1, "哈哈"); //这里key为true,可以为null,还可以为function m.set(2, "嘻嘻"); //这里key为true,可以为null,还可以为function console.log(m); //获取值get(key) console.log(m.get(true)); console.log(m.get(1)); console.log(m.get(2)); //是否存在//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(key) console.log(m.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(12)); //false console.log(m.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgas(2)); //true //删除 delete(key) m.delete(1); console.log(m); //清空clear() m.clear(); console.log(m); //属性size console.log(m.size); //遍历keys for (let v of m.keys) { console.log(v); } //遍历values for (let v of m.values) { console.log(v); } //遍历keys和values for (let v of m.entries) { console.log(v); }/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Proxy//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> Proxy 与 Object.defineProperty 优劣对比 Proxy 的优势如下 : !!! Proxy 可以直接监听 对象 而非属性; !!! Proxy 可以直接监听 数组 的变化; !!! Proxy 有多达 13 种拦截方法,不限于 apply 、 ownKeys 、 deleteProperty 、 //imgq01.71396.com/ca/ek/11c5be704182423e.jpgas 等等是 Object.defineProperty 不具备的; !!! Proxy 返回的是一个 新对象 ,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改; Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利; Object.defineProperty 的优势如下: 兼容性好,支持 IE9,而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平,因此 Vue 的作者( 3.0 )才能用 Proxy 重写。 //Proxy用于修改某些操作的默认行为 let obj = { "name": "gao", "age": 18 }; //取值 let p = new Proxy(obj, { //target䯮对象,key为读取的属性名 get: function (target, key, value) { console.log("获取值key是", key, "获取值value", value); return target[key]; }, //target目标对象,key修改的属性名,value修改的值 set: function (target, key, value) { console.log("target", target); console.log("key", key); console.log("value", value); target[key] = value; } }) console.log(p.name); //读取操作,自动执行get方法 p.age = 999; //设置操作,自动执行set方法 console.log("p",p); /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Object.defineProperty//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>//定义一个对象 let obj = { "name": "wang", "age": 12 }; // 遍历对象 for (let key in obj) { Object.defineProperty(obj, key, { get: function () { console.log("获取值了"); }, set: function () { console.log("设置值了"); } }) } obj.age; //获取值 obj.name = "888888"; //设置值 obj.age = 000;/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>Reflect//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> Reflect 操作对象的方法 1 将属于语言内部的方法,放在 Reflect 上 2 修改了一些方法的返回值,比如报错改为 false 13个方法 //get(目标对象,属性名) let obj = { "name": "gao", "age": 13 }; console.log(obj); console.log(Reflect.get(obj, "name")); //set(目标对象.属性名,值) obj.age = 999; Reflect.set(obj, "age", "999999") console.log(obj); function FancyT//imgq01.71396.com/ca/ek/11c5be704182423e.jpging() { t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.name = "gao"; t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.age = 19; } FancyT//imgq01.71396.com/ca/ek/11c5be704182423e.jpging.prototype.sex = "男"; FancyT//imgq01.71396.com/ca/ek/11c5be704182423e.jpging.prototype.sex = function () { console.log("哈哈"); }; const myObj = new FancyT//imgq01.71396.com/ca/ek/11c5be704182423e.jpging(); //获取原型对象 console.log(Reflect.getPrototypeOf(myObj)); //设置原型对象 let obj3 = { "//imgq01.71396.com/ca/ek/11c5be704182423e.jpgobby": "dfssdfsdf" }; Reflect.setPrototypeOf(myObj, obj3); //获取 console.log( Reflect.getPrototypeOf(myObj) );/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>promise//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 为什么使用 promise ?? 回调函数事件--解决了什么问题?? 优化回调函数事件,挽回回调地狱 promise 定义 : 是一个容器,里面保存着某个未来才会结束的事件的结果,(通常是一个异步操作) 有3个状态 : 进行中( pending ), 已成功( fulfilled ), 已失败( rejected ), 两个结果 : 进行中-->已成功( resolved ), 进行中-->已失败( rejected ) 优点/特点: 对象的状态不收外界影响; 一旦状态改变,就不在改变,任何时候都可以得到这个结果 缺点: 1无法取消 promise ,一旦新建它就会立即执行,无法中途取消 2如果不设置回调函数, Promise 内部抛出的错误,不会反应到外部 3当处于进行中 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成) //-->传统方式,多层嵌套导致 回调地狱 //--------------------------------- $.get("/地址1", function (val) { if (姓名) { $.get("/地址2", function () { if (订单号) { $.get("/地址3", function () { if (订单详情) { $.get("/地址3", function () { if (评价) { } }) } }) } }) } }) //------------------------------------ //定义--创建-- let err = 200; console.log(1); //--1 //定义一个promise let p = new Promise(function (resolved, rejected) { console.log(2); //--2,一旦新建它就会立即执行 //异步操作 if (err == 200) { resolved("成功的结果"); } else { resolved("失败的结果"); } }) console.log(3); //--3 //调用 p.t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen(function (res) { console.log("成功", res); }, function (res) { console.log("失败", res); }) console.log(4);//--4 // catc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg 捕获错误 .t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen可串联写 finally只要状态发生改变都会执行(不管成功失败) p.t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen(function (res) { console.log("成功", res); //---异步的结果 }).catc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg(function (res) { console.log("失败", res); }).finally(function(){ console.log("哈哈哈"); }) //1234打印顺序是????? :1-2-3-4-成功 //从上到下,先同步后异步,/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>promise的使用 ( Ajax简单封装 axios)//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>原生 Ajax let x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr = new XML//imgq01.71396.com/ca/ek/11c5be704182423e.jpgttpRequest(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.open("GET", "./promise.json", true); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.send(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.onreadystatec//imgq01.71396.com/ca/ek/11c5be704182423e.jpgange = function () { if (x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.readyState == 4 && x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.status == 200) { console.log(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.responseText); } } Ajax 封装 类似 jquery function $my(obj) { let {type = "GET", url, success} = obj; let x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr = new XML//imgq01.71396.com/ca/ek/11c5be704182423e.jpgttpRequest(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.open(type, url, true); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.send(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.onreadystatec//imgq01.71396.com/ca/ek/11c5be704182423e.jpgange = function () { if (x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.readyState == 4 && x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.status == 200) { console.log(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.responseText); } } } // 使用封装好的 Ajax 调接口 $my({ type: "GET", url: "./promise.json", success: function (res) { console.log(res); } })ajax-promise 封装 Ajax // ajax-promise 封装 Ajax function $ajax(obj) { let { type = "GET", url, success } = obj; let x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr = new XML//imgq01.71396.com/ca/ek/11c5be704182423e.jpgttpRequest(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.open(type, url, true); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.send(); return new Promise(function (ok, no) { x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.onreadystatec//imgq01.71396.com/ca/ek/11c5be704182423e.jpgange = function () { if (x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.readyState == 4){ if(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.status == 200){ //成功 ok(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.responseText); } }else{ //失败 no("请求失败") } } }) } // promise-ajax 封装的 ajax 调用 $ajax({ type:"GET", url:"./promise.json" }).t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen(function(res){ console.log(res); }).catc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg(function(res){ console.log(res); }) 封装好的 ajax 参考 库 axios : //imgq01.71396.com/ca/ek/11c5be704182423e.jpgttp://www.axios-js.com/ .all 合并,只要有一个失败都失败 .race 那个先成功出来那个 let x = 200; let a = new Promise(function (ok, no) { if (x == 200) { ok("a 成功") } else { no("a 失败") } }) let y = 200; let b = new Promise(function (ok, no) { if (x == 200) { ok("b 成功") } else { no("b 失败") } }) //all合并 类似&& 逗成功才成功,只要有一个失败都失败,回调 //race,竞争 类似|| 哪个成功执行那个回调函数 Promise.all([a, b]).t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen(function (res) { console.log(res); //0: "b成功" //1: "b成功" }).catc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg(function(res){ console.log(res); }) /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>class类//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 回顾面向对象继承 //构造函数 function Gou(name) { t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.name = name; } //共享的方法 - 放在原型对象上 Gou.prototype.say = function () { console.log("哈哈哈哈"); } //实例化,得到对象 let fu = new Gou("gao"); //使用对象 console.log(fu); // 继承 function Zi(name) { Gou.call(t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis, name) //类式继承/借用构造函数继承/改变t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis指向实现继承 } Zi.prototype = new Gou(); //原型链继承 // 实例化子类 let z = new Zi("gao"); console.log(z); class 类 //es6 -------class类 //使用场景:封装组件, react 框架语法使用(难上手,难写,原生js必须过关,灵活度高) class Lei { //属性 constructor(name) { t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.name = name; } //方法 say() { console.log("生生世世"); } } let obj = new Lei("gao"); console.log("obj",obj); obj.say() //继承 关键词 extends class Zilei extends Lei { // 多态: 属性 方法 //------------------------- // constructor(){ // t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.age = 18; //出错 // } //-------------------------- constructor(name) { super(name) //子类构造函数中必须使用 super() 指向父类的构造函数 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.age = 18; //子类自己的属性 } //子类自己的方法 run() { console.log("哈哈"); } } let obj2 = new Zilei("gao"); console.log(obj2);/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>模块化//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 四大步骤:创建模块 --> 导出模块 --> 导入模块 --> 使用 // 2.js //1---创建模块 let a=123; //2---导出模块 export default a;// 1.js //3---载入模块 import a from "./2.js" //4---使用模块 console.log(a); //a为自定义,随便起 /imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml lang="en"> /imgq01.71396.com/ca/ek/11c5be704182423e.jpgead>Document //imgq01.71396.com/ca/ek/11c5be704182423e.jpgead> //imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml> 总结一下: 如果导出方式 export default a 那么载入方式 import 自定义变量名 from "./2.js" 如果导出方式 export a=123; 那么载入方式 import { a } from "./2.js" /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>async异步函数//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 如果有 return ===> 有返回值 ===> 返回值是 promise 对象 ===> 获取返回值通过 .t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen await promise 成功的返回值,如果有 成功的返回值,执行下一步, 如果没有成功的返回值,则会报错,停止执行. let err = 200;//错误改为400测试一下 // 定义一个 promise 对象 let x = new Promise(function(ok,no){ if(err == 200){ ok("正确,成功返回值") }else{ no("错误,失败返回值") } }) async function fn(){ //await 等待 let a = await x; //await 后可以是一个 promise 对象 let b = await 789;//await 后也可以是值, return [a,b]; } console.log( fn() ); fn().t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen(function(res){ console.log(res); }) 应用: //封装好的 AJax function $ajax(obj) { let { type = "GET", url, success } = obj; let x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr = new XML//imgq01.71396.com/ca/ek/11c5be704182423e.jpgttpRequest(); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.open(type, url, true); x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.send(); return new Promise(function (ok, no) { x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.onreadystatec//imgq01.71396.com/ca/ek/11c5be704182423e.jpgange = function () { if (x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.readyState == 4){ if(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.status == 200){ //成功 ok(x//imgq01.71396.com/ca/ek/11c5be704182423e.jpgr.responseText); } }else{ //失败 no("请求失败") } } }) } // 进一步使用 async 和 await async function fn(){ let a = await $ajax({"type":"get","url":"./1.json"}) let b = await $ajax({"type":"get","url":"./1.json"}) let c = await $ajax({"type":"get","url":"./1.json"}) // console.log(a) // console.log(b) // console.log(c) return [JSON.parse(a),JSON.parse(b),JSON.parse(c)] } fn.t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgen( res => console.log(res) )/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>webpack自动化模块化打包//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>文档: //imgq01.71396.com/ca/ek/11c5be704182423e.jpgttps://www.webpackjs.com/concepts/ webpack : 模块化打包机(根据模块依赖打包文件) 默认:打包 js 文件 核心概念: 入口( entry ) 输出( output ) loader : css-loader / file-loader 插件( plugin ): (删除已打包文件,压缩js,压缩css) 模式( mode ) 浏览器兼容性( browser compatibility ) 环境( environment ) 按照 webpack 指南进行配置 //imgq01.71396.com/ca/ek/11c5be704182423e.jpgttps://www.webpackjs.com/guides/getting-started/ 构建服务器热加载开发环境: webpack-dev-server 插件 plugins: 输出//imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml://imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml-webpack-plugins 清理dist 目录: clean-webpack-plugin /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>vue//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 文档: //imgq01.71396.com/ca/ek/11c5be704182423e.jpgttps://cn.vuejs.org/ //imgq01.71396.com/ca/ek/11c5be704182423e.jpgello World小项目开始 通过 cdn 使用vue : js 使用严格模式: use strict /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>1/渐进式框架//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> vue是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计,vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合; 渐进式表现:声明式渲染-->组件系统-->客户福安路由-->大数据状态管理-->构建工具 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>2两个核心(最大的亮点)://imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 响应式数据绑定(双向数据绑定): 当数据发生变化的时候,视图自动更新,即双向数据同步,原理利用了es6中放入Object definedProperty中的setter/getter代理数据,监控对数据的操作. 组合的视图组件(虚拟Dom): 即页面最终映射为一个组件树,采用树形结构进行设计,方便维护,重用. /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>3 虚拟Dom//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 利用再去爱内存中生成与真实 Dom 与之对应的数据结构,这个在内存中生成的结构称之为虚拟Dom,当数据发生变化时,能够智能的计算出重新渲染组件的最小代价并应用到 Dom 操作上. /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>4 MVVM//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> MVVM 是 model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,起核心是提供对View和 ViewModel 的双向数据绑定,这使得 ViewModel 的状态改变可以自动传递给 M : Model (数据层,也就是指数据,前端是 js ) V : View (也就是指 Dom 层或用户界面) VM : ViewModel 处理数据和界面的中间层,也就是指 vue 5声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统 额外补充:渲染分为:命令式渲染和声明式渲染 命令式渲染:命令我们的程序去做什么,程序就会跟着你的命令去一步一步执行 声明式渲染:只需要告诉程序想要的效果,其他的交给程序去做: vue.js 安装: CDN : 对于制作原型或学习,你可以这样使用最新版本 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>NPM://imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 在用 Vue 构建大型应用时推荐使用 NPM 安装。 NPM 能很好地和诸如 或模块打包器配合使用。同时 Vue 也提供配套工具来开发。 $ npm install vue/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>看vue.js源码://imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> component 组件 direction 指令 filte r控制器 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>vue的生命周期//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> beforeCreate created beforeMount mounted beforeUpdated updated beforeDestroy destroyed activated deactived errorCaptured serverPrefetc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg vue 数组方法,只有 pus//imgq01.71396.com/ca/ek/11c5be704182423e.jpg , pop , s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgift , uns//imgq01.71396.com/ca/ek/11c5be704182423e.jpgift , splice , sort , reverse 能够监听到 {{ message }} var app = new Vue({ el: "#app",//vue操作的作用域 //定义数据--model数据模型 data: { message: "//imgq01.71396.com/ca/ek/11c5be704182423e.jpgello Vue!" } }) //上面是id起作用,class是不起作用的,源码中是用queryselector v-bind attribute 被称为 指令 。指令带有前缀 v- ,以表示它们是 Vue 提供的特殊 attribute。 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>1 v-for渲染列表//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> v-for 指令可以绑定数组的数据来渲染一个项目列表var app4 = new Vue({ el: "#app-4", data: { todos: [ { text: "学习 JavaScript" }, { text: "学习 Vue" }, { text: "学习 React" } ] } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>2 v-if//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>当前的年龄是--{{ age }} //imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
- {{ todo.text }}
18" > 年龄大于18
年龄等于18
年龄小于18 const vm=new Vue({ el:"#app", data:{ age:80 } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>3 v-s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgow//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> v-if v-s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgow 区别: v-if 满足条件,加载节点,不满足条件,移除节点 v-s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgow 满足条件,显示,不满足条件, css 样式 display:none 使用场景: 频繁切换:使用 v-s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgow , 不频繁切换使用 v-if 性能: vmv-s//imgq01.71396.com/ca/ek/11c5be704182423e.jpgow :初始消耗高,切换时消耗低 v-if :初始消耗低,切换时消耗高 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>当前年龄是//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
18">年龄>18
年龄=18
年龄<18 const vm=new Vue({ el:"#app", data:{ age:18 } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>4 v-text//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> {{ a }} {{ b }} const vm = new Vue({ el: "#app", data: { a: "//imgq01.71396.com/ca/ek/11c5be704182423e.jpg//imgq01.71396.com/ca/ek/11c5be704182423e.jpg//imgq01.71396.com/ca/ek/11c5be704182423e.jpg//imgq01.71396.com/ca/ek/11c5be704182423e.jpg//imgq01.71396.com/ca/ek/11c5be704182423e.jpg", b: "/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>呵呵//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>" } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>5 v-bind//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> {{ f }}
![]()
123 const vm=new Vue({ el:"#app", data:{ f:"淘宝", g:"//imgq01.71396.com/ca/ek/11c5be704182423e.jpgttps://www.taobao.com", //imgq01.71396.com/ca/ek/11c5be704182423e.jpg:"./", j:"b" } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>6 v-model//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>输入的值为: {{ user }}//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> --> //imgq01.71396.com/ca/ek/11c5be704182423e.jpgead>
/imgq01.71396.com/ca/ek/11c5be704182423e.jpgr /> /imgq01.71396.com/ca/ek/11c5be704182423e.jpgr />
{{ index+1 }} | {{ item.user }} | {{ item.age }} | {{ item.address }} | {{ item.sex }} | {{ item.//imgq01.71396.com/ca/ek/11c5be704182423e.jpgobby.join("/") }} | |
搜索框搜索的值是{{ searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg }} const vm = new Vue({ el: "#app", data: { searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: " " }, //watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg事件监听 一个值变化影响多个值 watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: { "searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg": function (n, old) { console.log("当前值",n); console.log("上次值",old); //ajax请求 } }, met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgods: { fn() { console.log("搜索的的值发生变化", t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg); //ajax请求 } }, })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>事件监听 watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg监听对象//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
搜索框搜索的值是{{ obj.searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg }} const vm = new Vue({ el: "#app", data: { obj: { searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: "" }, }, //watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg事件监听 一个值变化影响多个值 watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: { obj: { //imgq01.71396.com/ca/ek/11c5be704182423e.jpgandler: function (n) { console.log("当前值", n); }, //ajax请求 deep: true,//深度监听 immediate:true//添加之后第一次也可以监听得到 } }, met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgods: { fn() { console.log("搜索的的值发生变化", t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.searc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg); //ajax请求 } }, })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>面试题:met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgodscomputed和 watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg的区别://imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>computed : 计算属性,会缓存,多个值影响一个值,依赖的值发生改变,计算属性则就会改变 watc//imgq01.71396.com/ca/ek/11c5be704182423e.jpg :监听,一个值对应多个值 met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgods : 调用一次执行一次 /imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>面试题:v-if与 v-for优先级哪个高?//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1> 在同一个节点 v-for 比 v-if 优先级高,先循环再判断
名称:{{ info.name }}
产地:{{ info.address }} ` }) var vm = new Vue({ el: "#app", data: { arr:[ {"img":"//imgq01.71396.com/ca/ek/7f3339fd6fa1770e.jpg","name":"小狗","address":"s//imgq01.71396.com/ca/ek/11c5be704182423e.jpganxi"}, {"img":"//imgq01.71396.com/ca/ek/caa41821fa1e6d2c.jpg","name":"小狗","address":"s//imgq01.71396.com/ca/ek/11c5be704182423e.jpganxi"}, {"img":"//imgq01.71396.com/ca/ek/deeab18ec6693e17.jpg","name":"小狗","address":"s//imgq01.71396.com/ca/ek/11c5be704182423e.jpganxi"}, ] } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>封装九宫格组件//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
注意: 不足一行,对其方式 .nav { widt//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: 100vw; display: flex; justify-content: space-between; flex-wrap: wrap; } .nav-item { widt//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: 23vw; text-align: center; } .nav-item>img { widt//imgq01.71396.com/ca/ek/11c5be704182423e.jpg: 100%; //imgq01.71396.com/ca/ek/11c5be704182423e.jpgeig//imgq01.71396.com/ca/ek/11c5be704182423e.jpgt: 190px; }
{{ xx.name }} ` }) const vm = new Vue({ el: "#app", data: { } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>父 -> 子 通信//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
应用 :父组件中有数据 title ,传给子组件去使用 在父组件中,子组件开始标签上 自定义属性 去传递给子组件 :自定义属性="title" 在子组件中 使用 props 接收自定义属性名,传值 为什么不能写为局部组件?写在new vue()里的局部组件是无需属性集合,会报错 !
123 `, met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgods:{ fn(){ console.log("666") } } }) const vm = new Vue({ el:"#app", mounted(){ // 父组件 获取 子组件的数据 和方法 ==> 使用 ref console.log( t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$refs.x )//ref绑定在 //imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml 标签上 ,获取 //imgq01.71396.com/ca/ek/11c5be704182423e.jpgtml dom 标签 console.log( t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$refs.y )//ref 绑在组件上, 获取 vue 组件实例 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$refs.y.fn() //父组件 获取 子组件的数据 和方法 ==> 使用 ref } })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$c//imgq01.71396.com/ca/ek/11c5be704182423e.jpgildren及 t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$parent//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>
t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$c//imgq01.71396.com/ca/ek/11c5be704182423e.jpgildren 获取所有子组件的实例对象
123 `, met//imgq01.71396.com/ca/ek/11c5be704182423e.jpgods:{ fn(){ console.log("666"); } }, mounted(){ console.log( t//imgq01.71396.com/ca/ek/11c5be704182423e.jpgis.$parent ) //获取父组件实例 } }) const vm = new Vue({ el:"#app", })/imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>provide和 inject//imgq01.71396.com/ca/ek/11c5be704182423e.jpg1>