Vue学习入门之二(全局API)

2018年12月11日 16:34

1.Vue.directive自定义指令

自定义指令和自定义组件的区别:
自定义指令:是在一个标签上添加自定义的属性,相当于class
自定义组件:是一个标签,Vue.directive('jspang',function(el,binding,vnode){
    el.style='color:'+binding.value;
});
//引用自定义全局指令 el: 指令所绑定的元素,可以用来直接操作DOM。 binding: 一个对象,包含指令的很多信息。 vnode: Vue编译生成的虚拟节点。
2.Vue.extend构造器的延伸
在没有用组件的基础上实现自定义组件

var authorExtend = Vue.extend({
       template:"

{{authorName}}

", data:function(){ return{ authorName:'JSPang', authorUrl:'http://www.jspang.com' } } }); new authorExtend().$mount('author'); //挂载到author上//使用
3.Vue.set全局操作
作用就是在构造器外部操作构造器内部的数据、属性或者方法

//在构造器外部声明数据
var outData={
    count:1,
    goodName:'car'
};
var app=new Vue({
    el:'#app',
    //引用外部数据
    data:outData
})
三种方式改变count的值:
1):用Vue.set改变
   function add(){
   Vue.set(outData,'count',4); //outData 数据对象,count对象的属性,4修改的值
   }
2):用Vue对象改变
    app.count++;
3):直接修改外部对象数据
    outData.count++;
说明:三种方式都可以修改构造器内部的数据,为啥还要用Vue.set ?
由于Javascript的限制,Vue不能自动检测以下变动的数组。
    *当你利用索引直接设置一个项时,vue不会为我们自动更新。
    *当你修改数组的长度时,vue不会为我们自动更新。
    Vue.set(app.arr,1,’ddd’)来修改值

4.Vue的生命周期

<body>
<h1>构造器的生命周期</h1>
<hr>
<div id="app">
    {{message}}
    <p><button @click="jia">加分</button></p>
</div>
    <button onclick="app.$destroy()">销毁</button>

<script type="text/javascript">
    var app=new Vue({
        el:'#app',
        data:{
            message:1
        },
        methods:{
            jia:function(){
                this.message ++;
            }
        },
        beforeCreate:function(){
            console.log('1-beforeCreate 初始化之后');
        },
        created:function(){
            console.log('2-created 创建完成');
        },
        beforeMount:function(){
            console.log('3-beforeMount 挂载之前');
        },
        mounted:function(){
            console.log('4-mounted 被创建');
        },
        beforeUpdate:function(){
            console.log('5-beforeUpdate 数据更新前');
        },
        updated:function(){
            console.log('6-updated 被更新后');
        },
        activated:function(){
            console.log('7-activated');
        },
        deactivated:function(){
            console.log('8-deactivated');
        },
        beforeDestroy:function(){
            console.log('9-beforeDestroy 销毁之前');
        },
        destroyed:function(){
            console.log('10-destroyed 销毁之后')
        }

    })
</script>
</body>
5.Template 制作模版

<template></template> 这种方式就可以引用模板,组件和扩展是可以自定义标签名的
三种方式:
1.JavaScript,Vue对象中
 var app=new Vue({
     el:'#app',
     data:{
         message:'hello Vue!'
      },
     template:`
        <h1 style="color:red">我是选项模板</h1>
     `
})
2.写在template标签中,然后通过id挂载到vue对象
<template id="demo2">
     <h2 style="color:red">我是template标签模板</h2>
</template>

<script type="text/javascript">
    var app=new Vue({
        el:'#app',
        data:{
            message:'hello Vue!'
        },
        template:'#demo2'
    })
</script>
3.写在script中,通过id挂载到vue对象
<script type="x-template" id="demo3"> //type="x-template" 有这个才能识别是template模板
<h2 style="color:red">我是script标签模板</h2>
</script>

<script type="text/javascript">
    var app=new Vue({
        el:'#app',
        data:{
            message:'hello Vue!'
        },
        template:'#demo3'
    })
</script>
6.Component 初识组件(灰常重要)

<jspang></jspang>这就是自定义组件
6.1全局注册
    Vue.component('jspang',{
        template:`<div style="color:red;">全局化注册的jspang标签</div>`
    }) //在所有的vue对象中都可以使用<jspang></jspang>
6.2局部注册
    script type="text/javascript">
    var app=new Vue({
        el:'#app',
        components:{   //注意这里有加S
            "panda":{
                template:`<div style="color:red;">局部注册的panda标签</div>`
            }
        }
    })
    </script>
7.Component 组件props 属性设置

<body>
    <h1>component-2</h1>
    <hr>
    <div id="app">
      <panda here="China"></panda>
    </div>
 
    <script type="text/javascript">
        var app=new Vue({
            el:'#app',
            components:{
                "panda":{
                    template:`<div style="color:red;">Panda from {{ here }}.</div>`,
                    props:['here'] //这里对属性的插值方式还没有知道
                }
            }
        })
    </script>
</body>
!from-here=”China” ,我们必须用小驼峰式写法props:[‘fromHere’]

7.2在构造器里向组件中传值
    <panda v-bind:here="message"></panda> //从构造器中获取message的值v-bind:here="message"

    var app=new Vue({
        el:'#app',
        data:{
           message:'SiChuan' 
        },
        components:{
            "panda":{
                template:`<div style="color:red;">Panda from {{ here }}.</div>`,
                props:['here']
            }
        }
    })
8.Component 父子组件关系

8.1构造器外部写局部注册组件
//和template很相似,区别在于vue对象中挂载,template:'#demo2'和components:{"jspang":jspang}
var jspang = {
   template:`<div>Panda from China!</div>`
}
//在构造器中挂载
components:{
    "jspang":jspang
}

8.2父子组件的嵌套
    <script type="text/javascript">
       var city={
           template:`<div>Sichuan of China</div>`
       }
        var jspang = {
            template:`<div>
                    <p> Panda from China!</p>
                    <city></city>
            </div>`,
            components:{         //父组件添加外部子组件
                "city":city
            }
        }
        var app=new Vue({
            el:'#app',
            components:{
                "jspang":jspang  //外部写,内部注册
            }
           
        })
</script>
9.Component 标签

<component v-bind:is="who"></component> //使用vue自定义的component标签来进行
自定义组件的切换,注意绑定方式v-bind:is="who" 
<body>
    <h1>component-4</h1>
    <hr>
    <div id="app">
       <component v-bind:is="who"></component>
       <button @click="changeComponent">changeComponent</button>
    </div>
 
    <script type="text/javascript">
        var componentA={
            template:`<div style="color:red;">I'm componentA</div>`
        }
        var componentB={
            template:`<div style="color:green;">I'm componentB</div>`
        }
        var componentC={
            template:`<div style="color:pink;">I'm componentC</div>`
        }
       
        var app=new Vue({
            el:'#app',
            data:{
                who:'componentA'
            },
            components:{
                "componentA":componentA,
                "componentB":componentB,
                "componentC":componentC,
            },
            methods:{
                changeComponent:function(){
                    if(this.who=='componentA'){
                        this.who='componentB';
                    }else if(this.who=='componentB'){
                        this.who='componentC';
                    }else{
                        this.who='componentA';
                    }
                }
            }
        })
    </script>
</body>

评论

暂时还没有评论,欢迎评论!