vue组件和过渡操作

Vue

一、组件

1、组件的嵌套
*1、全局组件的嵌套
<div id="box">
       <v-head></v-head>
</div>

<template id='head'>
    <div>
        <h1> 组件111 </h1>
        <v-foot></v-foot>
     </div>
</template>

 <template id='foot'>
    <h1>组件222</h1>
 </template>  
 
 //注册
 Vue.component('v-head',Vue.extend({
        template:'#head',    
 }))
 Vue.component('v-foot',Vue.extend({
   template:'#foot',    
}))
*2、私有组件的嵌套
用法同上
//注册
components:{
            'v-aa':{
                template:'#aa',
                components:{
                   'v-bb':{
                       template:'#bb'
                   }
                }
            }
        }
//私有组件的嵌套必须包含在嵌套的组件内,

组件的作用域是独立的,对象的属性是私有的;

2、组件间的传值
*1、父组件的数据传给子组件

父传子:在子组件标签上绑定自定义属性式指令,值为父组件传递的数据,子组件内部通过props接收属性名;

父组件--子组件传值Template 标签内 给子组件设置属性

<v-nav :msg=“msg” :n=“name”></v-nav>

在子组件的components设置 props:[‘msg’,‘n’], /子组件接收数据 /

子组件的template内通过{{}}直接绑定数据即可

 <div id="box">
    <v-father></v-father>
 </div>
 ————————————————————————————————————————————————————————————————————————————————————————
 <template id='father'>
    <div>
       <h1>父组件————{{str1}}</h1>
       <button @click="tap()">传值给子组件</button>
       <hr />
       <v-child :name='str'></v-child>   
    </div>
 </template>
 <template id='child'>
    <div>
        <h1>子组件</h1>
         <h2>接收父的数据————{{name}}</h2>   
     </div>
 </template>  
  ——————————————————————————————————————————————————————————————————————————————————————
   var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        methods:{
               
        },
        components:{
            'v-father':{
                template:'#father',
                data:function(){
                    return{
                    str1:"hhhhhhhfather",
                    str:''
                    }
                },
                methods:{
                    tap(){
                        this.str=this.str1;
                    }
                            
                },
                components:{
                    'v-child':{
                        template:"#child",
                        props:['name'],
                        data:function(){
                            return{
                                str:''
                            }
                        },
                        methods:{
                        
                        }
                    }
                }
            }
        }
       
    })
*2、子组件的数据传给父组件

子传父:在子组件标签上绑定自定义事件,子组件内部通过$emit进行事件数据推送,父组件内部通过事件调用函数的参数接收数据。

、子组件---父组件传值 $emit

        <div id="box">
       <v-father></v-father>
    </div> 
——————————————————————————————————————————————————————————————————————————————————————————
    <template id='father'>
        <div>
            <h1>父组件</h1>
            <h2>zi组件的数据————{{str1}}</h2>
            <hr />
            <v-child @toparent="getdata"></v-child>   //自定义的事件,调用不要加()
        </div>
    </template>
    <template id='child'>
            <div>
                <h1>子组件————{{str}}</h1>
                <button @click="tap()">传值</button>
            </div>
     </template> 
 —————————————————————————————————————————————————————————————————————————————————————————
  var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        components:{
            'v-father':{
                template:'#father',
                data:function(){
                    return{
                    str1:""
                    }
                },
                methods:{
                    getdata(msg){
                    console.log(msg);
                    this.str1=msg;
                    },         
                },
                components:{
                    'v-child':{
                        template:"#child",
                        data:function(){
                            return{
                                str:'hhhhhhhchild'
                            }
                        },
                        methods:{
                            tap(){
                                this.$emit('toparent',this.str) 
                            },
                        }
                    }
                }
            }
        }  
    })    
*3、平行组件传值
    <div id="box">
            <v-a></v-a>
            <v-b></v-b>
            <v-c></v-c>
    </div>
————————————————————————————————————————————————————————————————————————————————————
    <template id='a'>
        <div>
            <h1>AAA组件————{{str}}</h1>
            <button @click="send()">传值给CCC组件</button>
        </div>
    </template>
    <template id='b'>
            <div>
                <h1>BBB组件————{{str}}</h1>
                <button @click="send()">传值给CCC组件</button>
            </div>
    </template>
    <template id='c'>
            <div>
                <h1>CCC组件</h1>
                <h2>接收AAA的数据————{{stra}}</h2>
                <h2>接收BBB的数据————{{strb}}</h2>   
            </div>
     </template>
————————————————————————————————————————————————————————————————————————————————————

var vm1 = new Vue({})
    var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        components:{
            'v-a':{
               template:'#a',
               data:function(){
                   return{
                       str:"这是AAA的数据"
                   }
               },
               methods:{
                   send(){
                       vm1.$emit('isa',this.str)
                   }
               }
            },
            'v-b':{
               template:'#b',
               data:function(){
                   return{
                       str:"这是BBB的数据"
                   }
               },
               methods:{
                   send(){
                    vm1.$emit('isb',this.str)
                   }
               }
            },
            'v-c':{
               template:'#c',
               data:function(){
                   return{
                      stra:'',
                      strb:''
                   }
               },
               mounted(){
                   var _this=this;
                vm1.$on('isa',function(data){
                    _this.stra=data;
                });
                vm1.$on('isb',function(data){
                    _this.strb=data;
                })
               }
            }
        }
       
    })
3、父子组件的操作
1、操作dom
<h1 ref="tit">hello</h1>

this.$refs.tit.innerHTML 
2、父子组件操作

父组件操作子组件---$refs

​ $parent 子组件直接操作父组件

<div id="box">
     <v-p></v-p>
</div>   
————————————————————————————————————————————————————————————————————————
    <template id='par'>
        <div>
            <h1>父组件———{{str}}</h1>
            <button @click="tap()">操作子组件</button>
            <hr>
            <v-c ref="child"></v-c>
        </div>
    </template>
    <template id='chd'>
         <div>
              <h1>子组件———{{str}}</h1>
              <button @click="tap()">操作父组件</button>
        </div>
    </template>
——————————————————————————————————————————————————————————————————————————————————————
var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        components:{
           'v-p':{
               template:'#par',
               data:function(){
                   return{
                       str:"this is Parente",
                   }
               },
               methods:{
                   tap(){
                       console.log(this.$refs.child.str)
                   }
               },
               components:{
                    'v-c':{
                        template:'#chd',
                        data:function(){
                            return{
                                str:"this is child"
                            }
                        },
                        methods:{
                            tap(){
                                console.log(this.$parent.str) 
                            }
                        }
                    }
                }
           }
        }
    })
3、nextTick

this.$nextTick(function(){ }) 保证挂载完成后,拿到最新的数据

 <div id="box">
           <h1 ref="tit">{{info}}</h1> 
  </div>
________________________________________________
var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        mounted(){
            this.info="hihihi";
            this.$nextTick(function(){
                console.log(this.$refs.tit.innerHTML)
            }) 
        }
    })
4、Slot

使用slot发布内容、Slot标签添加 属性

<slot name="ul-slot">

内容可通过 slot属性值查找

是否显示默认

<ul slot="ul-slot">
<div id="box">
           <v-con>
               <p slot='bb'>h哈哈哈</p>
           </v-con>
    </div>
   <template id='aa'>
       <div>
           <slot name="aa">占个位</slot>
           <p>hahahahha</p>
           <slot name="bb">再占个位</slot>
       </div>
   </template>
  ———————————————————————————————————————————————————————————————— 
    var vm = new Vue({
        el:'#box',
        data:{
            info:"hello"
        },
        components:{
            'v-con':{
                template:'#aa'
            }
        }
        
    })
4、Toast提示框
<div id="box">
      <button @click="tap()">toast提示框</button>
</div>
————————————————————————————————————————————————————————————————————
  var Toast =Vue.component('Toast',{
        template:`
                <div class='toast' v-if="isshow">
                 {{text}}
                </div>
                `,
            data:function(){
                return{
                    text:'登录成功!',
                    isshow:true,
                    time:2000
                } 
            }
    })
    var toast=function(){
        let vueToast =new Toast({
            el:document.createElement('div'),
        })
        document.body.appendChild(vueToast.$el);
        setTimeout(function(){
            vueToast.isshow=false;
        },vueToast.time)
    }
    var vm = new Vue({
        el:'#box',
        methods:{
            tap(){
                toast()
            }
        } 
    })

二、过渡

css3中实现动画效果的两种方式;

​ transition过渡:需要事件触发;改变的运动形态只有两组关键帧(开始、结束);

​ animation动画:不需要事件触发;改变的运动形态可以设置多组关键帧 ;

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
包括以下工具:

  • 在 CSS 过渡和动画中自动应用 class
  • 可以配合使用第三方 CSS 动画库,如 Animate.css
  • 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  • 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
1、单元素的过渡——transition封装组件

Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 。

        <transition name="fade">
                <p v-if="isshow">Lorem  ullam dolores veniam!</p>
        </transition>
通过给需要过渡的元素加transition封装组件,并添加 name 属性来通过样式控制;

过渡的类名:(假设 name = " fade")

1、fade-enter

​ 定义进入过渡的开始状态;元素进入之前生效。开始进入

2、fade-enter-active

​ 定义进入过渡生效时的状态。在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。进入过程中

3、fade-enter-to

​ 进入过渡的结束状态 ;即进入完成

4、fade-leave

​ 离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。开始离开

5、fade-leave-active

​ 离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。 离开过程中

6、fade-leave-to

​ 定义离开过渡的结束状态 ;离开结束

.fade-enter-active, .fade-leave-active {
            transition: opacity .5s
}

.fade-enter, .fade-leave-active {
            opacity: 0
}
在css样式中控制过渡中每个过程的动画效果
2、CSS------animation动画实现过渡

CSS 动画用法同 CSS 过渡,区别是在动画中 v-enter 类名在节点插入 DOM 后不会立即删除,而是在 animationend 事件触发时删除。

用法相同,使用name=“bounce”
.bounce-enter-active {
  animation: bounce-in .5s;
}
.bounce-leave-active {
  animation: bounce-in .5s reverse;
}
@keyframes bounce-in {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(1.5);
  }
  100% {
    transform: scale(1);
  }
 }
3、与swiper——animate结合使用:自定义过渡的类名

​ 链接swiper的 Animate.css 文件

<transition 
    enter-active-class="animated bounceInLeft"
    leave-active-class="animated bounceOutRight"
    >
      <p v-if="isshow">Lorem , ullam dolores veniam!</p>
</transition>
在transition里加属性,属性值为animated 和动画效果的名称;
4、transition-group

当前有多个元素都需要获得过渡效果是用transition-group,当有相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们,否则 Vue 为了效率只会替换相同标签内部的内容。

<transition-group 
            enter-active-class="animated bounceInLeft"
            leave-active-class="animated bounceOutRight"
        >
            <p v-if="isshow" key="1">Lorem, ullam dolores veniam!</p>
            <p v-if="isshow" key="2">Lorem, ullam dolores veniam!</p>
 </transition-group>
5、过渡相关的事件
 <transition-group 
            enter-active-class="animated bounceInLeft"
            leave-active-class="animated bounceOutRight"

            @before-enter="beforeEnter()"   进入之前
            @enter="enter($event)"                          进入过程中
            @after-enter="afterEnter"     进入完成

            @before-leave="beforeLeave()"   离开之前
            @leave="leave()"                            离开中
            @after-leave="afterLeave()"         离开完毕

        >
            <p v-if="isshow" key="1">Lorem  veniam!</p>
  </transition-group>
  ————————————————————————————————————————————
   methods:{
            beforeEnter(){
                console.log(1)
            },
            enter(e){
                    e.style.color="yellow";
                console.log(2)
            },
            afterEnter(e){
                    e.style.color="violet";
                console.log(3)
            },
            beforeLeave(){
                console.log(4)
            },
            leave(){
                console.log(5)
            },
            afterLeave(){
                console.log(6)
            }
        }
函数可通过e.style来设置样式
5、多个组件进行过渡---动态注册组件
    <div id="box">
        <button @click="view='v-a'">AAA组件</button>
        <button @click="view='v-b'">BBB组件</button>
        <transition 
            enter-active-class="animated bounceInLeft"
            leave-active-class="animated bounceOutRight"
        >
            <component :is='view'></component>
        </transition>
    </div>
    <template id='a'>
        <div>
            <h1>AAA组件</h1>
            <p>Lorem dam.</p>
        </div>
    </template>

    <template id='b'>
        <div>
            <h1>BBB组件</h1>  
            <ul>
                <li>bbb</li>
                <li>bbb</li>
            </ul>
        </div>
    </template>
_____________________________________________________________
    var vm =new Vue({
        el:"#box",
        data:{
            view:'v-a'
        },
        components:{
            'v-a':{
                template:'#a'
            },
            'v-b':{
                template:'#b'
            }
        }           
    })
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,204评论 0 6
  • 首先呢,我们建一个空的文件夹,取名vue组件2。建好了没?下一步,很重要!命令行,先进入已经建好的文件夹vue组件...
    初级程序员阅读 399评论 0 1
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,048评论 0 29
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,975评论 3 119
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,006评论 4 129