vue笔记

作者: 寒剑飘零 | 来源:发表于2017-04-14 01:24 被阅读99次

    1.基本绑定:

       new Vue(

           {

               el:'#elID',

               data:{

                   // data obj

               },

               computed:{

                   // computed obj

               },

               methods:{

                   // methods obj

               },

           }

       );

    2.指令:

       前缀为v-

       *v-if, v-for, v-bind, v-on...

       *特性插值会转为v-bind绑定: href='{{url}}' --> v-bind:href='url'

    3.数据绑定只接受单个表达式:

       {{number+1}}                                    ok

       {{ok?'yes':'no'}}                                ok

       {{message.split('').reverse().join('')}}        ok

       {{var a=1}}                                        no

       {{if(ok){return message}}}                        no

    4.过滤器:

       管道式的写法 --> {{message|capitalize}}

       *可以串联: filterA|filterB

       *可以带参数: filterA 'arg1' arg2

    5.修饰符

       前缀为.

       *v-bind:href.literal='a/b/c'

    6.缩写

       v-bind:href='url' --> :href='url'

       v-on:click='dosomething' --> @click='dosomething'

    7.计算setter

       computed:{

           fullName:{

               get:function(){

                   // getter

               }

               set:function(newValue){

                   //setter

               }

           }

       }

    8.Class与Style绑定

       *变量语法:v-bind:class="{'class-a':isA, 'class-b':isB}"        -->        data:{isA:true, isB:false}

       *对象语法:v-bind:class="classObj"                                -->        data:{classObj:{'class-a':true, 'class-b':false}}

       *数组语法:v-bind:class='[classA, classB]'                        -->        data:{classA:'class-a', classB:'class-b'}

    9.条件渲染

       *v-if, v-show, v-else

       *

    Yes

    No

       *

    Yes

    No

       *show只是简单的display:none

    10.列表渲染

       v-for

       *内置变量:{{$index}}

       *用法:v-for='item in items'

    v-for='(index, item) in items'    *数组则是索引,遍历对象则是键

    11.数组变动检测

       能触发视图更新的方法:

       *push, pop, shift, unshift, splice, sort, reverse            // 变异方法

       *filter, concat, slice                                        // 替换数组

       *尽可能复用DOM: track-by

           v-for="item in items" track-by="_uid"

           track-by='$index'                                        // 根据index追踪,不是很明白!...片段不被移动,简单地已对应索引的新值刷新,也能处理数据数组中重复的值...

    不能检测到以下变化:

    1.直接用索引设置元素:    vm.items[0]={};                    // vue解决方案:vm.items.$set(0, { childMsg: 'Changed!'}), vm.items.$remove(item)

    2.修改数据的长度:        vm.items.length=0;                // js中常见的清空, vue解决方案:直接用空数组替换

    12.对象v-for

    内置变量:$key

    13.值域v-for

    {{ n }}

    14.内置的过滤器

       filterBy 和 orderBy

    15.方法与事件处理器

    ·v-on 监听DOM事件

           

           

                   // 内联语句处理器, $event为内置变量,原生的DOM事件

    ·事件修饰符

    // 阻止冒泡和默认行为,修饰符可以串联

    ·按键修饰符

                                       // 键盘事件后面可接keyCode

    常见的按键有提供别名:

    ·enter

    ·tab

    ·delete

    ·esc

    ·space

    ·up

    ·down

    ·left

    ·right

    16.表单控件绑定

    ·v-model绑定字段

               // 绑定的值通常是静态字符串,勾选框是布尔值

    ·参数特性

    lazy        // 延迟到change事件中同步(原为input)

    number        // 仅允许输入数字

    debounce    // 延时同步

    17.过渡

    典型的过渡:

           

    需要添加CSS样式:

    .expand-transition(必须), .expand-enter, .expand-leave

    *如果未设置, 默认为.v-transition, .v-enter, .v-leave

    同时提供钩子:

    Vue.transition('expand',{...});

    ·beforeEnter, enter, afterEnter, enterCancelled, beforeLeave, leave, afterLeave, leaveCancelled

    渐近过渡:

               

    *钩子stagger, 延时过渡

    18.组件

    ·创建组件:        var c = Vue.extend({

                           template:'

    A custom component!',

    });

    ·注册组件:        Vue.component('my-component', c);                    // 如果名字是myComponent, html中必须写成my-component

       ·使用组件:        

       // html

    new Vue({el:'#app'});                                // js

    *注册可缩写为    vue.component('my-component',{

                           template:'

    A custom component!',

    });

    局部注册:

    var c = Vue.extend({});

    var parentComponent = Vue.extend({

    components:{

    'my-component': c,

    }

    });

    组件选项:

    var c = Vue.extend({

    data:function(){

    return {a:1};

    }

    });

    is特性:

    *table中限制其他的节点不能放置其中

           

       Props:

           props用以从父组件接收数据:

    使用:

    Vue.component('child',{

    props:['msg'],

    template:'{{msg}}'

    });

    声明:

    // 字面量语法

    // 动态语法

    *如果props是myMsg, html中需要用my-msg(即:camelCase - kebab-case, 因为html的特性是不区分大小写)

    *字面量和动态语法稍有不同

    // 传递了一个字符串 "1"

    // 传递实际的数字

    Props绑定类型:

    // 默认为单向绑定

    // 双向绑定

    //单次绑定

    *如果prop是一个对象或数组,是按引用传递。不管使用哪种绑定方式,都将是双向绑定

    Props验证:

    props:{            // 此时props是一个对象

    propA: Number,

    propB:{

    type: String,                    // 类型(原生构造器:String, Number, Boolean, Function, Object, Array)

    required: true,                    // 是否必须项

    default: 'thyiad',                // 默认值(如果是Object, 默认值需由一个函数返回)

    validator: function(value){        // 验证

    return value === 'thyiad';

    },

    coerce:function(val){

    return val+'';                // 将值强制转换为字符串

    return JSON.parse(val);        // 将JSON字符串转换为对象

    }

    }

    }

    父子组件通信:

    this.$parent        // 子组件访问父组件

    this.$root            // 访问根实例

    this.$children        // 父组件的所有子元素

    *不建议在子组件中修改父组件的状态

    自定义事件:

    $on()                // 监听事件

    $emit()                // 触发事件

    $dispatch()            // 派发事件,沿着父链冒泡

    $broadcast()        // 广播事件, 向下传递给所有的后代

    使用:

    子组件中绑定函数派发事件:

    methods:{

    notify:function(){

    this.$dispatch('child-msg',this.msg);

    }

    }

    父组件中定义事件:

    events:{

    'child-msg':function(msg){

    this.messages.push(msg);

    }

    }

    *更直观的声明方式:

    // 直观的为父组件定义事件(child-msg), 并且触发父组件的handleIt函数, 子组件只关注触发事件

    子组件索引:

           

    var child = parent.$refs.profile;

    使用Slot分发内容:

    单个Slot:

    父组件的内容将被抛弃,除非子组件包含

    如果只有一个没有特性的slot, 整个内容将被插到它所在的地方, 替换slot.

    父组件:

                   

                       

    parent content

    子组件模板:

                   

                       

    child content

                       

    如果父节点没有设置内容,这里才会被显示

    命名Slot:

    父组件模板:

                   

                       

    One

                       

    two

                       

    Default A

    子组件模板:

                   

                       

    // 默认slot, 找不到匹配内容的回退插槽, 如果没有默认的slot, 不匹配内容将被抛弃

                       

    动态组件:

    可以在不同组件之间切换:

    new Vue({

    el:'body',

    data:{

    currentView:'home',

    },

    components:{

    home:{},

    posts:{},

    archive:{},

    }

    });

    父组件:

    // component是Vue保留的元素

    *keep-alive用来把切换出去的组件保留在内存中, 可以保留它的状态避免重新渲染

    activate钩子:

    用以在切入前做一些异步操作:

    activate:function(done){

    var self = this;

    loadDataAsync(function(data){

    self.someData=data;

    done();

    });

    }

    transition-mode

    指定列两个动态组件之间如何过渡:

                       

    *默认进入与离开平滑地过渡, 可以指定另外两种模式:in-out, out-in (先进入or先离开)

    组件和v-for:

               

    *因为组件的作用域是孤立的, v-for里的item无法直接传递给组件, 必须像上面一样使用props传递数据

    异步组件

    资源命名约定

    递归组件

    片段实例

    *推荐模板只有一个根节点(使用template选项时)

    内联模板

    组件把它的内容当做它的模板

               

    *不推荐

    19.深入响应式原理

    ·如何追踪变化

    *使用Object.defineProperty设置getter/setter

    ·变化检测问题

    *不能检测到对象属性的添加或删除

    *vm.$set('b', 2);

    Vue.set(object, key, value);

    ·初始化数据

    *推荐在data对象上声明所有的响应属性

    ·异步更新队列

    *默认异步更新DOM, 下次事件循环时清空队列, 执行必要的DOM更新

    *Vue.nextTick(callback);

    ·计算属性的秘密

    *计算属性是有缓存的, 除非显示设置为不缓存

    computed:{

    attr:function(){

    return Date.now()+this.msg;

    }

    }

    TO:

    computed:{

    attr:{

    cache: false,

    get: function(){

    return Date.now()+this.msg;

    }

    }

    }

    *但只是在JS中访问是这样的, 数据绑定仍是依赖驱动的。        

       

       

    相关文章

      网友评论

        本文标题:vue笔记

        本文链接:https://www.haomeiwen.com/subject/bsoiattx.html