Vue1.0学习小结2

目录

  1. 生命周期
  2. 计算属性
  3. 自定义方法与属性
  4. 数据监听
  5. 动画
  6. 组件
  7. slot
  8. 路由
1.生命周期

用Vue框架,熟悉它的生命周期可以让开发更好的进行。这里借助一个图片说明一下生命周期的钩子函数。

生命周期
<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>
2.计算属性
//computed里面可以放置一些业务逻辑代码,一定记得return
<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>
//computed里的属性默认也可以接收对象,有set和get方法
<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>
3.自定义方法和属性
var vm=new Vue({
    aa:11, //自定义属性,
    show:function(){
        alert(1);
    },
    data:{
        a:1
    }
}).$mount('#box');
vm.$options.show();
console.log(vm.$options.aa);
console.log(vm.$log());  //可以相当于查看vm.$data
4.数据监听

可以在数据发生变化的时候监测处理,类似angular1的脏处理
a、vm.$watch(name,fnCb); //浅度监听针对基本值类型
b、vm.$watch(name,fnCb,{deep:true}); //深度监视,可以处理json对象

<div id="box">
    {{a}}
    <br>
    {{b}}
</div>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:111,
            b:2
        }
    });
    vm.$watch('a',function(){
        alert('发生变化了');
        this.b=this.a+100;
    });
</script>
//深度监听,添加deep=true
<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('发生变化了');
    },{deep:true});  
    document.onclick=function(){
        vm.json.name='aaa';
    };
</script>
5.动画

vue动画有格式参考,例如想加fade动画效果,可以有fade-transition/fade-enter/fade-leave等,不过如果想弄点好看点,建议配合animate.css

<style>
    .fade-transition{
        transition: 1s all ease;    
    }
    .fade-enter{
        opacity: 0;
    }
    .fade-leave{
        opacity: 0;
        transform: translateX(200px);
    }
</style>
<div id="box">
    <input type="button" value="按钮" @click="toggle">
    <div id="div1" v-show="bSign" transition="fade"></div>
</div>
<script>
    new Vue({
        el:'#box',
        data:{
            bSign:true
        },
        methods:{
            toggle(){
                this.bSign=!this.bSign;
            }
        }
    });
</script>
//引进animate.css
<div id="box">
    <input type="button" value="按钮" @click="toggle">
    <div id="div1" class="animated" v-show="bSign" transition="bounce"></div>
</div>
<script>
    new Vue({
        el:'#box',
        data:{
            bSign:true
        },
        methods:{
            toggle(){
                this.bSign=!this.bSign;
            }
        },
        transitions:{ //定义所有动画名称
            bounce:{
                enterClass:'zoomInLeft',
                leaveClass:'zoomOutRight'
            }
        }
    });
</script>
6.组件

使用组件的方式有多种,还可以嵌套(父子级)。如果想了解组件之间的关系,可以安装vue-devtools插件,它可以从chrome商店直接下载安装。不过要注意的一点就是,需要翻墙才能下载。

//全局组件, extend方式
<div id="box">
    <aaa></aaa>
</div>
<script>
    var Aaa=Vue.extend({
        template:'<h3>我是标题3</h3>'
    });
    Vue.component('aaa',Aaa);  //注册组件
</script>

//局部组件,extend方式
<div id="box">
    <my-aaa></my-aaa>
</div>
<script>
    var Aaa=Vue.extend({
        template:'<h3>{{msg}}</h3>',
        data(){
            return {
                msg:'ddddd'
            }
        }
    });
    var vm=new Vue({
        el:'#box',
        components:{ //局部组件
            'my-aaa':Aaa
        }
    });
</script>

//局部组件,components方式
<div id="box">
    <my-aaa></my-aaa>
</div>
<script>
    var vm=new Vue({
        el:'#box',
        components:{
            'my-aaa':{
                data(){
                    return {
                        msg:'welcome vue'
                    }
                },
                methods:{
                    change(){
                        this.msg='changed';
                    }
                },
                template:'<h2 @click="change">标题2->{{msg}}</h2>'
            }
        }
    });
</script>

//全局组件,components方式
<div id="box">
    <my-aaa></my-aaa>
</div>
<script>
    Vue.component('my-aaa',{
        template:'<strong>好</strong>'
    });
    var vm=new Vue({
        el:'#box'
    });
</script>

//模板方式,使用script,类似backbone
<div id="box">
    <my-aaa></my-aaa>
</div>
<script type="x-template" id="aaa">
        <h2 @click="change">标题2->{{msg}}</h2>
</script>
<script>
    var vm=new Vue({
        el:'#box',
        components:{
            'my-aaa':{
                data(){
                    return {
                        msg:'welcome vue'
                    }
                },
                methods:{
                    change(){
                        this.msg='changed';
                    }
                },
                template:'#aaa'
            }
        }
    });
</script>

////模板方式,使用template
<div id="box">
    <my-aaa></my-aaa>
</div>
<template id="aaa">
    <h1>标题1</h1>
    <ul>
        <li v-for="val in arr">
            {{val}}
        </li>
    </ul>
</template>
<script>
    var vm=new Vue({
        el:'#box',
        components:{
            'my-aaa':{
                data(){
                    return {
                        msg:'welcome vue',
                        arr:['apple','banana','orange']
                    }
                },
                methods:{
                    change(){
                        this.msg='changed';
                    }
                },
                template:'#aaa'
            }
        }
    });
</script>

//动态切换组件,利用is特性
<div id="box">
    <input type="button" @click="a='aaa'" value="aaa组件">
    <input type="button" @click="a='bbb'" value="bbb组件">
    <component :is="a"></component>
</div>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:'aaa'
        },
        components:{
            'aaa':{
                template:'<h2>我是aaa组件</h2>'
            },
            'bbb':{
                template:'<h2>我是bbb组件</h2>'
            }
        }
    });
</script>

//嵌套组件(父子组件)
//子级获取父级数据用props,props可以用数组方式忽略类型
<template id="aaa">
    <bbb :mmm="msg2" :my-msg="msg"></bbb>
</template>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:'aaa'
        },
        components:{
            'aaa':{
                data(){
                    return {
                        msg:111,
                        msg2:'我是父组件的数据'
                    }
                },
                template:'#aaa',
                components:{
                    'bbb':{
                        props:['mmm','myMsg'],  //第一种方式,建议
                        //props:{    //第二种方式,如果有-,要写成驼峰式写法
                        //  'm':String,
                        //  'myMsg':Number
                        //},
                        template:'<h3>我是bbb组件->{{mmm}} <br> {{myMsg}}</h3>'
                    }
                }
            }
        }
    });
</script>

//父级获取子级数据用
//子级主动推送数据用vm.$emit(事件名,数据) 父级用@的方式写事件接收 ,推荐
//此外可以用vm.$dispatch(事件名,数据) 子级向父级发送数据 vm.$broadcast(事件名,数据) 父级向子级广播数据。 配合event使用。在vue2.0里面已经废除。
<template id="aaa">
    <span>我是父级 -> {{msg}}</span>
    <bbb @child-msg="get"></bbb>
</template>
<template id="bbb">
    <h3>子组件-</h3>
    <input type="button" value="send" @click="send">
</template>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:'aaa'
        },
        components:{
            'aaa':{
                data(){
                    return {
                        msg:111,
                        msg2:'我是父组件的数据'
                    }
                },
                template:'#aaa',
                methods:{
                    get(msg){
                        // alert(msg);
                        this.msg=msg;
                    }
                },
                components:{
                    'bbb':{
                        data(){
                            return {
                                a:'我是子组件的数据'
                            }
                        },
                        template:'#bbb',
                        methods:{
                            send(){
                                this.$emit('child-msg',this.a);
                            }
                        }
                    }
                }
            }
        }
    });
</script>
7.slot

它的作用是作用: 占个位置,类似ng里面 transclude(指令),可以参考插件vue-infinite-loading

//单个slot
<div id="box">
    <aaa>
        <ul>
            <li>1111</li>
            <li>2222</li>
            <li>3333</li>
        </ul>
    </aaa>
    <hr>
    <aaa>
    </aaa>
</div>
<template id="aaa">
    <h1>xxxx</h1>
    <slot>这是默认的情况</slot>
    <p>welcome vue</p>
</template>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:'aaa'
        },
        components:{
            'aaa':{
                template:'#aaa'
            }
        }
    });
</script>
//多个slot,用name区分
<div id="box">
    <aaa>
        <ul slot="ul-slot">
            <li>1111</li>
            <li>2222</li>
            <li>3333</li>
        </ul>
        <ol slot="ol-slot">
            <li>111</li>
            <li>222</li>
            <li>333</li>
        </ol>
    </aaa>
    <hr>
    <aaa>
    </aaa>
</div>
<template id="aaa">
    <h1>xxxx</h1>
    <slot name="ol-slot">这是默认的情况</slot>
    <p>welcome vue</p>
    <slot name="ul-slot">这是默认的情况2</slot>
</template>
<script>
    var vm=new Vue({
        el:'#box',
        data:{
            a:'aaa'
        },
        components:{
            'aaa':{
                template:'#aaa'
            }
        }
    });
</script>
8. 路由

对于单页应用,官方提供了vue-router进行路由跳转的处理

//vue跳转链接格式  <a v-link="{path:'/home'}">主页</a>
//展示内容:<router-view></router-view>
//1. 准备一个根组件
var App=Vue.extend();
//2. Home News组件都准备
var Home=Vue.extend({
    template:'<h3>我是主页</h3>'
});
var News=Vue.extend({
    template:'<h3>我是新闻</h3>'
});
//3. 准备路由
var router=new VueRouter();
//4. 关联
router.map({
    'home':{
        component:Home
    },
    'news':{
        component:News
    }
});
//5. 启动路由
router.start(App,'#box');
//6.指定默认跳转:
router.redirect({
‘/’:'/home'
});

//路由嵌套(多层路由),用subRoutes 
<div id="box">
    <ul>
        <li>
            <a v-link="{path:'/home'}">主页</a>
        </li>
        <li>
            <a v-link="{path:'/news'}">新闻</a>
        </li>
    </ul>
    <div>
        <router-view></router-view>
    </div>  
</div>

<template id="home">
    <h3>我是主页</h3>
    <div>
        <a v-link="{path:'/home/login'}">登录</a>
        <a v-link="{path:'/home/reg'}">注册</a>
    </div>
    <div>
        <router-view></router-view>
    </div>
</template>
<template id="news">
    <h3>我是新闻</h3>
</template>
<script>
    //1. 准备一个根组件
    var App=Vue.extend();
    //2. Home News组件都准备
    var Home=Vue.extend({
        template:'#home'
    });
    var News=Vue.extend({
        template:'#news'
    });
    //3. 准备路由
    var router=new VueRouter();
    //4. 关联
    router.map({
        'home':{
            component:Home,
            subRoutes:{
                'login':{
                    component:{
                        template:'<strong>我是登录信息</strong>'
                    }
                },
                'reg':{
                    component:{
                        template:'<strong>我是注册信息</strong>'
                    }
                }
            }
        },
        'news':{
            component:News
        }
    });
    //5. 启动路由
    router.start(App,'#box');
    //6. 跳转
    router.redirect({
        '/':'home'
    });
</script>

//url的path路径为 detail/001?a=1&b=1
//参数传递router格式为'/detail/:id',注意有冒号。接收用$route.params
//path后面?问号后边参数接收$route.query
<template id="detail">
    {{$route.params | json}}
    <br>
    {{$route.path}}
    <br>
    {{$route.query | json}}
</template>
<script>
    //注意下边subRoutes参数前面的冒号
    router.map({
        'home':{
            component:Home,
            subRoutes:{
                'login':{
                    component:{
                        template:'<strong>我是登录信息</strong>'
                    }
                },
                'reg':{
                    component:{
                        template:'<strong>我是注册信息</strong>'
                    }
                }
            }
        },
        'news':{
            component:News,
            subRoutes:{
                '/detail/:id':{
                    component:Detail
                }
            }
        }
    });
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,198评论 0 6
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 10,982评论 4 129
  • 基本格式 以json的形式、将数据(支持所有格式)挂载在vue的data上、方法挂载在vue的methods上。 ...
    kirito_song阅读 749评论 0 21
  • vue 2.0 渐进式框架 MVC 单向通信 > m:model 数据层 保存数据 > v:view视图层 用户界...
    web前端ling阅读 716评论 0 0