vuejs2.0 入门总结

生成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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容