首页 > 代码库 > Vue.js初探

Vue.js初探

在Vue.js的初识篇了解了Vue的内部指令,并做了一些简单的小案例。这一篇来了解Vue的全局API。

Vue的全局API:在构造器外部用Vue提供的API函数来定义新功能

 

首先了解一下自定义指令的生命周期

bind:function(){      //被绑定
     console.log(‘ bind: 我被被绑定!‘);
},
inserted:function(){    //绑定到节点
      console.log(‘inserted: 我绑定到节点了!‘);
},
update:function(){    //组件更新
      console.log(‘update: 组件更新了!‘);
},
componentUpdated:function(){  //组件更新完成
      console.log(‘componentUpdated: 组件更新完成了!‘);
},
unbind:function(){    //解绑
      console.log(‘bind: 我已解绑了!‘);
}

 

Vue.directive 自定义指令

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>Vue directive</title>
</head>
<body>
    <div class="container">
        <div id="app">
            <h5>{{ message }}</h5>
            <hr />
            <p v-momei=‘color‘ id="Dome">{{ num }}</p>
            <p><button class="btn btn-success" @click="add()">Add</button></p>
        </div>

    </div>
</body>
    <script src="https://unpkg.com/vue"></script>
    <script>
        Vue.directive(momei,function(el,binding,vnode){
            el.style.color=binding.value;
        });
        var app = new Vue({
            el: #app,
            data: {
                message: Hello Vue.js One Day!,
                num: 10,
                color: green
            },
            methods: {
                add: function() {
                    this.num ++;
                }
            }
        });
    </script>
</html>

自定义指令传入的三个参数:

  el:  指令绑定的元素,可以用来直接操作DOM。

  binding:  一个对象,包含以下属性:

    • name:  指令名,不包括 v- 前缀。
    • value:  指令的绑定值。
    • oldValue:  指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:  绑定值的字符串形式。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"
    • arg:  传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"
    • modifiers:  一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }

  vnode:  Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。

  oldVnode:  上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

除了 el 之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

 

Vue的生命周期:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>Vue 生命周期</title>
</head>
<body>
    <div class="container">
        <div id="app">
            <h5>{{ message }}</h5>
            <hr />
            <p>{{ num }}</p>
            <p><button class="btn btn-success" @click="add()">Add</button></p>
        </div>

    </div>
</body>
    <script src="https://unpkg.com/vue"></script>
    <script>
        var app = new Vue({
            el: #app,
            data: {
                message: Hello Vue.js ONE Day!,
                num: 10,
            },
            methods: {
                add: function() {
                    this.num ++;
                }
            },
            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>
</html>

 

Vue.extend构造器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>Vue Extend</title>
</head>
<body>
    <div class="container">

        <author></author>

    </div>
</body>
    <script src="https://unpkg.com/vue"></script>
    <script>
        var Extend = Vue.extend({
            template: "<p><a :href=http://www.mamicode.com/‘Url‘>{{Name}}

", //模板 data:function() { return{ Name: momei, Url: http://www.cnblogs.com/momei/ } } }); new Extend().$mount(author); //挂载扩展实例构造器 </script> </html>

 

Vue.set 全局操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>Vue.set 全局操作</title>
</head>
<body>
    <div class="container">
        <h1>Vue.set 全局操作</h1>
        <hr>
        <div id="app">
            <ul>
                <li v-for=" aa in arr">{{aa}}</li>
            </ul>
            <!-- <button @click="add()">外部添加</button> -->
        </div>
        <button onclick="add()">外部添加</button>
    </div>

    <script src="https://unpkg.com/vue"></script>
    <script type="text/javascript">

        function add(){
            console.log("我已经执行了");
            //app.arr[1]=‘ddd‘;

            //我们需要用Vue.set(app.arr,1,’ddd’)来设置改变,vue才会给我们自动更新
            Vue.set(app.arr,1,ddd);
        }
        //在构造器外部声明数据
        var outData={
            arr:[aaa,bbb,ccc]
        };
        var app=new Vue({
            el:#app,
            data:outData
        })
    </script>
</body>
</html>

 

Template 制作模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>template 模板</title>
</head>
<body>
    <div class="container">
        <h1>template 模板</h1>
        <hr>
        <div id="app">
            <h4>{{message}}</h4>
        </div>
    </div>

    <script src="https://unpkg.com/vue"></script>
    <script type="text/javascript">
        var app=new Vue({
            el:#app,
            data:{
                message: hello Vue!
            },
            template: `<h4 style="color:green">template选项模板</h4>`
        })
    </script>    
</body>
</html>

当模板内容较多时上面的方式就不那么方便了,来看看template的标签模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>template 模板</title>
</head>
<body>
    <div class="container">
        <h1>template 模板</h1>
        <hr>
        <div id="app">
            <h4>{{message}}</h4>
        </div>
    </div>
    <template id="demo">
             <h2 style="color:red">我是template标签模板</h2>
    </template>

    <script src="https://unpkg.com/vue"></script>
    <script type="text/javascript">
        var app=new Vue({
            el:#app,
            data:{
                message: hello Vue!
            },
            template: #demo
        })
    </script>    
</body>
</html>

 

Component 组件

在构造器外部注册全局化 Vue.component:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>Vue component</title>
</head>
<body>
    <div class="container">

        <!-- 组件标签 -->
        <small>*** 全局化就是在构造器的外部用Vue.component来注册</small>

        <div id="app">
            <h5>{{ message }}</h5>
            <hr />
            <momei></momei>
        </div>

    </div>
</body>
  <script src="https://unpkg.com/vue"></script> 
    <script>
        //注册全局组件
        Vue.component(momei,{
            template:`<div style="color:red;">全局化注册的jspang标签</div>`
        })
        var app=new Vue({
            el:#app,
            data:{
                message: Component组件
            }
        })  
    </script>
</html>

局部注册和全局注册相对,只在其作用域可用:

<script type="text/javascript">
        var app=new Vue({
            el:‘#app‘,
            components:{
                "momei":{
                    template:`<div style="color:red;">局部注册的panda标签</div>`
                }
            }
        })
</script>

components写在构造器内且加上了S。

 

Comonent 组件的props属性设置

propr选项就是设置和获取标签上的属性值。

<panda from-here="XIAN"></panda>
var app=new Vue({
    el: ‘#app‘,
    components: {
        "panda": {
             template: `<div style="color:red;">Panda from {{ fromHere }}.</div>`,
             props: [‘fromHere‘]  // 注意此处采用驼峰书写
        }
    }
})

 

Component 父子组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap-grid.css" />
    <title>component 父子组件</title>
</head>
<body>
    <div class="container">
        <div id="app">
            <h3>{{ messgae }}</h3>
            <hr />
            <momei></momei>  
        </div>
    </div>
</body>
    <script src="https://unpkg.com/vue"></script>
    <script type="text/javascript">
       var city={
           template:`<div>from xian!</div>`
       }
        var momei = {
            template:`<div>
                        <p> 八百里秦川</p>
                        <city></city>
                    </div>`,
            components:{
                "city":city
            }
        }
        var app=new Vue({
            el:#app,
            data: {
                messgae: component 父子组件嵌套
            },
            components:{
                "momei":momei
            }
           
        })
    </script>
</html>

 

Component 标签

<component></component>标签是Vue框架自定义的标签,它的用途就是可以动态绑定我们的组件,根据数据的不同更换不同的组件。

定义组件:

var componentA = {
    template: `<h1 style="color:red;">Im componentA</h1>`
};
 var componentB = {
     template: `<h1 style="color:red;">Im componentB</h1>`
};
var componentC = {
    template: `<h1 style="color:red;">Im componentC</h1>`
};

compoments 挂载组件:

components:{
    "componentA":componentA,
    "componentB":componentB,
    "componentC":componentC,
}

在html里书写component标签,通过数据绑定,调用组件。

 

至此Vue的全局API已有一定的认识,要做的就是多多实践,去发现,去建立信心,去走更远。

Vue.js初探