组件 Component

创建两个数字框

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <div id="m1">
            年龄: <span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span><br/>
            数量: <span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span>
        </div>

        <script>
            var vm1 = new Vue({
                el:"#m1", 
                data:{
                    num: 0
                }
            });
        </script>
    </body>
</html>

引入组件,复用、搭积木的方式构建应用。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <div id="m2">
            <lk-header></lk-header>
            <lk-footer></lk-footer>
        </div>

        <script>
            var vm2 = new Vue({
                el:"#m2",
                components:{
                    "lk-header":{
                        template:"<div><div>返回</div><h1>我是一个APP</h1><div>选项</div></div>"
                    },

                    "lk-footer":{
                        template:"<div>功能导航</div>"
                    }
                }
            });
    </body>
</html>
  • 要有唯一的根元素。
  • template标签。

全局组件

Vue.component("lk-header",{template:.....});
  • 能在任何一个Vue的关联元素中使用。

在组件中使用Model(data和methods)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <div id="m3">
            年龄: <lk-number></lk-number><br>
            数量:<lk-number></lk-number>
        </div>

        <script>
            var vm3 = new Vue({
                el:"#m3",
                components:{
                    "lk-number": {
                        template:'<div><span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span></div>',
                        data:function(){
                            return {
                                num: 0
                            }
                        },
                        methods:{}
                    }
                }
            });
        </script>
    </body>
</html>
  • data必须是一个函数。

共享变量

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <div id="m3">
            年龄: <lk-number></lk-number><br>
            数量:<lk-number></lk-number>
        </div>

        <script>
            var share = {num: 0};
            var vm3 = new Vue({
                el:"#m3",
                components:{
                    "lk-number": {
                        template:'<div><span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span></div>',
                        data:function(){
                            return share;
                        },
                        methods:{}
                    }
                }
            });
        </script>
    </body>
</html>

如何和组件交互

props down, event up.

用过props输入数据

  • props中的属性名是字符串类型。
  • 和变量一样通过this访问。
  • 因为是标签属性,所以数据类型是字符串。

案例:限定数据范围 min max

输入数据的类型。

  • v-bind
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <!--<div id="m1">
            年龄: <span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span><br/>
            数量: <span @click="num-=1">-</span><input type="text" v-model="num"/><span @click="num+=1">+</span>
        </div> -->

        <!--<div id="m2">
            <lk-header></lk-header>
            <lk-footer></lk-footer>
        </div>-->

        <div id="m3">
            年龄: <lk-number :max="8" :min="0"></lk-number><br>
            数量:<lk-number :max="5" :min="0"></lk-number>
        </div>

        <script>
            var vm3 = new Vue({
                el:"#m3",
                data:{
                },
                components:{
                    "lk-number": {
                        template:'<div><span @click="change(-1)">-</span><input type="text" v-model="num"/><span @click="change(1)">+</span></div>',
                        props:["max", "min"],
                        data:function(){
                            return {
                                num: 0
                            }
                        },
                        methods:{
                            change:function(d){
//                                this.num += d;
//                                var min = parseInt(this.min);
//                                var max = parseInt(this.max);
//                                
//                                if(this.num > max)
//                                    this.num = max;
//                                else if (this.num < min)
//                                    this.num = min;

//                                var min = parseInt(this.min);
//                                var max = parseInt(this.max);
                                var min = this.min;
                                var max = this.max;

                                var temp = this.num + d;
                                if (temp > max) 
                                    temp = max;
                                else if (temp < min)
                                    temp = min;
                                this.num = temp;

                            }
                        }
                    }
                }
            });
        </script>
    </body>
</html>

事件

  • 一定明确什么时候触发事件,触发代码写在什么位置。
  • 作业:increase事件和decrease事件。
  • 事件参数
  • 分析@shift="changeHanler"与@shift="changeHanler()"的区别。
  • 作业:num参数。
  • 多个参数传递
  • 作业:oldNum参数和newNum参数。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/vue.js" ></script>
    </head>
    <body>
        <div id="m3">
            年龄: <lk-number :max="8" :min="0" @shift="changeHanler"></lk-number><br>
            数量:<lk-number :max="5" :min="0" @shift="changeHanler()" @increase="increaseHanler()" @decrease="decreaseHanler()"></lk-number>
        </div>

        <script>
            var vm3 = new Vue({
                el:"#m3",
                data:{
                },
                methods:{
                    changeHanler: function(d){
                        console.log("我发现lk-number中的数据变了:"+d);
                    },
                    increaseHanler: function(){
                        console.log("我发现lk-number中的数据变大了.");
                    },
                    decreaseHanler: function(){
                        console.log("我发现lk-number中的数据变小了.");
                    }
                },
                components:{
                    "lk-number": {
                        template:'<div><span @click="change(-1)">-</span><input type="text" v-model="num"/><span @click="change(1)">+</span></div>',
                        props:["max", "min"],
                        data:function(){
                            return {
                                num: 0
                            }
                        },
                        methods:{
                            change:function(d){        
                                var temp = this.num + d;
                                if (temp > this.max) 
                                    temp = this.max;
                                else if (temp < this.min)
                                    temp = this.min;

                                if (temp != this.num){
                                    // 数据被修改了,产生了shift事件.
                                    this.num = temp;
                                    this.$emit("shift", d);

                                    if(d>0){
                                        this.$emit("increase");
                                    } else if (d <0){
                                        this.$emit("decrease");
                                    }
                                }
                            }
                        }
                    }
                }
            });
        </script>
    </body>
</html>

什么是组件?

  • 页面上每个独立的区域就是组件, 例如: 搜索框, 下拉菜单, 导航栏等
  • 将重复的代码封装成组件

用途

  • 在Vue里, 每一个页面就是一个独立的组件
  • 将多个组件可以自由组合

好处

  • 效率高, 有现成的组件直接拿来用
  • 低耦合, 有利于协同开发, 代码不互相依赖
  • 灵活定制, 可以自由开发组件

Vue里的组件

  • 在应用程序开发中, 有些组件是没有的, 需要自定义一个组件
  • Vue 内置的组件有:
  • 有很多Vue的第三方组件库, 例如:
  • 组件可以作为模板
  • 组件可以制作sap 单页
    • 性能好, 最接近原生iOS和安卓开发的APP

使用组件

全局组件

第一步 创建全局组件

  • 通过Vue.conponent()创建一个全局组件
  • Vue首字母为大写, 表示是类, 不是实例, 这是类方法
  • 第一个参数为组件名称, 可以自定义,要求小写, 并且包含一个短杠

      Vue类方法         组件名称       组件数据存到对象
    Vue.component('my-component', {template: '#example'})
    

    template两种方式: id和html结构

第二步 调用组件

  • 组件名称就是标签名称
    <div id="example">
    <my-component>我是新的组件!</my-component>
    </div>
    

现在我们可以在html里直接使用组件了, 但是和div标签一样, 并没有特别的效果.

第三步 在组件中使用data

  • 给组件添加数据data和方法 method

案例

results matching ""

    No results matching ""