吴裕雄--天生自然WEB前端开发实战--Vue组件与过渡

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue组件创建方法一</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
             <mycom></mycom>
        </div>
        <script>
            Vue.component('mycom',{
               template : "<h3>使用vue.extend创建的组件</h3>"   
            })
            var vm=new Vue({
                el:'#app',
                data:{
                    },
            });
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue组件创建方法二</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
        <!--下面<div>标记是Vue控制区域内-->
        <div id="app">
             <mycom></mycom>
        </div>
        <!--下面<template>标记是Vue控制区域外,组件的模板-->
        <template id="temp">
         <div>
          <h3>利用模板定义组件</h3>
         </div>
        </template>
        <script>
            Vue.component('mycom',{
               template : "#temp"   
            })
            var vm=new Vue({
                el:'#app',
                data:{
                    },
            });
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue私有组件</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
        
        <div id="app">
             <mycom></mycom>
        </div>
        
        <template id="temp">
         <div>
          <h3>私有组件</h3>
         </div>
        </template>
        <script>
        var vm = new Vue({
            el: '#app',
            components: {
                mycom: {
                    template: '#temp',
                }
            }
         })
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue组件中的数据与方法</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
      <div id="app">
        <counter></counter>
        <hr>
        <counter></counter>
        <hr>
        <counter></counter>
      </div>
    
      <template id="temp">
        <div>
            <input type="button" value="加一" @click='increment'>
            <h3>{{count}}</h3>
        </div>
      </template>
    
      <script>
        Vue.component('counter',{
          template:'#temp',
          data:function(){
              return {count:0}
          },
          methods:{
            increment() {
              this.count++
            }
          }
        })
    
        var vm=new Vue({
          el:'#app',
          data:{},
          methods:{}
        });
      </script>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue组件切换</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
      <div id="app">
        选择需要切换的组件:
        <input type="radio" name="change" v-model="tab" value="myCom1"  checked=""/>1号
        <input type="radio" name="change" v-model="tab" value="myCom2" />2号
        <keep-alive>
            <component :is="tab"></component>
        </keep-alive>
      </div>
     <template id="com1">
         <p> {{title}}</p>
     </template>
     <template id="com2">
         <p> {{title}}</p>
     </template>
  <script>
       Vue.component('myCom1',{
           template:"#com1",
        data(){
            return {
                title:'子组件1号',
            }
         }
       })
       Vue.component('myCom2',{
           template:"#com2",
               data(){
                   return {
                       title:'子组件2号',
                   }
                }
       })
        var vm=new Vue({
          el:'#app',
          data:{
              tab:'myCom1'
          },
          methods:{}
        });
      </script>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue组件切换</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
      <div id="app">
        选择需要切换的组件:
        <input type="radio" name="change" value="1" @click="flag=true" checked=""/>1号
        <input type="radio" name="change" value="2" @click="flag=false" />2号
       <my-com1 v-if="flag"></my-com1>
       <my-com2 v-else="flag"></my-com2>
      </div>
     <template id="com1">
         <p> {{title}}</p>
     </template>
     <template id="com2">
         <p> {{title}}</p>
     </template>
  <script>
       Vue.component('myCom1',{
           template:"#com1",
        data(){
            return {
                title:'子组件1号',
            }
         }
       })
       Vue.component('myCom2',{
           template:"#com2",
               data(){
                   return {
                       title:'子组件2号',
                   }
                }
       })
        var vm=new Vue({
          el:'#app',
          data:{
              flag:true
          },
          methods:{}
        });
      </script>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>父组件传递数据给子组件</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
      <div id="app">
        {{msg}}  
        <mycom v-bind:parentmsg="msg"></mycom>
      </div>
      <script>
        var vm=new Vue({
          el:'#app',
          data:{
              msg:'(父组件的data数据)'
          },
          components:{
              mycom:{
                  template:"<h3 @click='change'>子组件中获取的父组件数据:{{parentmsg}}---{{title}}</h3>",
                  data(){
                      return{
                          title:'子组件数据标题',
                          content:'子组件数据内容',
                        }
                      },
                    props:['parentmsg'],
                    methods:{
                        change(){
                            this.parentmsg="子组件方法修改了值"
                        }
                    }
                  },
              }
        });
      </script>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>子组件传递数据给父组件</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
    <div id="test">
        
        name数据:{{datamsgFromSon.name}}<br>
        age数据:{{datamsgFromSon.age}}<br>
        {{dataNumFromSon}}
        <!--父组件向子组件传递方法,使用的是事件绑定机制:v-on,当我们自定义了一个事件属性之后,那么子组件就能够通过某些方式来调用传递进去的方法-->
        <com2 v-on:func="show"></com2>
    </div>
    <template id="tmp1">
        <div>
            <h3>这是子组件</h3>
            <input type="button" value="子组件按钮,调用父组件show方法" @click="myclick">
        </div>
    </template>
    
    <script>
        var com2={
            template:"#tmp1",//通过指定了一个Id,表示要去加载指定Id的template元素中的内容,当作组件的html结构
            data(){
                return{
                    sonmsg:{name:'lb',age:25}
                }
            },
            methods:{
                myclick(){
                    //当单击子组件的按钮,调用父组件的func方法
                    //$emit: 含义是触发、调用的意思
                    //下面自带两个参数,相当于是子组件向主组件传递参数
                    this.$emit('func',123,this.sonmsg)
                }
            }
        }
        var vm=new Vue({
            el:'#test',
            data:{
                dataNumFromSon:0,
                datamsgFromSon:{name:'wq',age:18}
            },
            methods:{        
                show(data1,data2){
                    this.dataNumFromSon=data1
                    this.datamsgFromSon=data2
                    
                }
            },
            components:{
                com2
            }
        })
            
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>自定义组件</title>
        <script src="js/vue.min.js"></script>
        <style>
            input:focus{ 
              background-color:black;
              color:white;
            }
        </style>
    </head>
    <body>
    <div id="app">
        <p>页面载入时,第二个input 元素自动获取焦点:</p>
        <input  /><br /><br />
        <input v-focus /><br /><br />
        <input >
    </div>
     
    <script>
    new Vue({
      el: '#app',
      directives: {
        // 注册一个局部的自定义指令 v-focus
        focus: {
          // 指令的定义
          inserted: function (el) {
            // 聚焦元素
            el.focus()
            el.value="获得焦点"
          }
        }
      }
    })
    </script>
    </body>
     </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>自定义组件</title>
        <script src="js/vue.min.js"></script>
        <style>
            input:focus{ 
              background-color:black;
              color:white;
            }
        </style>
    </head>
    <body>
    <div id="app">
        <p>页面载入时,第二个input 元素自动获取焦点:</p>
        <input  /><br /><br />
        <input v-focus /><br /><br />
        <input >
    </div>
     
    <script>
    // 注册一个全局自定义指令 v-focus
    Vue.directive('focus', {
      // 当绑定元素插入到 DOM 中。
      inserted: function (el) {
        // 聚焦元素
        el.focus()
        el.value="获得焦点"
      }
    })
    // 创建根实例
    new Vue({
      el: '#app'
    })
    </script>
    </body>
     </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>钩子函数bind的引用</title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
    <div id="app"  v-runoob:hello.a.b="message">
    </div>
     
    <script>
    Vue.directive('runoob', {
      bind: function (el, binding, vnode) {
        var s = JSON.stringify
        
        el.innerHTML =
          '钩子函数bind中各参数的取值:<br />' +
          '<b>name:</b> '       + s(binding.name) + '<br>' +
          '<b>value:</b> '      + s(binding.value) + '<br>' +
          '<b>expression:</b> ' + s(binding.expression) + '<br>' +
          '<b>argument:</b>'   + s(binding.arg) + '<br>' +
          '<b>modifiers:</b>'  + s(binding.modifiers) + '<br>' +
          '<b>vnode keys:</b>' + Object.keys(vnode).join(', ')
      }
    })
    new Vue({
      el: '#app',
      data: {
        message: 'Hello Vue world!'
      }
    })
    </script>
    </body>
     </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue的CSS过渡</title>
        <script src="js/vue.min.js"></script>
        <style>
            
          .v-enter,.v-leave-to{
              opacity: 0;
              transform:translateX(180px);
          }
          .v-enter-active,.v-leave-active{
              transition:all 1s ease;
          }
        </style>
    </head>
    
    <body>
    <div id="app">
        <input type="button" value="显示/隐藏" @click="flag=!flag" />
        <transition>
            <h3 v-if="flag" >{{msg}}</h3>
        </transition>
    </div>
    
     
     
    <script>
    new Vue({
      el: '#app',
      data: {
        msg:'Hello Vue World!' ,
        flag:true
      }
    })
    </script>
    </body>
     </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vue使用第三方样式类库实现过渡</title>
        <link rel="stylesheet" href="./css/animate.min.css">
        <script src="js/vue.min.js"></script>
    </head>
    <body>
     <div id="test">
        <input type="button" value="togle" @click="flag=!flag" />
        <transition 
          enter-active-class="animated bounceIn" 
          leave-active-class="animated bounceOut"
            :duration={enter:400,leave:200}>
            <h3 v-if="flag">{{msg}}</h3>
        </transition>
     </div>
        
        <script>
            var vm=new Vue({
                el:'#test',
                data:{
                    msg:'Hello Vue World!' ,
                    flag:false,
                }
            });
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>钩子函数实现半场动画</title>
        <style>
            .ball{
                width:20px;
                height: 20px;
                border-radius: 50%;
                background-color: red;
            }
        </style>
        
    </head>
    <body>
     <div id="test">
         <input type="button" value="start" @click="flag=!flag">
         <transition @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
             <div class="ball" v-show="flag"></div>
         </transition>
        
     </div>
        <script src="js/vue.min.js"></script>
        <script>
            var vm=new Vue({
                el:'#test',
                data:{
                    flag:false
                },
                methods:{
                    beforeEnter(el){
                        el.style.transform="translate(50px,50px)"
                    },
                    enter(el,done){
                        el.offsetWidth
                        el.style.transform="translate(150px,450px)"
                        el.style.transition="all 1s ease"
                        
                        //这里的doen(),其实就是afterEnter函数的引用,done表示立即调用afterEnter
                        done()
                    },
                    afterEnter(){
                        this.flag=false
                    }
                }
            });
        </script>
    </body>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            <input type='radio' name="r1" v-model='tab' value="mycom1">组件1
            <input type='radio' name="r1" v-model='tab' value="mycom2">组件2
            <keep-alive>
                <component v-bind:is='tab'></component>
            </keep-alive>
        </div>
        <template id="tmp1">
            <h1>{{title}}</h1>
        </template>
        <template id="tmp2">
            <h5>{{title}}</h5>
        </template>
        <script>
            Vue.component('mycom1',{
                template:'#tmp1',
                data:function(){
                    return{
                        title:'组件1!!!'
                    }
                }
            })
            Vue.component('mycom2',{
                template:'#tmp2',
                data:function(){
                    return{
                        title:'子组件2!!!'
                    }
                }
            })
            var vm=new Vue({
                el:'#app',
                data:{
                    tab:'mycom1'
                }
            })
        </script>
    </body>
</html>
<!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>Vue组件创建方法一</title>
            <script src="js/vue.min.js"></script>
        </head>
        <body>
            <div id="app">
                 <!--调用驼峰方式命名组件-->
                 <my-com></my-com>
            </div>
            <script>
                var com1 = Vue.extend({
                   template : "<h3>使用vue.extend创建的组件1</h3>"   
                })
                //驼峰方式命名组件
                Vue.component('myCom',com1)
                var vm=new Vue({
                    el:'#app',
                    data:{
                        },
                });
            </script>
        </body>
        </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>第一个Vue程序</title>
    <script src="js/vue.min.js"></script>
    </head>
    <body>
            <div id="app">
                商品名称:<input type="text" name="name" v-model="name" />
                商品价格:<input type="text" name="price" v-model="price" />
                <button @click="add()">增加商品</button>
                <table border="1px">
                    <template v-for="(v,index) in goods">
                        <tr style="background-color: orange;" v-if="index==0">
                            <td v-for="t in title">{{t}}</td>
                        </tr>
                        <tr>
                            <td>{{index+1}}</td>
                            <td>{{v.name}}</td>
                            <td>{{v.price}}</td>
                            <td><button @click="del(index)">删除</span></td>
                        </tr>
                    </template>
                </table>
            </div>
        </body>
        <script>
            new Vue({
                el:'#app',
                data:{
                    title:[
                        '商品序号',
                        '商品名称',
                        '商品价格',
                        '删除商品'
                    ],
                    goods:[
                        {name:'zhangsan',price:'18'},
                        {name:'wmx',price:'20'}
                    ],
                    name:'',
                    price:''
                },
                methods:{
                    add:function(){
                        var str = {name:this.name,price:this.price};
                        this.goods.unshift(str);
                    },
                    del:function(i){
                        this.goods.splice(i,1);
                    }
                }
            });
        </script>
    </html>
    
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>Vue组件实验</title>
    <script src="js/vue.min.js"></script>
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <style>
        .myTop{
            margin-top: 10px;
        }
        .myLi{
                    margin-top: 10px;
                    
                }
        ul li span{ cursor: pointer; }
        </style>
        </head>
        <body>
            <div class="container myTop">
                <div id="app">
                    <div class="form-group">
                        <label>微博内容:</label>
                        <textarea  class="form-control" v-model="msg"></textarea>
                    </div>
                    <div class="form-group">
                        <input type="button" value="发表微博" class="btn btn-primary"
                        @click="add()">
                    </div>
                    
                    <h2>微博列表:</h2>
                    <ul class="list-group">
                        <li  class="list-group-item myLi" v-for="(v,i) in article">
                            <span class="badge" @click="del(i)">删除</span>
                             {{v}}</p>
                        </li>
                    </ul>
                </div>
            </div>
        </body>
        <script>
            new Vue({
                el:'#app',
                data:{
                    article:[
                            "武汉加油",
                            "中国加油!"
                    ],
                    msg:''
                },
                methods:{
                    add:function(){
                        //unshift() 把一个元素添加到数组的开头,并返回数组的新长度。
                        this.article.unshift(this.msg);
                    },
                    del:function(i){
                        //splice() 删除第i个位置后的一个元素
                        this.article.splice(i,1);
                    }
                }
            });
        </script>
    </html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>练习</title>
    <script src="js/vue.min.js"></script>
    </head>
    <body>
        
            <div id="app">
                    <my-hello></my-hello>
                    <my-hello></my-hello>
            </div>
            <template id="tmp">
                    <!-- <template>必须有且只有一个根元素 -->
                    <div>
                        <h3>{{msg}}</h3>
                        <ul>
                            <li v-for="value in arr">{{value}}</li>
                        </ul>
                    </div>
            </template>
            </div>
        </body>
        <script>
                var vm=new Vue({
                    el:'#app',
                    components:{
                        'my-hello':{
                            name:'lb',  
                            template:'#tmp',
                            data(){
                                return {
                                    msg:'武汉欢迎您!',
                                    arr:['lb','wq','lyd']
                                }
                            }
                        }
                        
                    }
                });    
            </script>
    </html>
    
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    <title>练习</title>
    <script src="js/vue.min.js"></script>
    <style>
        /* div的初始状态*/
        .box {
            width:100px;
            height: 200px;
            background-color:greenyellow;
        }
            /**
        * 定义进入动画和退出动画的过程
        * 代表关注的是height的变化,动画的时间是5
        */
        .fade-enter-active, .fade-leave-active {
            transition: height 5s;
        }
        /* 定义进入动画的初始状态*/
        .fade-enter {
            height: 0;
        }
    
        /* 定义进入动画的结束状态*/
        .fade-enter-to {
            height: 200px;
        }
    
        /* 定义离开动画的初始状态*/
        .fade-leave {
            height: 200px;
        }
    
        /* 定义离开动画的结束状态*/
        .fade-leave-to {
            height: 0;
        }
    </style>
    </head>
    <body>
        <div id="app">
            <button @click="myBtn">显示/隐藏切换</button>
            <!--一个命名为fade的<transition>标签包裹着类名为h的<div>-->
            <transition name="fade">
                <div class="box" v-if="show"></div>
            </transition>
        </div>
            
        </body>
        <script>
                var vm=new Vue({
                    el:'#app',
                    data:{
                        show:true
                    },
                    methods:{
                        myBtn:function(){
                            this.show=!this.show
                        }
                    }
                });    
            </script>
    </html>
    
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="css/bootstrap.min.css" rel="stylesheet" type="text/css">
    <script src="js/vue.min.js"></script>
    <style>
        #app ul{
            list-style: none;
        }
        #app ul li{
            width: 450px;
        }
        #app ul li ul li{
            float: left;
            width: 30px;
            height: 20px;
            background-color: bisque;
            margin: 5px 10px;
        }
    </style>
</head>

<body>
    <div id="app">
        <ul>
            <li v-for="(itemRow, indexRow) in 9" :key="indexRow">
                <ul >
                    <li v-for="(itemCol, indexCol) in 9" :key="indexCol">
                        {{indexRow}}行{{indexCol}}列
                    </li>
                </ul>
                <br>
            </li>

        </ul>
        你单击了:{{info}}
    </div>
    

    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                info:"hello"
            }
      
       
        });
       
    </script>

</body>

</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <mycom></mycom>
            <mycom></mycom>
            <lbcom></lbcom>
    
        </div>
        <template id="temp1">
          <div>
            <input type="button" value="加1" @click="inc">
            <h1>{{count}},hello</h1>
          </div>
        </template>
        <script>
            
            Vue.component('mycom',{
                template:'#temp1',
                data:function(){
                    return({count:88})
                },
                methods:{
                    inc:function(){
                        this.count++;
                    }
                }
            })        
            var vm=new Vue({
                el:'#app',
                data:{},
                components:{
                    lbcom:{
                        template:'<h1>hello subComponent</h1>'
                    }
                }
            })
        </script>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="js/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            {{msg}}
            <maincomp></maincomp>
        </div>
        <template id="tmp">
            <h1>{{mainmsg}}</h1>
        </template>
        <script>
            Vue.component('maincomp',{
                template:'#tmp',
                data:function(){
                    return{
                        mainmsg:'world mainCompontent data'
                    }
                }
            })
            var vm=new Vue({
                el:'#app',
                data:{
                    msg:'hello Main'
                }
            })
        </script>
    </body>
</html>
原文地址:https://www.cnblogs.com/tszr/p/13871365.html