美文网首页
适合初学者的Vue-1.0教程(三)

适合初学者的Vue-1.0教程(三)

作者: 林立镇 | 来源:发表于2017-08-13 16:43 被阅读0次

计算属性

    <div id="box">
        a => {{a}}
        <br>
        b => {{b}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{
                a:1
            },
            computed:{
                b:function(){
                 return 2;
                }
            }
        });
        console.log(vm.a);
    </script>

计算属性和data对象属性都是可以直接在DOM上直接使用的

var vm=new Vue({
            el:'#box',
            data:{
                a:1
            },
            computed:{
                b:function(){
                    //业务逻辑代码
                    return this.a+1;
                }
            }
        });
        document.onclick=function(){
            vm.a=101;
        };

但计算属性可以获取data对象属性,根据获取的data对象属性计算出想要的值
上面的写法只适用于向计算属性取值

<div id="box">
        a => {{a}}
        <br>
        b => {{b}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{
                a:1
            },
            computed:{
                b:{
                    get:function(){
                        return this.a+2;
                    },
                    set:function(val){
                        this.a=val;
                    }
                }
            }
        });

        document.onclick=function(){
            vm.b=10;
        };
    </script>
image.png

点击之后
这种写法,无论是对计算属性取值或赋值,代码都有做相应的处理


image.png

监听数据变化

    <script>
        window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{
                    a:111,
                    b:2
                }
            });
            vm.$watch('a',function(){
                alert('发生变化了');

                this.b=this.a+100;
                
            });
            document.onclick=function(){
                vm.a=1;
            };
        };
    </script>
    <div id="box">
        {{a}}
        <br>
        {{b}}
    </div>
image.png

点击之后
会弹出“发生变化了”的弹出框

image.png

使用钩子函数$mount

        var vm=new Vue({
            data:{
                arr:['apple','pear','orange']
            },
            methods:{
                add:function(){
                    this.arr.push('tomato');
                }
            }
        }).$mount('#box');

实例化之后再挂载目标元素

生命周期
<div id="box">
        {{msg}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{
                msg:'well'
            },
            created:function(){
                alert('实例已经创建');
            },
            beforeCompile:function(){
                alert('编译之前');
            },
            compiled:function(){
                alert('编译之后');
            },
            ready:function(){
                alert('插入到文档中');
            },
            beforeDestroy:function(){
                alert('销毁之前');
            },
            destroyed:function(){
                alert('销毁之后');
            }
        });

        /*点击页面销毁vue对象*/
        document.onclick=function(){
            vm.$destroy();
        };
    </script>

Vue的生命周期依次为:
实例已经创建、编译之前、编译之后、插入到文档中、销毁之前、销毁之后

Vue也提供了一些便捷方式去操作绑定元素、获取数据、操作实例等
<div id="box">
        {{a}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{
                a:1,
                b:2
            }
        });
    </script>
vm.$el.style.background='red';

对vue的实例vm挂载目标进行背景变红操作
.$el表示实例挂载的目标

console.log(vm.$data.a);

在控制台打印出vue实例vm的数据对象data的属性a
.$data表示数据对象

var vm=new Vue({
            data:{
                a:1,
                b:2
            }
        }).$mount('#box');

如果实例化时没有挂载目标,可以在实例化之后再挂载
vm.$mount('选择器')挂载目标元素

var vm=new Vue({
            aa:11, //自定义属性,
            show:function(){
                alert(1);
            },
            data:{
                a:1
            }
        }).$mount('#box');

        vm.$options.show();
        console.log(vm.$options.aa);

数据除了放在data对象里,还可以放在自定义的属性里,不过自定义属性都在options对象里
vm.$options.aa表示自定义属性对象options的aa属性

vm.$log();

是console.log(vm)的一个便捷方式
会打印出vue的实例对象

计算属性的用法
<div id="box">
        a => {{a}}
        <br>
        b => {{b}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{
                a:1
            },
            computed:{
                b:function(){
                    //业务逻辑代码
                    return this.a+1;
                }
            }
        });
        document.onclick=function(){
            vm.a=101;
        };
    </script>

在点击页面之后,a的值被重新赋值,b则是跟a的值有关联会跟着变动
计算属性一般用来处理业务逻辑的
所以监听数据a,数据b随着a的变化而变化

<div id="box">
        a => {{a}}
        <br>
        b => {{b}}
    </div>
    <script>
        var vm=new Vue({
            el:'#box',
            data:{a:1 },
            computed:{
                b:{  get:function(){ return this.a+2; }, set:function(val){ this.a=val; }  }
            }
        });
        document.onclick=function(){
            vm.b=10;
        };

监听数据b,数据a随着b的变化而变化
计算属性computed的b属性值是对象,get属性用于取值,set属性用于赋值

监听数据变化
            var vm=new Vue({
                el:'#box',
                data:{ a:111, b:2 }
            });
            vm.$watch('a',function(){
                alert('发生变化了');
                this.b=this.a+100;                
            });
            document.onclick=function(){vm.a=1; };

当点击页面时,data数据对象里的a属性值被重新赋值,由于监听了a属性,则a的值变化之后,b的值也随之改变
vm.$watch属性方法用来监听data数据对象里的属性

<div id="box">
        {{json | json}}
        <br>
        {{b}}
    </div>
    <script>
            var vm=new Vue({
                el:'#box',
                data:{
                    json:{name:'strive',age:16},
                    b:2
                }
            });
            vm.$watch('json',function(){
                alert('发生变化了');
            });
            document.onclick=function(){
                vm.json.name='aaa';
            };
    </script>

点击页面之后,data数据对象里json属性对象的name属性值被重新赋值,但并没有弹出“发生变化了”的提示框
因为vm.$watch监听的属性是浅度监听

vm.$watch('json',
function(){ alert('发生变化了');},
{deep:true});

.$watch方法的第三个参数是一个对象,用来设置监听程度
{deep:true}表示深度监听
所以点击页面后会弹出“发生变化了”的提示框

如果v-for指令的数组中有重复的成员该怎么办

一般情况下重复成员会被过滤掉,不会显示出来

<div id="box">
        <input type="button" value="添加" @click="add">
        <ul>
            <li v-for="val in arr" track-by="$index">
                {{val}}
            </li>
        </ul>
    </div>
    <script>
        var vm=new Vue({
            data:{  arr:['apple','pear','orange'] },
            methods:{
                add:function(){this.arr.push('tomato'); }
            }
        }).$mount('#box');
    </script>

添加track-by="index”之后使v-for指令可以打印出重复的成员

自定义过滤器
<div id="box">
        {{a | toDou}}
        {{b | toDou}}
    </div>
    <script>
        Vue.filter('toDou',function(input){
            return input<10?'0'+input:''+input;
        });
        var vm=new Vue({
            data:{a:9, b:11 }
        }).$mount('#box');
    </script>

当数据对象的属性小于10,前面加前缀‘0’,否则则不加
Vue.filter()用来自定义过滤器,
第一个参数是过滤器的标识符,第二个参数是处理函数

<div id="box">
        {{a | toDou 1 2}}
</div>
 Vue.filter('toDou',function(input,a,b){
        alert(a+','+b);
        return input<10?'0'+input:''+input;
});

会弹出“1,2”提示框
过滤器后面的1、2作为处理函数的第二参数和第三参数,第一参数是要处理的属性

    <div id="box">
        {{a | date}}
    </div>
    <script>
        Vue.filter('date',function(input){
            var oDate=new Date(input);
            return  oDate.getFullYear()+'-'+
            (oDate.getMonth()+1)+'-'+
            oDate.getDate()+' '+
            oDate.getHours()+':'+ 
            oDate.getMinutes()+':'+
            oDate.getSeconds();
        });
        var vm=new Vue({
            data:{
                a:Date.now()
            }
        }).$mount('#box');
    </script>

2017-8-13 15:29:34
会得到以上格式的一个时间
Date.now()会得到一个时间戳,然后过滤器对这个时间戳进行处理,就变成这种格式

<div id="box">
        <input type="text" v-model="msg | filterHtml">
        <br>
        {{{msg}}}
    </div>
    <script>
        Vue.filter('filterHtml',{
            read:function(input){ //model-view
                return input.replace(/<[^<]+>/g,'');
            },
            write:function(val){ //view -> model
                console.log(val);
                return val;
            }
        });
        window.onload=function(){
            var vm=new Vue({
                data:{
                    msg:'<strong>welcome</strong>'
                }
            }).$mount('#box');
        };
    </script>

带有html标签的内容写入输入框中,会改变data对象中msg属性的值,由于过滤器写入时不会对内容操作,所以msg的值就是写入时的值,但是在使用过滤器的输入框中输出的值被过滤器将html标签替换成空字符,
所以输入框中值的html标签会消失,
而{{msg}}的值则是带有标签的输入框的值

自定义键盘信息
window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{  a:'blue' },
                methods:{ show:function(){  alert(1); }  }
            });
        };
<div id="box">
        <input type="text" @keydown.c="show"></div>

当键盘按下c键时触发show,弹出“1”提示框

<input type="text" @keydown.17="show">

ctrl的键码是17,按下ctrl键会弹出“1”的提示框

Vue.directive('on').keyCodes.ctrl=17;
<input type="text" @keydown.ctrl="show">

常用的字母Vue都已经定义好了,
但是ctrl、Alt等按键则没有定义好,
将ctrl的键码17赋值给ctrl这个标识符,
则可以语义化的设置keydown的参数

Vue.directive('on').keyCodes.myenter=13;
<input type="text" @keydown.myenter="show">

按下Enter键,会弹出“1”的提示框
参数名可以自定义

自定义指令
    <script>
        Vue.directive('red',function(){
            this.el.style.background='red';
        });

        window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{ msg:'welcome'}
            });
        };
    </script>
    <div id="box">
        <span v-red>
            redBackground
        </span>
    </div>
image.png

使用了v-red指令的标签,背景颜色变成红色
要在自定义的指令标识符前面加上前缀“v-”

<script>
        Vue.directive('red',function(color){
            this.el.style.background=color;
        });
        window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{ backgroundColor:'red'}
            });
        };
    </script>
    <div id="box">
        <span v-red="backgroundColor">
            redBackground
        </span>
    </div>

也会显示红色背景的”redBackground”
指令v-red的参数从data数据对象里的backgroundColor属性获取,
自定义指令directive中的函数则将参数传入给
相应元素的样式属性中

        <span v-red="'red'">
            redBackground
        </span>

之间传入字符串参数也可以,需要用单引号' '包裹

<style>
    #box{
        border:1px solid;
        width:300px;
        height:300px;
        margin-top:100px;
        position: relative;;
    }
    </style>
    <script>
        Vue.directive('drag',function(){
            var oDiv=this.el;
            oDiv.onmousedown=function(ev){
                var disX=ev.clientX-oDiv.offsetLeft;
                var disY=ev.clientY-oDiv.offsetTop;
                console.log('ev.clientY',ev.clientY);
                console.log('oDiv.offsetTop',oDiv.offsetTop);
                oDiv.onmousemove=function(ev){
                    var l=ev.clientX-disX;
                    var t=ev.clientY-disY;
                    oDiv.style.left=l+'px';
                    oDiv.style.top=t+'px';
                };
                oDiv.onmouseup=function(){
                    oDiv.onmousemove=null;
                    oDiv.onmouseup=null;
                };
            };
        });
        window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{
                    msg:'welcome'
                }
            });
        };
    </script>
    <div id="box">
        <div v-drag :style="{width:'100px', height:'100px', background:'blue', position:'absolute', right:0, top:0}"></div>
        <div v-drag :style="{width:'100px', height:'100px', background:'red', position:'absolute', left:0, top:0}"></div>
    </div>

利用上面的原理,可以做一个拼图

自定义元素指令(标签)
<style>
        zns-red{
            background: gray;
            display: inline;
        }
    </style>
    <script>
        Vue.elementDirective('zns-red',{
            bind:function(){
                this.el.style.background='red';
            }
        });
        window.onload=function(){
            var vm=new Vue({
                el:'#box',
                data:{}
            });
        };
    </script>
    <div id="box">
        <zns-red>red-bakground</zns-red>
   </div>
image.png

相关文章

  • 适合初学者的Vue-1.0教程(三)

    计算属性 计算属性和data对象属性都是可以直接在DOM上直接使用的 但计算属性可以获取data对象属性,根据获取...

  • 适合初学者的Vue-1.0教程(四)

    先介绍一下bower包管理器 vue动画 点击按钮,红色方块向右移动200px并逐渐透明化再点击按钮,则在一开始的...

  • 适合初学者的Vue-1.0教程(二)

    在学习了教程(yi),之后大家对data,method,v-for,v-on相信都有所了解了现在进一步介绍Vuev...

  • 适合初学者的Vue-1.0教程(一)

    一、vue介绍 一个mvvm框架(库)比较容易上手、小巧个人容易维护项目vue的发展势头很猛,github上sta...

  • 2018-04-13

    TensorFlow学习资源汇总 一 、TensorFlow教程资源 1)适合初学者的TensorFlow教程和代...

  • hadoop安装详细教程

    对于本教程的说明: 本教程较为详细 适合初学者 教程中内容详见给力星:给力星教程 对于给力星教程的一些说明: 步骤...

  • Dart学习教程

    教程简介 本教程由XXXX研发六部大前端团队所著,如有错误,欢迎纠错,本教程内容较为深入,不太适合初学者,读者最好...

  • RxJava

    教程 给初学者的RxJava2.0教程(一) 给初学者的RxJava2.0教程(二) 给初学者的RxJava2.0...

  • 总结给未进门的python自学者的建议———圆方圆python培

    一:书籍VS视频? 初学者学习Python,视频教程比书本教程要更适合些。 二:持之以恒? 一般说来,我们主动去学...

  • linux软件包管理

    1、源码包安装(c/c++编写,不适合初学者) 经过编译的,更加适合当前计算机,执行效率高,看源码教程即可。 2、...

网友评论

      本文标题:适合初学者的Vue-1.0教程(三)

      本文链接:https://www.haomeiwen.com/subject/pzjcrxtx.html