一、es6的语法

1、let与var的区别

  ES6 新增了let命令,用来声明变量。它的用法类似于var(ES5),但是所声明的变量,只在let命令所在的代码块内有效。如下代码:

  1. {
  2.   let a = 10;
  3.   var b = 1;
  4. }
  5. a // ReferenceError: a is not defined.
  6. b //

  上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

  for循环的计数器,就很适合使用let命令,如下代码:

  1. for (let i = 0; i < 10; i++) {
  2.   // ...
  3. }
  4. console.log(i); // ReferenceError: i is not defined

  上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。

2、var变量提升现象,如下代码:
  1. var a = [];
  2. for (var i = 0; i < 10; i++) {
  3.   a[i] = function () {
  4.     console.log(i);
  5.   };
  6. }
  7. a[6](); //

  上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。如果使用let,声明的变量仅在块级作用域内有效,最后输出的是 6。

3、另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
  1. for (let i = 0; i < 3; i++) {
  2.   let i = 'abc';
  3.   console.log(i);
  4. } // abc// abc// abc

  上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。

4、let不存在变量提升

  var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。而let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。如下代码:

  1. // var 的情况
  2. console.log(foo); // 输出undefined
  3. var foo = 2;
  4.  
  5. // let 的情况
  6. console.log(bar); // 报错ReferenceError
  7. let bar = 2;

  上面代码中,变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。

5、let不允许在相同作用域内重复声明同一个变量,如下代码:
  1. // 报错
  2. function func() {
  3.   let a = 10;
  4.   var a = 1;
  5. }
  6. // 报错
  7. function func() {
  8.   let a = 10;
  9.   let a = 1;
  10. }
6、ES6还添加了const命令,const声明一个只读的常量,一旦声明,常量的值就不能改变,如下:
  1. const PI = 3.1415;
  2. PI // 3.1415
  3. PI = 3;
  4. // TypeError: Assignment to constant variable.

  const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。也就是说,const只声明不赋值,就会报错。

  const的作用域与let命令相同,即只在声明所在的块级作用域内生效,不能重复声明,并且不存在变量提升。

7、ES6模板字符串

  模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。模板字符串中嵌入变量,需要将变量名写在${}之中。

  1. let name = 'tom';
  2. let str = `我是 ${name}.`
8、变量的解构赋值

  ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

  ES6 允许写成下面这样:

  1. let [a, b, c] = [1, 2, 3];

  上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

  本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined。

9、函数

  (1)es5的普通函数,function声明函数,如下:

  1.   function add(x) {
  2.     return x;
  3.   };
  4.   add(10); //

  (2)函数对象的写法,如下:

  1.   let add = function (x) {
  2.     return x;
  3.   };
  4.   add(10); //

  (3)es6箭头函数,如下:

  1.   let add = (x) => {
  2.     return x;
  3.   };
  4.   add(10) //

  (4)上面的箭头函数可简写成如下形式:

  1.   let add = x => x;
  2.   add(10); //
  3.  
  4.   // 如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。如下:
  5.   var sum = (num1, num2) => { return num1 + num2; }
  6.  
  7.   // 如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。如下:
  8.   let getTempItem = id => { id: id, name: "Temp" }; // 报错
  9.   let getTempItem = id => ({ id: id, name: "Temp" }); // 不报错
10、es6的对象(this指向问题)

(1)匿名函数中this指向

  1. // 字面量方式声明一个对象person
  2. let person = {
  3. name: "tom",
  4. age: 30,
  5. fav: function () {
  6. console.log(this); // this指向 当前的调用者person对象
  7. console.log(this.name);
  8. }
  9. };
  10. person.fav()
  11. // {name: "tom", age: 30, fav: ƒ}
  12. // tom

(2)对象的单体模式,本质与上个示例一样:

  1. let person = {
  2. name: "tom",
  3. age: 30,
  4. fav(){
  5. console.log(this); // this指向 当前的调用者person对象
  6. console.log(this.name);
  7. }
  8. };
  9. person.fav()
  10. // {name: "tom", age: 30, fav: ƒ}
  11. // tom

(3)箭头函数中this指向

  1. let person = {
  2. name: "tom",
  3. age: 30,
  4. fav: () => {
  5. console.log(this); // this指向 person的父级对象(上下文),即window
  6. console.log(this.name);
  7. }
  8. };
  9. person.fav()
  10. // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
11、es6的类

(1)es5

  1. function Person(name, age) {
  2. this.name = name;
  3. this.age = age;
  4. }
  5. // 基于原型给对象声明方法,原型prototype是当前类的父类(继承性)
  6. Person.prototype.showName = function () {
  7. console.log(this.name);
  8. };
  9.  
  10. let p1 = new Person('alex', 29);
  11. p1.showName() // alex

(2)es6

  1. class Person{
  2. constructor(name='alex', age=29){ // 单体模式
  3. this.name = name;
  4. this.age = age;
  5. }
  6. showname(){ // 单体模式
  7. console.log(this.name); // this指向当前对象Person
  8. }
  9. showage(){
  10. console.log(this.age);
  11. }
  12. }
  13. let p1 = new Person();
  14. p1.showname(); // alex

二、vue的基本语法

1、vue的介绍

(1)前端三大框架(可以去github查看三个框架的 star星):

  vue     尤雨溪,渐进式的JavaScript框架

  react    Facebook公司,里面的(高阶函数 es6)非常多,对初学者不友好

  angular  谷歌公司,目前更新到6.0,学习angular得需要玩一下typescript

(2)cdn方式引用

  1. <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>

(3)下载到本地引用

  1. <script src='./vue.js'></script>

(4)库和框架

  上面vue.js文件是一个库,小而精;

  框架是功能比较齐全,像Django,大而全,功能比较多;

(5)实例化对象

  示例代码:

  1. <script src="./vue.js"></script>
  2. <script>
  3. // 实例化对象
  4. new Vue({
  5. el:"#app",
  6. // 这里data是一个对象,在后续学习中发现data中一般是一个函数
  7. data:{
  8. // 数据属性
  9. msg1:"黄瓜",
  10. person:{
  11. name:"alex"
  12. },
  13. msg2:'hello Vue',
  14. isShow:'True'
  15. },
  16. methods:{
  17. // 该组件中声明的方法
  18. },
  19. watch:{
  20. // 该组件中监听的数据属性
  21. }
  22. });
  23. </script>

  注意:如果是我们自己定义的属性和方法,则全部暴露在外面,如果是vue实例对象自己属性和方法,会在前边加一个”$”进行区分。另外,data中有一个观察者Observer,在观察着一些数据是否发生了改变,若改变,则将改变后的值立马渲染到DOM中对应的地方,控制台查看data效果如下图:

2、vue的模板语法
  1. <div id="app">
  2. <!--模板语法-->
  3. <h2>{{ msg1 }}</h2>
  4. <h3>{{ 'haha' }}</h3>
  5. <h3>{{ 1+1 }}</h3>
  6. <h4>{{ {'name':'alex'} }}</h4>
  7. <h5>{{ person.name }}</h5>
  8. <h2>{{ 1>2?'真的':'假的' }}</h2>
  9. <p>{{ msg2.split('').reverse().join('') }}</p>
  10. </div>
3、vue的思想

  数据驱动视图,设计模式MVVM(model view viewmodel)

4、vue的基本指令(使用指令系统后边一定是字符串,且字符串中的变量一定是数据属性中已有的变量)

(1)vue的指令系统之v-text和v-html(***),如下:

  1. <div id="content">
  2. {{ msg }}
  3. <div v-text="msg"></div> <!-- v-text相当于innerText -->
  4. <div v-html="msg"></div> <!-- v-html相当于innerHTML -->
  5. </div>
  6. <script src="./vue.js"></script>
  7. <script>
  8. // 实例化对象
  9. new Vue({
  10. el:"#content",
  11. // data中是一个函数 函数中return一个对象,可以是空对象,但不能不return
  12. data(){ // 函数的单体模式
  13. return{
  14. msg:"<h2>alex</h2>"
  15. }
  16. }
  17. });
  18. </script>

  效果如下图:

(2)条件渲染v-if和v-show,如下:效果如下图:

  1.   <div class="box1" v-show="isShow">hello</div>
  2.   <div class="box2" v-if="isShow">hello</div>

  分析:isShow为真则显示div,为假则不显示;

  区别:v-show为假时相当于display:none;v-if为假时相当于移除该div,但是有一个占位的注释”<!-- -->”;

  官网对v-if和v-show的区别:

    1)v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

    2)v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

    3)相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

    4)一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

  v-if与v-else:可以使用 v-else 指令来表示 v-if 的“else 块”:

  1. <div v-if="Math.random() > 0.5">
  2. Now you see me
  3. </div>
  4. <div v-else>
  5. Now you don't
  6. </div>
  7. // 注意:v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

(3)v-bind和v-on

  v-bind:标签中所有属性,如img标签的src alt,a标签的href title id class等,如下:

  1.   <img v-bind:src="imgSrc" v-bind:alt="msg">

  v-bind:class='{active:isActive}'表示若isActive(数据属性中定义的变量)为真,则对应div增加active类,否则不增加,如下:

  1.   <div class="box" v-bind:class='{active:isActive}'></div>

  v-on:监听js中的所有事件,如click,mouseover,mouseout等,如下:

  1.   <button v-on:click="clickHandler">切换颜色</button>

  v-bind的简便写法是":",如:<div class="box" :class='{active:isActive}'></div>

  v-on的简便写法是"@",如:<button @click="clickHandler">切换颜色</button>

(4)列表渲染v-for(不仅可以遍历数组,还可以遍历对象),如下:

  1. <div id="app">
  2. <ul v-if="res.status === 'ok'">
  3. <!-- v-for的优先级是最高的 diff算法 -->
  4. <li v-for='(item,index) in res.users' :key="item.id">
  5. <h3>{{ item.id }} -- {{ item.name }} -- {{ item.age }}</h3>
  6. </li>
  7. </ul>
  8. <div v-for='(value,key) in person'>
  9. {{ key }}-----{{ value }}
  10. </div>
  11. </div>
  12. <script src="./vue.js"></script>
  13. <script>
  14. new Vue({
  15. el:"#app",
  16. data(){
  17. return {
  18. res: {
  19. status: 'ok',
  20. users: [
  21. {id: 1, name: 'alex', age: 18},
  22. {id: 2, name: 'wusir', age: 30},
  23. {id: 3, name: 'yuan', age: 48}
  24. ]
  25. },
  26. person: {
  27. name: 'tom'
  28. }
  29. }
  30. },
  31. methods:{
  32. // 该组件中声明的方法
  33. },
  34. watch:{
  35. // 该组件中监听的数据属性
  36. }
  37. });
  38. </script>

  总结:遍历数组时,一个参数是值,两个参数是(值,索引);遍历对象时,一个参数是值,两个参数是(值,键)。

  注意:一定要绑定一个标识(有id就绑定id,没有id绑定index),则值改变会直接通过key查找,而不用再去遍历查找,提升效率。

Vue应用示例

1、实现轮播图,代码如下:
  1. <div id="app">
  2. <img :src="data:images[currentIndex].imgSrc" @click="imgHandler" alt="">
  3. <br />
  4. <button @click="prevHandler">上一张</button>
  5. <button @click="nextHandler">下一张</button>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. <script>
  9. // Vue实例对象,可以有返回值vm,官网中就是用vm代表Vue实例对象
  10. let vm = new Vue({
  11. el: '#app',
  12. data() {
  13. return {
  14. // 实际项目中images这个数据以及图片是后端返回过来的
  15. images:[
  16. {id:1, imgSrc:'./images/1.jpg'},
  17. {id:2, imgSrc:'./images/2.jpg'},
  18. {id:3, imgSrc:'./images/3.jpg'},
  19. {id:4, imgSrc:'./images/4.jpg'}
  20. ],
  21. currentIndex:0
  22. }
  23. },
  24. methods:{
  25. nextHandler(){
  26. this.currentIndex++;
  27. if(this.currentIndex == 4){
  28. this.currentIndex = 0;
  29. }
  30. },
  31. prevHandler(){
  32. this.currentIndex--;
  33. if(this.currentIndex == -1){
  34. this.currentIndex = 3;
  35. }
  36. },
  37. imgHandler(e){
  38. console.log(e); // e是当前事件对象
  39. console.log(e.target); // 当前事件对象的目标对象
  40. console.log(this); // this指当前Vue实例对象
  41. }
  42. },
  43. // 组件创建完成时调用created函数,可发送ajax
  44. created(){
  45. // 注意:开定时器就要清定时器,后面会介绍在destroyed函数中清掉
  46. setInterval(()=>{
  47. // 定时器中若不用箭头函数则this指则定时器对象
  48. console.log(this); // 这时this指当前Vue实例对象
  49. this.currentIndex++;
  50. if(this.currentIndex == 4){
  51. this.currentIndex = 0;
  52. }
  53. },2000);
  54.  
  55. // 若定时器中不用箭头函数,也可以用下面方式
  56. let _this = this;
  57. setInterval(function () {
  58. console.log(_this); // _this指当前Vue实例对象
  59. },2000)
  60. }
  61. })
  62. </script>

示例代码

2、Vue中使用ajax(created是组件创建完成时执行),代码如下:
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <style>
  8. span.active{color:red}
  9. </style>
  10. </head>
  11. <body>
  12. <div id="app">
  13. <span @click="clickHandler(index, category.id)"
  14. v-for="(category,index) in categoryList"
  15. :key="category.id"
  16. :class="{active:index==currentIndex}">
  17. {{ category.name }}
  18. </span>
  19. </div>
  20. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  21. <script src="jquery.min.js"></script>
  22. <script>
  23. let vm = new Vue({
  24. el: '#app',
  25. data() {
  26. return {
  27. categoryList:[],
  28. currentIndex:0
  29. }
  30. },
  31. methods:{
  32. clickHandler(i, id){
  33. this.currentIndex = i;
  34. // 发起请求
  35. $.ajax({
  36. url:`https://www.luffycity.com/api/v1/courses/?sub_category=${id}`,
  37. type:'get',
  38. success:function (res) {
  39. console.log(res);
  40. }
  41. })
  42. }
  43. },
  44. // 组件创建完成时调用created函数,可发送ajax
  45. created(){
  46. $.ajax({
  47. url:'https://www.luffycity.com/api/v1/course_sub/category/list/',
  48. type:'get',
  49. success:(res) => { // 若不用箭头函数,则this指当前ajax对象
  50. console.log(res); // res是请求接口收到的数据
  51. // 根据响应数据的状态字段判断是否成功
  52. if(res.error_no === 0){
  53. var data = res.data;
  54. this.categoryList = data; // this指当前Vue实例对象
  55. let obj = {
  56. id:0,
  57. name:'全部',
  58. category:0
  59. };
  60. // unshift方法表示在数组前插入一个元素
  61. this.categoryList.unshift(obj)
  62. }
  63.  
  64. },
  65. error:function (err) {
  66. console.log(err);
  67. }
  68. })
  69. }
  70. })
  71. </script>
  72. </body>
  73. </html>

示例代码

  页面运行效果如下图:

  依次点击每一项,控制台效果如下图:

3、实现音乐播放器,代码如下:
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <style>
  8. .active{color:blue}
  9. </style>
  10. </head>
  11. <body>
  12. <div id="music">
  13. <!-- audio 是HTML5的新标签 -->
  14. <!-- @ended 播放完成会自动调用该方法 -->
  15. <audio @ended="nextHandler" :src="musicList[currentIndex].songSrc" controls autoplay></audio>
  16. <ul>
  17. <li @click="songHandler(index)"
  18. v-for="(item,index) in musicList" :key="item.id"
  19. :class="{active:index==currentIndex}">
  20. <h5>歌名:{{ item.name}}</h5>
  21. <p>歌手:{{ item.author}}</p>
  22. </li>
  23. </ul>
  24. </div>
  25. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  26. <script>
  27. let musicList = [
  28. {
  29. id:1,
  30. name:'于荣光 - 少林英雄',
  31. author:'于荣光',
  32. songSrc:'./static/于荣光 - 少林英雄.mp3'
  33. },
  34. {
  35. id:2,
  36. name:'Joel Adams - Please Dont Go',
  37. author:'Joel Adams',
  38. songSrc:'./static/Joel Adams - Please Dont Go.mp3'
  39. },
  40. {
  41. id:3,
  42. name:'MKJ - Time',
  43. author:'MKJ',
  44. songSrc:'./static/MKJ - Time.mp3'
  45. },
  46. {
  47. id:4,
  48. name:'Russ - Psycho (Pt. 2)',
  49. author:'Russ',
  50. songSrc:'./static/Russ - Psycho (Pt. 2).mp3'
  51. }
  52. ];
  53. new Vue({
  54. el: '#music',
  55. data() {
  56. return {
  57. musicList:[],
  58. currentIndex:0
  59. }
  60. },
  61. methods:{
  62. songHandler(i){
  63. this.currentIndex = i
  64. },
  65. nextHandler(){
  66. this.currentIndex++;
  67. if(this.currentIndex == 4){
  68. this.currentIndex = 0;
  69. }
  70. }
  71. },
  72. created(){
  73. // 实际项目中往往向后台要数据,赋值给数据属性
  74. this.musicList = musicList
  75. }
  76. })
  77. </script>
  78. </body>
  79. </html>

示例代码

Vue基础知识

1、计算属性(主要产生缓存的数据属性,防止DOM性能消耗)

  模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

  1. <div id="example">
  2. {{ message.split('').reverse().join('') }}
  3. </div>

  在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。所以,对于任何复杂逻辑,你都应当使用计算属性。例如:

  1. <div id="example">
  2. <p>原数据: "{{ message }}"</p>
  3. <p>翻转后的数据: "{{ reversedMessage }}"</p>
  4. </div>
  5.  
  6. var vm = new Vue({
  7. el: '#example',
  8. data: {
  9. message: 'Hello'
  10. },
  11. computed: {
  12. // 计算属性的 getter(计算属性默认只有getter方法),计算属性要有返回值
  13. reversedMessage: function () {
  14. return this.message.split('').reverse().join('') // `this`指向vm实例
  15. }
  16. }
  17. })
2、侦听器(watch)

  虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

  watch可以监听单个属性,如果想监听多个属性,则声明多个属性的监听,如下:

  1. <div id="app">
  2. <p>{{ msg }}</p>
  3. <button @click='clickHandler'>修改</button>
  4. </div>
  5. <script src="vue.js"></script>
  6. <script>
  7. new Vue({
  8. el:'#app',
  9. data(){
  10. return {
  11. msg:"alex",
  12. age:18
  13. }
  14. },
  15. methods:{
  16. clickHandler(){
  17. this.msg = "wusir"
  18. }
  19. },
  20. watch:{
  21. // 监听属性'msg'
  22. 'msg':function (value) {
  23. console.log(value);
  24. if (value === 'wusir'){
  25. this.msg = '大武sir';
  26. }
  27. },
  28. // 监听属性'age'
  29. 'age':function (value) {
  30.  
  31. }
  32. }
  33. })
  34. </script>

  注意:计算属性即可以监听单个属性,又可以监听多个属性,如下示例:

  1. <div id="app">
  2. <p>{{ myMsg }}</p>
  3. <button @click='clickHandler'>修改</button>
  4. </div>
  5. <script src="vue.js"></script>
  6. <script>
  7. new Vue({
  8. el:'#app',
  9. data(){
  10. return {
  11. msg:"alex",
  12. age:18
  13. }
  14. },
  15. methods:{
  16. clickHandler(){
  17. this.msg = "wusir";
  18. this.age = 20;
  19. }
  20. },
  21. computed:{
  22. myMsg: function () {
  23. // 即监听msg属性,又监听age属性
  24. return `我的名字叫${this.msg},年龄是${this.age}`;
  25. }
  26. }
  27. })
  28. </script>
3、计算属性的应用(上例中音乐播放器改为计算属性实现)

  修改audio标签的src属性值,如下:

  1. <audio @ended="nextHandler" :src="currentSong" controls autoplay></audio>

  Vue实例中增加计算属性computed,如下:

  1. computed:{
  2. currentSong(){
  3. // 既监听了musicList,又监听了currentIndex
  4. return this.musicList[this.currentIndex].songSrc
  5. }
  6. }

  总结:计算属性的方法即可以在模板语法中使用,又可以在指令系统中使用。

4、关于函数中this指向的问题

  Vue实例对象中,一般methods和computed中定义的函数中的this是指当前Vue实例对象,而created中的ajax和定时器中定义的函数中的this是指ajax或者定时器对象,这时,ajax和定时器中的函数改为箭头函数,就可以改变this的指向,即this指向当前Vue实例对象。

五、补充知识点

1、查看接口,如下图:

2、json在线格式化工具

  http://www.bejson.com/

3、自己查阅资料了解js中闭包。

Vue(1)- es6的语法、vue的基本语法、vue应用示例,vue基础语法的更多相关文章

  1. JavaSE入门学习7:Java基础语法之语句(下)

    继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...

  2. Java基础语法01——变量与运算符

    本文是对Java基础语法的第一部分的学习,包括注释:标识符的命名规则与规范:变量的数据类型分类以及转换:以及六种运算符(算术.赋值.比较.逻辑.三元和位运算符).

  3. Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

    Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...

  4. Vue 1-- ES6 快速入门、vue的基本语法、vue应用示例,vue基础语法

    一.ES6快速入门 let和const let ES6新增了let命令,用于声明变量.其用法类似var,但是声明的变量只在let命令所在的代码块内有效. { let x = 10; var y = 2 ...

  5. webstorn中的vue文件识别es6代码

    webstorn中的vue文件识别es6代码 1.webstorm中es6语法报错,解决方法: 打开 Settings => Languages & Frameworks => J ...

  6. vue 初识(基础语法与数据驱动模型)

    1.es6的语法 let 特点: 1.局部作用域 2.不会存在变量提升 3.变量不能重复声明 const 特点: 1.局部作用域 2.不会存在变量提升 3.不能重复声明,只声明常量 不可变的量 模板字 ...

  7. python 全栈开发,Day89(sorted面试题,Pycharm配置支持vue语法,Vue基础语法,小清单练习)

    一.sorted面试题 面试题: [11, 33, 4, 2, 11, 4, 9, 2] 去重并保持原来的顺序 答案1: list1 = [11, 33, 4, 2, 11, 4, 9, 2] ret ...

  8. 2-5 vue基础语法

    一.vue基础语法 语法: {{msg}} html赋值: v-html="" 绑定属性: v-bind:id="" 使用表达式: {{ok? "ye ...

  9. Vue学习-基础语法

    Vue v-if指令 Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTM ...

随机推荐

  1. 使用 xlue 实现 tips

    经常遇到如下的需求 鼠标hover到目标对象一定时间后,弹出tips或者窗口; 鼠标离开目标对象一定时间后,隐藏tips或者窗口; 鼠标从目标对象移动到弹出的窗口上,这种状况下不隐藏窗口; 考虑到这种 ...

  2. 5.14日学习内容1:jquery表单相关知识

    <script> $comment.animate({height:'+=50'},400);//在原来的基础上加50: $('.smaller').click(function(){ i ...

  3. ORACLE的显式游标与隐式游标

    1)查询返回单行记录时→隐式游标: 2)查询返回多行记录并逐行进行处理时→显式游标 显式游标例子: DECLARE CURSOR CUR_EMP IS SELECT * FROM EMP; ROW_E ...

  4. mybatis expected at least 1 bean which qualifies as autowire candidate for this dependency

    错误原因:没有引入相应mapper接口,导致spring没有找到依赖 解决方法一:使用注解的方法: 首先在spring配置文件中添加 <bean class="org.mybatis. ...

  5. 结构体sockadrr、sockaddr_in、in_addr的定义

    /* Internet address.  */typedef uint32_t in_addr_t;struct in_addr  {    in_addr_t s_addr;  };  typed ...

  6. UTF8转换为GB编码gb2312转换为utf-8

    这个方法是用windows的字符集转换的,跟sybase 的unicode码表可能在某些符号上有差别,对于大部分字符来说,尤其是 汉字,应该不会有问题的,如果要求比较高的话,可以买sybase的 un ...

  7. 【python】map list for 运行时长测试

    import time,sys reps=1000 size=10000 def tester(func,*args): starttime=time.time() for i in range(re ...

  8. MathType可以编辑物理公式吗

    很多的物理专业的人都在为编辑物理公式头疼,其实要写出这些公式并不难,要写出这些物理公式,那你就需要一个MathType公式编辑器!这是一款专业的公式编辑器,不管多复杂的公式或方程,都可以用它编辑出来, ...

  9. Numpy常用金融计算(一)

    In [41]: a=[1,2,3,4,5,5,6,6,7,8,8,9,9] # list类型数组 In [42]: b=nu.mean(a) #调用numpy.mean方法计算数组元素的算术平均值 ...

  10. android 性能測试CTS篇

    CTS介绍 一.CTS简单介绍 CTS 全称Compatibility Test Suite兼容性測试工具. 当电子产品开发出来.并定制了自己的Android系统后,必需要通过最新的CTS检測.以保证 ...