VUE 总结 (持续刷新。。。)

VUE 总结 (持续刷新。。。)


VUE是渐进式框架

  • 可将VUE作为一部分应用嵌入
  • 可以使用全家桶构建整个项目

MVVM

  • View:视图层,DOM层,展示信息

  • Model: 从服务器请求来的数据

  • VueModel: 视图模型层,沟通view和model。一方面实现data binding,将model改变反映到view,一方面实现dom listener,当dom发生一些事件,可以被监听,并在需要时改变对应数据。

Vue实例options对象属性

  • el(string):决定实例会管理哪个DOM

  • data(Object | Function):子组件中的data必须是函数,并返回对象。数据对象。

  • methods ({[key: string]: Function}):vue中的方法

  • computed 计算属性

  • filters:过滤器 {{ message|capitalize }} v-bind:"message|capitalize" 拿到message的只进行方法过滤

  filters: {
    captitalize: function(value) {
        if (!value) return ''
          value = value.toString()
          return value.charAt(0).toUpperCase() + value.slice(1)
    }
  }
所有组件都继承自vue源型
vue.prototype.test = function(){...("test")}
组件中 this.test()

模板语法

  • Mustache:{{name}} 标签中使用,也可以是表达式

  • v-once:数据只渲染一次

  • v-html:按照string的html解析出来并渲染 v-html="http://www.baidu.com"

  • v-cloak:避免浏览器出现未来得及编译的mustache标签,直接显示编译后的内容

  • v-bind:语法糖(:) 将标签属性和vue data进行动态绑定 绑定class 绑定style

  :class="{'active': isActive, 'line': isLine}"  
  :style="{color: currentColor, fontSize:fontSize+'px'}"  对象语法
  :class="{'active','line'}" 
  :style="[baseStyles]"  数组语法
  • 计算属性:需要对数据进行进一步转化后才显示。计算属性有getter和setter方法,但set方法不常用,故而不显示。计算属性相比于methods会进行缓存,多次使用只会调用一次。
  

书籍价值

name=".."
  • v-on:语法糖(@) 监听用户点击,拖拽等交互式事件。
在定义事件时写方法忽略了小括号,而方法又需要一个参数,vue会默认将浏览器产生的event事件对象作为参数传入方法
 不传参数可以省略() 方法会将event原生事件传进去
  拿到事件可以进行一些事件处理(.stop,.prevent,.native,.once)
@click.stop 阻止冒泡 
点击子,扶不会被调用 .prevent 阻止事件自己去方法处理数据 keyup.enter="keyup" 监听敲击回车抬起后触发 .native 自定义组件需要加native才会触发
  • vue响应式会监听数组改变的方法:push(), pop(), shift()删除第一个元素,unshift()头部添加元素,splice(),sort(),reverse()
  arr.splice(2, 0, "wang") index=2的位置插入元素
  arr.splice(2, 3, "wang") index=2的位置开始向后删除3个元素
  arr.splice(2, 1, "wang") 删除index=2的元素,并用wang代替
  arr.splice(2, 3,"wang") 从index=2开始删除三个元素,并插入一个元素wang
  arr.slice(6) 提取index=6开始到最后的字符串
  arr.slice(6, 10) 提取index从6到10的字符串
  • v-model:实现表单元素和数据元素的双向绑定。实质上是语法糖

  <==> vbind绑定表单元素 von给数据元素绑定input事件
 
  v-model : radio(单选框) checkbox(复选框) select(复选框)
  v-model.lazy(数据失去焦点或回车才会更新) .number(输入内容自动转换为数字类型) .trim(去掉首尾空格) 
  • input
 

如果input不加key,当先在账号框输入123时,vue内部会维护一个虚拟dom,当判断下一个input会直接使用vsdom,导致切换到邮箱框仍显示123,所以需要用key来通知vue区新创建一份儿

ES6 语法

  • let/var:var只有在函数中才有作用域,在其他地方无作用域。而let具有块级作用域,es5 if,for无块级作用域,es6中if,for有块级作用域
  • const:常量,const obj={ name:"why" },obj.name=shuai,const只能保证变量指向内存地址的数据不变,但是对于对象,数组,function等复合变量无法保证指针指向的地址数据结构不变
# 剩余运算符
let [a,...b]=[1,2,3] // a=1,b=[2,3]
let {a,b,...rest}={a:10,b:20,c:20,d:40} // a=10,b=20,rest={c:30,d:40}
function sum(...num){
    var sumNum=0;
    for (let i=0;i  let sum = nums.reduce((x,y)) => {return x+y})
              sumNum += parserInt(num[i])                      
    }
    console.log(sumNum)
}
#  拓展运算符
let person = {name: "amy", age:15}
let someone = {...person} //拷贝了一份儿
let someone = {...person, name:"mike"} // {name:mike, age:15} 后面会覆盖前面的
let someone = {name:"mike", ...person} // {name: "amy", age:15} 后面会覆盖前面的
object.assign(target,object2,object3) // 对象浅拷贝
assign([2,3],[5]) // [5,3] 
    [2,3] -> {0:2,1:3}
    {0:2,1:3} -> {0:5, 1:3}
    -> [5,3]
# MAP object
obj的键只能存字符串或symbols,而map可以存任意值,有序,size获取个数
var myMap = new Map() myMap.set(skyFunc,"123") myMap.get(keyFunc)
迭代
for (var [key, value] of myMap) {
    console.log()key+"="+value
}
var key of myMap.keys()
   value        .values()
  myMap.forEach(function(value,key){
    key+value
  },myMap)
const person = {
    seyHi(){
        .log("hi")    person.hi()
    }
}
object.is(value1,value2) === 判断两对象是否严格相同
is(1,1) true is([1],[1]) false is({g:1},{g:1}) false
# set 存储唯一值
let mySet = new set()
mySet.add(1)  .add(1,5)
# array
myArray = [...mySet]
去重 var mySet = new set([1,2,3,4,4])  [...mySet] // [1,2,3,4]
并集 new Set([...a, ...b])
交集       ([...a.filter(x=>b.has(x))])
差集       ([...a.filter(x=>!b.has(x))])
# 字符串
 .includes .startswith .endswith .indexof .lastIndexOf .repeat(2) // "123,123"
模板字符串 let name="mike" `my name is ${name}`  ${f()} 调用函数
# 增强字面量
对象增强写法,增强字面量:let obj = { name, obj } <==> let obj = { name: name, age: age }   test: function() {} <==> test () {}
const age=12, name="amy" const person={age, name}
# 函数
function f(...value) {
    ... value.length     f(1,2) f(1,2,3,4)
}
var f = (a,b) => a+b
var f = (id,name) => ({id:id, name:name}) 对象需要加()
# 箭头函数体中this对象,是定义函数时对象而不是使用函数的对象
function fn(){
    setTimeout(()=>{
        (this.a)  // this绑定的是fn中的this对象
    }, 0)
}
(param1 ... paramN) => {statements}
                    => expression <=> {return expression}
只有一个参数时圆括号可选 singleParam => {statements}
无参数可写成圆括号 () => {statements}
let f = ([a,b]=[1,2],{x,c}={x:a+b}) => a+b+c // f() 6
function(element) {return element.length}
= (element) => {return element.length}
= element => {return element.length}
= element => element.length
var func = () => ({foo:1}) # 对象自必须加()
render:h=>(App) <=> render(h){ return h(App) }
# 导入导出
import {myName,myClass} from "./test.js"
let myName = "Tom"
export {myName as exportName}
import {exportName} from "./test.js"
Promise
  • 异步编程的一种解决方案,封装一个网络请求,不能立即拿到结果,往往会传入一个函数,在数据请求成功后,将数据通过传入的函数回调出去,异步操作
  链式调用
  new Promise((resolve, reject) => {
      setTimeout(function() {
          resolve('Hello World') // 成功时调用resolve, 后续的then会被回调
      }, 1000)
  }).then(data => {
      console.log(data) // Hello World
      return Promise.resolve(data+'111') // 可以简写为 return data+'111'
  }).then({
      console.log(data) // Hello World111
      return Promise.resolve(data+'222')
  }).then(error => {
      console.log(data) // Hello World111222
      return Promise.reject(data+'error')  // 失败时调用reject, 后续的catch会被回调
  }).then({
      console.log(data) // 不会执行
      return Promise.resolve(data+'333')
  }).catch({
      console.log(data) // Hello World111222error
    return Promise.resolve(data+'444
  }).then({
      console.log(data) // Hello World111222error444
  
  Promise的三种状态:
  pending:等待 正在进行网络请求时,或者定制器没有到时间
  fulfill:满足状态 当我们主动回调了resolve时,处于该状态,并且会回调.then()
  reject:拒绝状态 当我们主动调用了reject时,并且会回调.catch()

条件判断与循环遍历

  • v-if,v-else-if, v-else: 问题:如果input标签中的元素已经被写入内容,在条件判断切换类型以后内容还在,因为Vue在进行DOM渲染的时候,会尽可能复用已经存在的元素。解决:为input添加key元素,保证key的唯一性,就不在复用。
  • v-show

    和if区别:if不显示不会渲染DOM,show不显示仅仅是设置样式display:none,当if条件时false时,包含v-if元素根本就不会在DOM中,而v-show只是给元素增加了display:none的行内样式
  • v-for 最好加上key。说明:VUE在插入节点时会使用DIFF算法,也就是会将要更新的节点先覆盖插入位置,再往后逐次更新,最后插入最后一个元素,因此需要用key来给每个节点做唯一标识,算法就可以正确识别节点。为了高效的更新虚拟DOM。
  • {{value}}-{{key}}-{{index}}
  • info : { name: 'wang' }

    组件

    全局组件注册语法糖
    vue.component('cpn',{
        template:`
            
    ` }) 注册局部组件 const app = new Vue({ .. components:{ 'cpn2':{ templates .. } } }) # 模板分离 1. script 标签
    通信
    父传子
    • 父节点通过props属性值向子组件传递数据
    子组件中: props: ['message-zi']
    父组件中: data: { message-fu: 'hello' }
     通过vbind监听父组件message-fu,将数据给message-zi
     在子组件模板中使用
    
    • props可以是数组,对象,优先使用对象形式 props: { A: Number, B: [string, Number], C: { type: string, required: true}, D: {type: Number, default: 100}, E : {type: Object, default: function() {return { message: ’hello‘}}}} 对象或数组的默认值必须从一个工厂函数中获取
    子传父
    • 子组件通过$emit()触发事件,父组件通过v-on监听事件
    子组件方法:increment(){
        this.counter++;
        this.$emit('increment', this.counter)  子组件发出事件
    }
    子组件模板:
    子组件接受父组件参数后就不要对这个属性修改,修改要由父组件完成
    子组件