vue2.0 入门总结

1.生成vue的实例

var vm=new vue({

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

})

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

created在实例被创建后调用

created(){

    this.hello();

}

vue2.0生命周期:

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

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

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

先看怎么用

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

扫描二维码关注公众号,回复: 4282253 查看本文章

<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}}

4.指令

带有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=""

5.计算属性

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

6.函数(methods)

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

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

new Vue({

      el:'#App',

      data:{

            msg:'hello'

      },

       methods:{

             getNewMsg:function(){

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

            }

      }

})

computed和methods比较

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

7.wach方法

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

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

new Vue({

      el:'#App',

      data:{

            msg:'hello',

            text:'word',

            all:''

      },

      watch:{

            msg:function(){

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

            }

      }

})

8.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'

            }

     }

}

9.条件渲染

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有更高的初始化消耗。

10.列表渲染

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

11.事件处理器

使用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

12.事件修饰符

.stop 组件单击事件冒泡

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

.capture   使用事件捕获模式

.self          只当在本元素才发生

.once       新增

使用方式:

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

修饰符可以串联

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

13.表单控件

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值存入数组中。

14.修饰符

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

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

.trim      取消前后空格

使用方式:

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

15.组件

注册全局组件

Vue.component('my-component',{

    //选项

    data:function(){

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

    }

})

注册局部组件

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

var child={

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

}

new Vue({

          components:{

                    'my-components ':child

           }

})

16.组件通信

思想:父组件通信子组件,使用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){

})

17.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>

18.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/>'

})

19.自定义指令

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

全局注册

例如我们创建v-focus

Vue.directive('focus',{

     inserted:function(el){

          el.focus();

     }

})

局部注册

组件接收一个选项

directives:{

         focus:{

                   //指定的定义

         }

 }

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

20.自定义指令钩子函数

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

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

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

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

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

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

20.自定义指令钩子函数

刚才我们全局定义 用到了 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:上一个虚拟节点

猜你喜欢

转载自my.oschina.net/u/3912828/blog/2962460