vuejs2.0 入门总结

作者: 麦子_FE | 来源:发表于2017-01-13 11:23 被阅读485次

    生成vue的实例

    var vm=new vue({

    //这里是选项  他可以包含数据、模板、挂载元素、方法、生命周期钩子等函数

    })

    实例生命周期(在生命周期里this指向调用它的vue实例)

    created在实例被创建后调用

    created(){

        this.hello();

    }

    vue2.0生命周期:

    beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed

    模板语法(不使用模板可以使用render函数使用JSX语法)

    底层实现上Vue将模板编译成虚拟DOM渲染函数,在应用状态改变时,vue计算出重新渲染组件的最小代价并应用到DOM上。

    先看怎么用

    插值:双大括号!!!!!!必须的  数据改变 大括号内的值也跟着改变 

    <span>{{msg}}</span>

    v-once

    如果你想插入一次接下来大括号内的数据不改变 则添加v-once属性

    <span v-once>不改变{{msg}}</span>

    v-html

    <span>{{msg}}</span>效果和<span v-html="msg"></span>相同 ,但是后者是将数据转变为纯文本 不是HTML 为了输出HTML 所以使用v-html

    v-bind

    大括号不能在HTML属性中使用 要使用v-bind

    <span v-bind:id="msg"></span>

    如果msg为false  移除属性

    <span></span>

    使用JS表达式

    {{msg+1}}

    {{msg==true?0:1}}


    指令

    带有v-前缀

    <div v-if="msg">如果msg为true则插入div标签</div>

    <div v-bind:id="msg">如果msg为false则移除属性,否则显示</div>

    <div v-on:click="toDo">点击触发函数</div>

    <input v-model="msg"/>//双向数据绑定

    .....等等  vue还支持自定义指令。后面说。

    指令缩写

    v-bind:href  或者 v-bind:id 可以缩写为 :href  和:id 就是省略前面的 v-bind

    v-on:click  缩写为@click=""

    计算属性

    computed 计算属性会根据data 的值改变

    <div>{{getNewMsg}}</div>

    new Vue({

          el:'#App',

          data:{

                msg:'hello'

          },

          computed:{

                getNewMsg:function(){

                            return this.msg.split('').reverse().join('');

                } 

          }

    })

    上边代码计算属性只用到了get,没有set。所以我们可以给自己一个set

    new Vue({

          el:'#App',

          data:{

                msg:'hello',

                text:'word'

          },

          computed:{

                all:{

                          get:function(){

                                        return this.msg+this.text;

                           },

                         set:function(val){

                                       return val+this.msg+this.text

                          }

                }

          }

    })

    然后vm.all="你好" 会返回 你好 hello word

    函数

    methods也可以实现刚才computed的效果。

    <div>{{getNewMsg}}</div>

    new Vue({

          el:'#App',

          data:{

                msg:'hello'

          },

           methods:{

                 getNewMsg:function(){

                       return this.msg.split('').reverse().join('');

                }

          }

    })

    computed和methods比较

    虽然最终的结果相同,但是计算属性基于缓存依赖,只有在他依赖的数据发生改变才会重新计算取值,而methods 每次都会重新计算取值。

    wach方法

    用于观察VUE实例上的数据变动

    <div>{{msg}}</div>

    new Vue({

          el:'#App',

          data:{

                msg:'hello',

                text:'word',

                all:''

          },

          watch:{

                msg:function(){

                      this.all=this.msg+this.text;

                }

          }

    })

    class与style绑定

    <div class="boxStyle"  v-bind:class="{active:isActive}"></div>

    如果isActive为false 则不显示 active 这个class,否则相反。

    class和v-bind:class可以共同使用。

    class支持三目运算符

    <div v-bind:class="active?style01:style02"></div>

    内联样式

    <div v-bind:style="{color:red,fontSize:fontSize+'px'}"></div>

    还可以绑定到一个对象上

    <div v-bind:style="obj"></div>

    data(){

         return{

                obj:{

                         color:'red',

                          fontSize:'12px'

                }

         }

    }

    条件渲染

    v-if 、 v-else、v-else-if

    <div v-if="msg>0">大于0</div>

    <div v-else-if="msg==0">等于0</div>

    <div v-else>小于0</div>

    还可以使用template

    <template v-if="msg>0">

              <div>1111</div>

    </template>

    <template v-else>

            <div>2222</div>

    </template>

    上边的代码修改msg切换不同的div内容,但是vue是不会重新渲染div标签的。根据就地复用策略,只是替换div里面的内容。如果想每次都重新渲染div标签。需要使用key,key不同则每次重新渲染。

    v-if 和 v-show

    v-show只是控制display。

    v-if有更高的切换消耗,v-show有更高的初始化消耗。

    列表渲染

    v-for

    data(){

         return{

                parents:"我是",

                msg:[

                        {name:'foo'},

                        {name:'bar'},

                 ]

          }

    }

    <div>

           <div v-for="{data,index} in msg">

                  {{parents}}-{{index}}-{{data.name}}

           </div>

    </div>

    渲染结果: 我是-0-foo  我是-1-bar

    事件处理器

    使用template的好处

    1。通过HTML模板就可以轻松定位JS对应方法

    2。不需要JS手动绑定事件,易于测试

    3。当viewmodel销毁 所有的事件处理器自动删除,无需手动删除

    <div v-on:click="msg">点击</div>

    new Vue({

              el:'app',

              methods:{

              say:function(name,event){

                         alert(name+'我是vue')

                        if(event){event.preventDefault}

                        }

               }

    })

    如果要获取原生DOM事件,需要传入event

    事件修饰符

    .stop 组件单击事件冒泡

    .prevent   提交事件不在重载页面

    .capture   使用事件捕获模式

    .self          只当在本元素才发生

    .once       新增

    使用方式:

    <div v-on:click.stop></div>

    修饰符可以串联

    <div v-on:click.stop.prevent="todo"></div>

    表单控件

    v-model 实现双向数据绑定

    <span>{{msg}}</span>

    <input v-model="msg"/>

    new Vue({

        el:'#app',

       data:{

              msg:'我是默认'

       }

    })

    无论是复选框  单选框  下拉列表   基本上获取到用户选中的值的方式,就是使用v-model到一个数组

    <input type="checkbox" id="jack" value="jack" v-model="checkedName"/>

    <label for="jack">jack</label>

    <input type="checkbox" id="mini" value="mini" v-model="checkedName"/>

    <label for="mini">mini</label>

    如果用户选中,则数组会把选中对象的value值存入数组中。

    修饰符

    .lazy   取消input事件转为change事件同步

    .number   将用户输入的值转为number类型,如果返回NAN,则返回原值

    .trim      取消前后空格

    使用方式:

    <input v-model.lazy="msg"/>

    组件

    注册全局组件

    Vue.component('my-component',{

        //选项

        data:function(){

                  //在组件里 data 必须是函数,并且不能使用箭头函数

        }

    })

    注册局部组件

    通过使用组件实例选项注册,可以使组件在另一个组件中使用

    var child={

    template:'<div>我是组件</div>'

    }

    new Vue({

              components:{

                        'my-components ':child

               }

    })

    组件通信

    思想:父组件通信子组件,使用props。子组件通信父组件使用自定义事件,通过$on('事件名称')监听事件 和 $emit('事件名称') 触发事件。

    如果使用vuex,在根组件注册,我们在任意组件中都可以通过$store拿到store对象。如果子组件想要获取到父组件的数据,或者说非父子组件想要拿到彼此的数据,最高效的方式是使用vuex。

    但是,还是要说下基本的props用法。

    props

    Vue.components('child',{

              props :['msg'],

              template:'<div>{{msg}}</div>'

    })

    <child msg="hello"></child>

    注意:因为HTML不区分大小写,所以在传递props时,驼峰写法要通过短横线隔开

    <div my-props="hello"></div>

    Vue.components('child',{

            props:['myProps'],

            template:'<div>{{myProps}}</div>'

    })

    动态props

    传递props使用 v-bind,这样父组件修改子组件也得到修改

    <div>

            <input  v-model="msg"/>

            <child v-bind:msg="msg"></child>

    </div>

    Vue.components('child',{

                  props:['msg'],

                  template:'<div>{{msg}}</div>'

    })

    字面量语法和动态语法

    字面量:<child msg="1"></child>        props为   "1"

    动态语法: <child v-bind:msg="1"></child>      props为   1

    单向数据流

    props是单向绑定的,父组件修改影响子组件,但是不能反过来,这是为了防止子组件修改父组件的状态,让数据流难以理解。

    可以通过Vuex管理state,这样子就避免了繁琐的props传递。后面会发布VUEX讲解的文章,请关注~

    props验证

    只用于new创建的实例中,创建实例时传递 props。主要作用是方便测试。

    支持类型:string  number  boolean  function  object   array

    props:{

         msg:Number,//只检测类型

        //检测类型+其他验证

        call:{

           type:Number,

            default:0,

            requiredLtrue,

            validator:function(val){

                return val>=0

            }

         }

    }

    自定义事件

    使用 v-on 绑定事件

    父组件在使用子组件的地方直接用v-on监听子组件触发的事件,  子组件触发事件会触发父组件事件

    子组件中要使用this.$emit('事件',参数)

    父组件就可以使用 $on去监听

     例如 在父组件中:

    <child v-on:子组件$emit的事件名称="父组件事件名称"></child>

    非父子组件通信

    使用一个空的vue实例作为中央事件总栈

    var bus=new Vue()

    在A组件中触发事件

    bus.$emit('a',1);

    在B组件创建的钩子中监听事件

    bus.$on('a',function(id){

    })

    slot

    在子组件中

    <div>

               <h1>我是子组件标题</h1>

               <slot>只有在没分发的内容才显示</slot>

    </div>

    在父组件中

    <div>

          <child>

                 <p>这里的内容会替换掉子组件中的slot</p>

         </child>

    </div>

    渲染结果为

    <div>

            <div>

                    <h1>我是子组件标题</h1>

                  <p>这里的内容会替换掉子组件中的slot</p>

           </div>

    </div>

    具名slot

    给slot添加name属性

    在子组件中

    <div>

               <h1>我是子组件标题</h1>

                <slot name="body">我是具名slot</slot>

    </div>

    在父组件中

    <div>

               <child>

                       <div slot="body">这里替换掉 name为body的slot</div>

               </child>

    </div>

    Render函数

    不想使用template,也可以用render写JSX。例如根据判断自动生成DOM结构,如果大量的判断用template会有大量的代码,这时候可以用render,使用createElement去创建标签。

    这里只写个小用法。

    new Vue({

          el:"#app",

         render:h=>h(App)

    })

    如果不使用render我们可以这样

    new Vue({

              el:'#app',

              components:{App},

              template:'<App/>'

    })

    总之JSX可以使用JS的完全编程能力。详细:http://cn.vuejs.org/v2/guide/render-function.html

    自定义指令

    有时候我们需要对DOM元素进行底层操作,所以需要自定义事件。

    全局注册

    例如我们创建v-focus

    Vue.directive('focus',{

         inserted:function(el){

              el.focus();

         }

    })

    局部注册

    组件接收一个选项

    directives:{

             focus:{

                       //指定的定义

             }

     }

    使用:<div v-focus></div>

    自定义指令钩子函数

    刚才我们全局定义 用到了 inserted函数,这就是钩子函数。

    bind:function(){} //只调用一次,指令第一次绑定到元素时调用。

    inserted:function(){} //被绑定元素插入到父节点 调用

    update:function(){}  //更新时调用

    componentUpdated:function(){}   //被绑定元素所在模板完成一次更新周期时调用

    unbind:function(){}  //指令与元素解绑调用

    钩子函数参数

    el:指令绑定的元素对象

    binding:一个obj对象,他包括以下属性:

                   name:指令名称

                   value:绑定的值

                   oldValue:前一个值 只能在update函数和componentUpdate函数中使用

                   expression:绑定的值是字符串形式 例如  v-demo="1"  为1

                   arg: 传给指令的值  v-demo:foo   arg值为foo

                   modifiers: 修饰符对象 只能在update函数和componentUpdate函数中使用

    vnode:vue编译生成的虚拟节点

    oldVnode:上一个虚拟节点

    混合mixin

    var mixin={

                created:function(){

                       this.hello();

                 },

                methods:{

                      hello:function(){

                       console.log("Hello");

                       }

               }

    }

    var Component=Vue.extend({

            mixins:[mixin]

    })

    如果相同的属性,都会被调用,只是混合对象的钩子将在组件自身钩子之前调用

    如果 例如 方法的名字相同,就取组件自身的方法

    以上就是vue2.0常用的小点,省略了一些内容。包括像是vue-router、vuex、编写插件等等。

    本篇只是总结基础知识点,希望能帮到你。

    -by 麦浪XPEKI

    相关文章

      网友评论

      • AbsurdOS:纯支持一下。毕竟我看不懂

      本文标题:vuejs2.0 入门总结

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