vue杂记

一、数组

Vue数据驱动(主要操作的是数据)

数据类型 number string boolean object null undefined Function symbol(es6)

前后台交互一般处理 对象{} 数组[]

操作数组的方法(括号中的能改变原数组,数组变异)

ES4  (pop  push  unshift  shift  slice  revert  sort)  indexOf  lastIndexOf contact slice

ES5  forEach filter map some every reduce  

ES6  includes find

声明式(不关心如何实现)

编程式(关心实现)

forEach

Let arr=[1,2,3,4,5]

//不支持return

arr.forEach(function (item,index){//每一项 索引

 })

forEach ,for in, for ,for of

for in  //key会变成字符类型,包括可枚举的属性

for of  //支持return 并且值是of数组(不能遍历对象)

Let obj={id:1,age:12}  //Object.keys将对象作为新数组 然后再调用for of

For(let val of Object.keys(obj)){

Obj[val];

}

Filter  删除项

//是否操作原数组 不  

//返回结果 过滤后的新数组  

//回调函数的返回结果:true,表示这一项放到新数组

Let arr=[1,2,3,4,5]

Let newArr=arr.filter(function(item,Index){

return Item>2&&item<5;

})

Map  更新项

//映射 将原有数组映射成新数组

Let newArr=arr.map(function(item,Index){

return `

  • ${item}
  • `;  //``es6的模板字符串 遇到变量用${}取值

    })

    includes 查找是否存在

    返回的是Boolean

    Let arr=[1,2,3,4,5]

    arr.includes(6)  //false

    FInd    找到具体的某一项

    arr.find(function(item,index){   })  //true,停止循环返回当前item;找不到返回undefined

    Some true,找到true后停止返回true

    Every false,找到false后停止返回false

    arr.some(function(item,index){   })  arr.every(function(item,index){   })

    Reduce 收敛函数,四个参数,返回迭代后的结果

    prev,next,index,item   分别指前一个(即当前值)、下一个、索引、原数组

    Let arr=[1,2,3,4,5]

    arr.reduce(function(prev,next,index,item){  

    Console.Log(arguments)

    //return prev+next  //求和,且会作为下一次的prevprev是上一次循环的return

     })

    1        2 1 [12345]

    Undefined 3 2 [12345]

    而对于数组里存放的是对象的话

    Let objArr=[{count:1},{count:2},{count:3}]

    Let sum1=objArr.reduce(function(prev,next,index,item){  

    return prev.count+next.count  //此时需要return对象,返回下一次循环会报错

     })

    Sum1=NAN

    此时需要给数组添加一个初始值0

    Let objArr=[0,{count:1},{count:2},{count:3}] 使用修改为

    objArr.reduce(function(prev,next,index,item){  

    return prev+next.count  //此时可保证正确累加

     })

    或者不改数组,而是在方法添加第二个参数(第一个参数为function

    objArr.reduce(function(prev,next,index,item){  

    return prev+next.count  //此时可保证正确累加

     }0)

    二维数组变成一维数组

    Let arr=[[1,2,3],[4,5,6],[7,8,9]]

    Arr.reduce(function(prev,next){

    Return prev.concat(next);

    })

    或者

    [].concat.apply([],arr)

    字符串

    charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码。 

    fromCharCode方法从一些Unicode字符串中返回一个字符串。 

    charAt方法返回指定索引位置处的字符。如果超出有效范围的索引值返回空字符串。 

    slice方法返回字符串的片段。

    substring方法返回位于String对象中指定位置的子字符串。 

    indexOf方法放回String对象内第一次出现子字符串位置。如果没有找到子字符串,则返回-1 

    search方法返回与正则表达式查找内容匹配的第一个字符串的位置。 Match

    concat方法返回字符串值,该值包含了两个或多个提供的字符串的连接。 

    将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 

    toLowerCase,toUpperCase所有字母都被转换为小、大写字母。 

    Startwith endwith repeat replace trim  “sss”.padstart(5,”ss”) padend 补全字符串

    箭头函数

    不具备thisarguments

    自己没有则向上寻找this

    如何更改this指向? call apply bind ;var self=this;箭头函数

    如何确定this是谁? 看谁调用的 .前面是谁this就是谁

    Let a= b => b=1

    -去掉function关键字

    -若只有一个参数可以省略小括号

    -小括号与大括号之间有箭头

    -若没有大括号则直接是返回值

    -有大括号需要用return

    例子:Let a=b=> c => b+c;   //高阶函数 嵌套函数

    闭包:单独的作用域,不销毁的作用域,当执行后返回的结果必须是引用数据类型,被外界变量接受,此时这个函数不会销毁,模块化(私有化)

    //典型闭包

    var t=function test(){

      var a=1; return function(){console.log(a++)}

     }();

    //简写函数

    arr.forEach(item=> console.log(item))

    Vue中不经常使用箭头函数

    2、Vue介绍

    读音类似于view 是一套构建用户界面的渐进式框架

    框架 vue 拥有完整的解决方案,写好后别人调用

    jquery 我们进行调用 工具

    渐进增强 保证低版本支持,高版本效果增强

    Vue全家桶 vuejs + vue-router + vuex + axios

    渐进式的理解(全家桶)

    声明式渲染(无需关心如何实现)

    组建系统

    客户端路由

    大规模状态管理

    构建工具(vue-cli)  全套完整的方案

    Vue的两个核心点

    响应的数据变化

    当数据发生改变--视图自动更新

    组合的视图组件

         Ui页面映射为组件树

         划分组件可维护可复用可测试

    MVC 单向

    MVVM模式 双向绑定

    Model数据 view视图 viewmodel  视图模型

    View         viewmodel             model

    DOM      DOM Listeners Data Bindings   plain js objects

                    vue

    Object.defineProperty(es5) 没有替代方案 不支持ie8以下

    Vue安装

    1、cdn 直接使用网址

    2、npm node package manager

    npm init

    初始化会产生一个package.json的文件来描述项目的依赖,项目名不能有大写 特殊字符 中文,而且不要和安装的包重名

    npm init -y 全部取默认值,项目名为文件夹名

    npm install vue  install可简写为 -i

    Package.json dependencies 会记录已安装依赖 npm install 会安装这些内容

    Node_moudules 安装的代码  dist代表目的地,即编译好的内容

    Let vm = new Vue({  //vm == viewModel

    el:”#app”    //告诉vue能管理哪个部分,不能挂载到html body

    data:{         //data中的数据会被vm代理

        msg:”hello” //可以通过vm.msg取到对应内容

    }

    });   //Object.defineProperty

    {{msg}}  //moustache 小胡子语法  赋值 取值 三元  逻辑运算用(computed

    v-model双向绑定

    v-mode会将msg的值赋予输入框 输入框的值改变了会影响数据

    表单元素更改来影响数据(通过vue指令 directive  v-开头)  

    一般的表单元素 input checkbox textarea radio select           vue忽略selected checked

    Es5的原生方法

    Let obj={}

    Let temp={}

    Object.defineProperty(obj,’name’,{

    Configurable:true,  //是否可删除 delete obj.name

    Wirtable:false,     //是否可重新赋值

    Enumerable:false,  //是否可枚举,能循环出来与否

    Value:1           //

    })

    Object.defineProperty(obj,’name’,{

    get(){

        return temp[“name”];

    },

    set(val){

        temp[“name”]=val;

    input.value=val;  //重新赋值给文本框,双向绑定

    }

    })

    Input.value=obj.name;   //页面加载时,调用get方法

    Input.addeventlistener(‘input’,function(){   //等待输入框变化

         obj.name=this.value;  //当时变化时调用set方法

    })

    Css放上面 先渲dom

    Js放下边  不影响展示

    基础指令

    v-model 双向绑定

    v-text 显示文本 等价{{}},此时渲染会显示出{{}} 需要在标签中加样式[v-cloak]{display:none}

    v-once  只绑定一次,当数据再发生变化也不会导致页面刷新,加在标签中

        {{meg}}

    v-html   当作html渲染

    Vue会循环data中的数据(数据劫持) 依次添加proxysetterproxygetter

    响应式数据

    改对象

    1、使用变量时,先要在data中初始化,否则新加的元素不会导致页面刷新

    2、vm.$set()  //此方法可以给对象添加响应式的数据变化 vm.$set(vm.a,’school’,1);

    3、替换原对象 vm.a={school5}

    改数组

    去改变数组中的某一项是监控不到的,因为数组内的元素加不上gettersetter

    //错误写法  vm.arr[0]=100  vm.arr.lenth-=2

    //变异方法  pop  push shift unshift sort reserve slice 都可以操作原数组,因此可变化

    或者 vm.arr=vm.arr.map(item=>item*3)  //filter map

    v-for 解决循环问题 更高效 复用原有结构 以前拼接innerHTML

    v-for=”(item,index) in arr” v-for=”c in ‘aaaa’” v-for=”c in 10” v-for=”(value,key,index) in obj”

      此时会传递默认值event

    v-on  绑定事件  //v-on:click=”fn”  简写为@符号 @click=”fn”

    放到methodsmethodsdata命名不能冲突,methods中的this指向实例

    fnevent)此时若@click=”fn”,则会自动带过来event

    fn(event,test) 此时若@click=”fn($event,123)” 需要手动传入event参数

    @keyup.enter=”fn” 代表只有按回车才执行 类似写法@keyup.13 @keyup.ctrl.a  

    npm install vue axios bootstrap(响应式布局)

    Checkbox  

    只有一个复选框的时候,会把值转化为Boolean类型,如果true代表选中

    多个复选框的时候,要增加value属性,数据类型用数组,会将选中的value值放到数组中

    1

    2

    3

    test[]  全选中test[1,2,3]

    Select

    传统方式:监听onchange事件,this.value 值为选中optionvalue

    data:{

        a:””

    }

    男  以前用name属性

    sex为选中的radiovalue

    Axios  基于promise

    //专门发送ajax的方法

    created(){  //数据初始化后会调用 this指向vm实例,钩子函数

    axios.get(‘./carts.json’).then((res)=>{

    this.pro=res.data;    //data为真实的数据

    },(err)=>{

     

    })

    }

    发请求可以封装为方法放到methods方法中,然后在created中调用

    Promise 解决回调问题的

    //回调函数 将后续处理逻辑传入当前要做的事,事情处理好以后调用此函数

    Function buy(callback){

    setTimeout(()=>{

       Let a=’123’;

       Callback(a);

    },100);

    }

    Promise 三个状态 成功态 失败态 等待 //定义时即会执行

    //resolve 代表转向成功 reject 代表转向失败 均是函数

    //promise的实例就有一个then方法,两个参数

    var pro=new Promise((resovle,reject)=>{

    console.log(1)

    setTimeout(()=>{

       let a=’123’;

       resovle(a);

    },100);

    });

    console.log(2);

    pro.then((res)=>{console.log(res)},(err)=>{})

    封装原生ajax请求

    function ajax({url=’xxx’,type=’get’,dataType=’json’}){

    Return new promise({resolve,reject}=>{

    Let xhr=new XMLHttpRequest();

    Xhr.open(type,url,true);   //最后参数为是否异步

    Xhr.responseType=dataType;

    Xhr.οnlοad=function(){  //xhr.readstate==200;xhr.status=4

        If(xhr.status==200){

    Resolve(xhr.response);

    }    

    }

    Xhr.onError=function(err){

        Reject(err);

    }

    Xhr.send();

    })

    }

    ajax({url:’./aaa’}).then((res)=>{},(err)=>{})

    Fetch代替Ajax

    Async await 基于promise

    Bootstrap 栅格化布局 默认12列 其他框架会8 24

    常见样式 基本样式 + 增强样式

    Default 灰色 success 绿色 danger warning 警告 info 浅蓝

    Vueui框架 iview mintui elementui

    购物车表格标题

    动态绑定数据 在属性里使用需要用v-bind或:  v-bind:id=”data”

    //.number将输入框值变成数字类型 .lazy当输入框失去焦点更新数据

      

    toFiexed(2)两位小数

    过滤器 原数据不变,只是改变显示的效果 |为管道符

    {{a.price*a.count|toFiexed(2)}}

    Filters:{//可以有好多的自定义过滤器

    toFiexed(inputparam1){   //这里的thiswindow,input为值

        Return “$”+input

    }

    }

    两个对象比较,比较的是地址,因此可以比较是否相等

    点击checkbox时,用change事件

    Sum() 数据一变化就会重新调用此函数 算出最新的结果 不会缓存上一次结果

    Computed 也会放到实例上

    Computed:{

    Checkall:{

        Get(){

        Return this.pros.every(p=>p.isSelected)

    },

        Set(val){

        This.pros.forEach(p=>p.isSelected=val)

    }

    },

    Sum(){ }  //只有get可写成函数模式,且会被缓存

    }

    V-if v-show if操作的是dom show操作的是样式

    如果if不通过内部指令不会再执行

    只有dom从显示到隐藏 或者隐藏到显示 才能使用vue的动画

    //Vue自定义标签 (组件)

     动画

    Opacity0          1          1          0

       V-enter        v-enter-to   v-leave     v-leave

               V-enter-active         v-leave-active

    V-enter  V-enter-active  v-leave-active

    .v-enter{opacity:0;}

    .v-enter-active{transition:1s linear;}

    .v-leave-active{opacity:0;transition:1s linear}

     name默认为v

    .test-enter{opacity:0;}

    .test-enter-active{transition:1s linear;}

    .test-leave-active{opacity:0;transition:1s linear}

    animate.css 动画库  --save 会记录到package.json 的依赖库

    transition适用单个元素transition -group适用多个元素

    V-for 默认会复用原有的dom元素,要加:keykey不同用以区分不同元素

    修饰符.number .lazy

    按键修饰符 .enter.ctrl.keycode

    事件 修饰符用于处理细节问题

    @事件.stop    停止事件传播  stoppropagation cancelBubblel=true

    @事件.capture 事件为捕获    div.addeventlisenter(‘click’,fn,true(捕获))

    @事件.capture.stop 先捕获后停止

    @事件.prevent 阻止默认行为  preventDefault returnvalue=true

    @事件.once   事件只执行一次 Jquery once

    @事件.self    只有事件源是自己才会触发

    e.srcElement&&e.target===””  判断事件源绑定 事件

    局部过滤器
    New vue({

       el:”#app”,

    Filters:{

      My(data){ return “data”+123}

    }

    })

    全局过滤器,要放到页面的顶部

    Vue.filter(“my”,(data)=>{  })

    Computed不支持异步

    Watch 只有值变化的时候才会触发 支持异步,其他情况更善于使用computed

    New vue({

    Watch:{

        a(newval,oldval){

           If(newval.length<3) ....

    }

    }

    })

    Vm.$watch(‘a’,(newval,oldval)=>{})

    V-if v-else