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
    *<h1 v-if="ok">Yes</h1> <h1 v-else>No</h1>
    *<h1 v-show="ok">Yes</h1> <h1 v-else>No</h1>
    *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
    <span v-for="n in 10">{{ n }}</span>

14.内置的过滤器
    filterBy 和 orderBy    
    
15.方法与事件处理器
    ·v-on 监听DOM事件
        <button v-on:click="greet"></button>
        <button v-on:click="greet('xx', $event)"></button>                // 内联语句处理器, $event为内置变量,原生的DOM事件
    ·事件修饰符
        <a v-on:click.stop.prevent='doThis' />                            // 阻止冒泡和默认行为,修饰符可以串联
    ·按键修饰符
        <input v-on:keyup.13='submit' >                                    // 键盘事件后面可接keyCode
        常见的按键有提供别名:
            ·enter
            ·tab
            ·delete
            ·esc
            ·space
            ·up
            ·down
            ·left
            ·right
    
16.表单控件绑定
    ·v-model绑定字段
        <input type="checkbox" id="checkbox" v-model="checked">            // 绑定的值通常是静态字符串,勾选框是布尔值
    ·参数特性
        lazy        // 延迟到change事件中同步(原为input)
        number        // 仅允许输入数字
        debounce    // 延时同步
        
17.过渡
    典型的过渡:
        <div v-if="show" transition="expand"></div>
        需要添加CSS样式:
            .expand-transition(必须), .expand-enter, .expand-leave
            *如果未设置, 默认为.v-transition, .v-enter, .v-leave
        同时提供钩子:
            Vue.transition('expand',{...});
            ·beforeEnter, enter, afterEnter, enterCancelled, beforeLeave, leave, afterLeave, leaveCancelled
        渐近过渡:
            <div v-for='list' transition stagger='100'></div>
            *钩子stagger, 延时过渡
            
18.组件
    ·创建组件:        var c = Vue.extend({
                        template:'<div>A custom component!</div>',
                    });
    ·注册组件:        Vue.component('my-component', c);                    // 如果名字是myComponent, html中必须写成my-component
    ·使用组件:        <div id='app'><my-component></my-component></div>    // html
                    new Vue({el:'#app'});                                // js
                    
    *注册可缩写为    vue.component('my-component',{
                        template:'<div>A custom component!</div>',
                    });
    局部注册:
        var c = Vue.extend({});
        var parentComponent = Vue.extend({
            components:{
                'my-component': c,
            }
        });
    组件选项:
        var c = Vue.extend({
            data:function(){
                return {a:1};
            }
        });
        
    is特性:
        *table中限制其他的节点不能放置其中
        <table>
            <tr is='my-component'></tr>
        </table>
            
    Props:
        props用以从父组件接收数据:         
            使用:
                Vue.component('child',{
                    props:['msg'],
                    template:'<span>{{msg}}</span>'
                });
            声明:
                <child msg='hello!'></child>            // 字面量语法
                <child v-bind:msg='parentMsg'></child>    // 动态语法
            *如果props是myMsg, html中需要用my-msg(即:camelCase - kebab-case, 因为html的特性是不区分大小写)
            *字面量和动态语法稍有不同
                <comp some-prop="1"></comp>        // 传递了一个字符串 "1"
                <comp :some-prop="1"></comp>    // 传递实际的数字
    
    Props绑定类型:
        <child :msg="parentMsg"></child>        // 默认为单向绑定
        <child :msg.sync="parentMsg"></child>    // 双向绑定
        <child :msg.once="parentMsg"></child>    //单次绑定
        *如果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 v-on:child-msg='handleIt'></child>        // 直观的为父组件定义事件(child-msg), 并且触发父组件的handleIt函数, 子组件只关注触发事件
        
    子组件索引:
        <child v-ref:profile></child>
        var child = parent.$refs.profile;
        
    使用Slot分发内容:
        单个Slot:
            父组件的内容将被抛弃,除非子组件包含<slot>.
            如果只有一个没有特性的slot, 整个内容将被插到它所在的地方, 替换slot.
                父组件:
                <child>
                    <p>parent content</p>
                </child>
                子组件模板:
                <div>
                    <h1>child content</h1>
                    <slot>
                        如果父节点没有设置内容,这里才会被显示
                    </slot>
                </div>
        命名Slot:
            父组件模板:
                <child>
                    <p slot='one'>One</p>
                    <p slot='two'>two</p>
                    <p>Default A</p>
                </child>
            子组件模板:
                <div>
                    <slot name='one'></slot>
                    <slot></slot>                    // 默认slot, 找不到匹配内容的回退插槽, 如果没有默认的slot, 不匹配内容将被抛弃
                    <slot name='two'></slot>
                </div>
        
        动态组件:
            可以在不同组件之间切换:
                new Vue({
                    el:'body',
                    data:{
                        currentView:'home',
                    },
                    components:{
                        home:{},
                        posts:{},
                        archive:{},
                    }
                });
                父组件:
                    <component :is='currentView' keep-alive></component>        // component是Vue保留的元素
                    *keep-alive用来把切换出去的组件保留在内存中, 可以保留它的状态避免重新渲染
            activate钩子:
                用以在切入前做一些异步操作:
                    activate:function(done){
                        var self = this;
                        loadDataAsync(function(data){
                            self.someData=data;
                            done();
                        });
                    }
            transition-mode
                指定列两个动态组件之间如何过渡:
                    <component :is='currentView' transition='fade' transition-mode='out-in'></component>
                    *默认进入与离开平滑地过渡, 可以指定另外两种模式:in-out, out-in (先进入or先离开)
            
        组件和v-for:
            <child v-for='item in items' :item='item' :index='$index'></child>
            *因为组件的作用域是孤立的, v-for里的item无法直接传递给组件, 必须像上面一样使用props传递数据
        
        异步组件
        资源命名约定
        递归组件
        片段实例
            *推荐模板只有一个根节点(使用template选项时)
        内联模板
            组件把它的内容当做它的模板
            <child inline-template></child>
            *不推荐
        
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基础学习的更多相关文章

  1. Vue – 基础学习(4):事件修饰符

    Vue – 基础学习(3):事件修饰符

  2. Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别

    Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别

  3. Vue – 基础学习(2):组件间 通信及参数传递

    Vue – 基础学习(2):组件间 通信及参数传递

  4. Vue – 基础学习(1):对生命周期和钩子函的理解

    一.简介 先贴一下官网对生命周期/钩子函数的说明(先贴为敬):所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算.这意味着你不能使用箭头函数来定义一个生命周 ...

  5. 前端Vue基础学习

    Vue基础 对与vue的简洁明了的干货分享,适合小白学习观看,如果有笔误或者想了解更多的,请给笔者留言,后续会继续分享,从零开始的vue相关经验 1.创建vue实例 <div id=" ...

  6. vue基础学习(二)

    02-01  vue事件深入-传参.冒泡.默认事件 <div id="box"> <div @click="show2()"> < ...

  7. vue基础学习(一)

    01-01 vue使用雏形 <div id="box"> {{msg}} </div> <script> window.onload= func ...

  8. vue基础学习(三)

    03-01  vue的生存周期-钩子函数 <style> [v-cloak]{display:none;} </style> <div id="box" ...

  9. 【vue基础学习】vue.js开发环境搭建

    1.安装node.js(http://www.runoob.com/nodejs/nodejs-install-setup.html) 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd ...

随机推荐

  1. c# 無彈窗调用打印机

    using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...

  2. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  3. BZOJ 1029 建筑抢修

    Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修 ...

  4. Annikken Andee–Arduino与Android间的简易连接

    一个Arduino的兼容板,允许你显示并控制来自Android设备的Arduino应用.无需Anroid APP开发. 点击:观看视频 什么是Annikken Andee? Annikken Ande ...

  5. 14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读

    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读意味着 InnoDB 使用多版本来实现一个查询数据库的快照在某个时间点. 查看看到的事务做出的改变被提 ...

  6. 离奇“undefined reference”错误分析与解决方案

    离奇“undefined reference”错误分析与解决方案 “undefined reference to XXX”是一类挺常见的链接错误,原因通常是链接时找不到声明成extern类型的函数的定 ...

  7. bzoj3280

    bzoj1221的变形版本,弄懂1221,这题还是很简单的 ; type node=record        point,next,flow,cost:longint;      end; ..] ...

  8. 【模拟】Codeforces 691B s-palindrome

    题目链接: http://codeforces.com/problemset/problem/691/B 题目大意: 求一个字符串是不是镜像的(不是回文).是输出TAK否则RE. 题目思路: [模拟] ...

  9. 重载(Overloading)以及模板(Template)

    继续<C++ premier plus>的学习 (1)函数重载,通俗来说,就是相同的函数名字名下,存在多个函数,要使得这成立,各个同名函数必须形参列表(也称为"签名", ...

  10. Java EL 详细用法讲解

    本文主要介绍了Java EL的语法结构以及EL的使用方法,并结合例子代码讲解了Java EL对象.Java EL运算符以及Java EL函数.希望对Java开发者有所帮助. 一.EL简介 1.语法结构 ...