1.let和const的使用
1.因为var声明变量会有变量提升的问题
const声明的变量跟let相似,但是const声明的变量是常量
使用let声明有以下几个特点:(1) 不存在变量提升
(2) 不允许重复声明
(3)块级作用域
var arr = [] for (var i = 0; i < 10; i++) { arr[i] = function(){ console.log(i) //只有在函数中的称为作用域,如:function后的 } '{ console.log(i) }' 是作用域 } arr[3]() //输出结果 10 因为用来计数的循环变量泄露为全局变量 原因:等价于 var i ;for(i =0;........ 循环时arr[0],arr[1]...等 赋给他的只是一个函数(列表中有10个 ' function(){console.log(i)}'),执行完之后,i又进行了i++一次,此时,i = 10 var arr = [] for (let i = 0; i < 10; i++) { arr[i] = function(){ console.log(i) } } arr[3]() //输出结果 3 变量提升:当解析脚本的时候,当在脚本中遇到var声明的变量,会将var a;提到最上面去声明。由此,会使a,是一个全局变量
2.模板字符串
let name = '超哥';
let age = 18;
let strongstr = `我是${name},今年${age}岁了`
3.箭头函数( function()等价于()=>)
普通函数 function add(){ return 5 } 函数表达式 let add = function(){ return 5 } 自执行函数 (function(形参){ return 5 })(实参) 箭头函数 add =(a,b)=>{ return a+b } console.log(add(3,4))
4.单体模式
let person={ name:'alex', age:18, fav(){ console.log(this) console.log(this.name); setInterval(()=>{ console.log(this.age++); },2000000) } } person.fav(); //字面量方式创建对象 let person2={ name:'alex2', age:18, fav:()=>{ console.log(this) } } person2.fav() 对象单体模式 class Student{ constructor(name,age){ this.name = name; this.age = age; } fav(){ console.log(this) } } let s17 = new Student('alex',18) s17.fav()
5.指令系统
<body> <div id="app"> {{ message }} </div> <div id="app-3"> <p v-if="seen">现在你看到我了</p> </div> <div id ='app-4'> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </div> <div id='app-5'> <p>{{ message }}</p> <button v-on:click="reverseMessage">逆转消息</button> </div> <div id="app-6"> <p>{{ message }}</p> <input v-model="message" /> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) var app3 = new Vue({ el: '#app-3', data: { seen: true } }) var app4 = new Vue({ el: '#app-4', data: { todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] } }) var app5 = new Vue({ el: '#app-5', data: { message: 'Hello Vue.js!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join('') } } }) var app6 = new Vue({ el: '#app-6', data: { message: 'Hello Vue!' } }) </script> </body>
6.双向数据绑定 : v-model
7.组件
let bus=new Vue({}) let Vpingxing=Vue.component('Vpingxing',{ data(){ return{ } }, methods:{ //和 Vheader为平行组件之间的传值,bus为媒介 clickhandler(){ bus.$emit('myBus','alex') } //传值流程:Vpingxing-->bus-->Vheader }, template:`<div class='pingxing'>我是平行组件 <button @click='clickhandler'>我是平行组件</button> </div>` }) let Vheader=Vue.component('Vheader',{ //全局组件 data(){ return{ } }, methods:{ //methods:触发后执行事件 handlerClick(){ //触发后将数据传给 bus.$on('myBus',(val)=>{ //接收组件中的传过来的值,他们两个为平行组件 this.val=val; }; console.log('-->1111') this.$emit('handler','alex') //$emit:传值 , }, //handler是下面父组件中定义的触发事件 }, created(){ // 组件创建完成。 钩子函数 ,组件创建就触发钩子函数中的方法 }, props:['myName'], //’props‘ :子组件,用于接收父组件的数据 components:{ }, template:`<div class='header'> <div class='header'>等春嫁给深秋以后</div> <div>{{ myName }} </div> <button @click='handlerClick' >触发组件的按钮</button> </div>` //点击后触发methods中的'handlerClick' 事件 }) let App={ //声明组件 data(){ return{ name:'超哥' } }, methods:{ clickHandler(name){ alert(`来啦${ name }`); this.name = name }, }, template:`<div class='app'> <div class='content'>最后被你看通透</div> <Vheader v-bind:myName='name' @handler='clickHandler' /> <div class='footer'>等我把脸皮磨厚</div> <Vpingxing/> </div>` } new Vue({ el:'#app', data(){ return { } }, methods:{ }, components:{ //子组件挂载 App }, template:`<App></App>` //用子组件 })