Vue:过度效果、动画效果、key值、插槽、动态组件、实例的属性

vue过渡效果:

transition标签对,用来放置即将要发生动画或过渡效果的标签

默认使用六个类名,设置效果,类名以v-开头

如果需要设置多个效果,需要给transition添加name属性,那么六个类名一律 nameValue-开头

        /*  设置标签即将显示时的初始位置 */
        .v-enter {
            left: -100%;
        }

        /* 设置标签显示时的结束位置,可忽略不写 */
        .v-enter-to {
            left: 0;
        }

        /* 设置动画或者过渡的时间 */
        .v-enter-active {
            transition: .5s;
        }

        /* 设置动画即将消失时的初始位置,可忽略不写 */
        /*.v-leave {*/
        /*left: 0;*/
        /*}*/
        /* 设置动画消失时的位置 */
        .v-leave-to {
            left: 100%;
        }

        /* 设置动画或者过渡的时间效果 */
        .v-leave-active {
            transition: .5s;
        }

特殊的template标签对,用来存储指令属性,而不占用标签

仅仅是个指令容器标签,浏览器不会渲染

        <transition>
            <template v-if="isShow">
                <side-bar></side-bar>
            </template>
        </transition>

动画效果:

    <style>
        p {
            width: 200px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            background: red;
            color: #fff;
        }

        @keyframes fadeIn {
            0% {
                transform: translateY(-100px);
                opacity: 0;
            }

            50% {
                transform: translateY(100px);
                opacity: 0.5;
            }

            100% {
                transform: translateY(0);
                opacity: 1;
            }
        }

        @keyframes fadeOut {
            0% {
                transform: translate(-100px);
                opacity: 1;
            }

            50% {
                transform: translate(100px);
                opacity: 0.5;
            }

            100% {
                transform: translate(0);
                opacity: 0;
            }
        }

        .slide-enter-active {
            animation: fadeIn 1s both;
        }

        .slide-leave-active {
            animation: fadeOut 1s both;
        }
    </style>
</head>

<body>

    <div id="demo">
        <button @click="isShow = !isShow"> 切换 </button>

        <transition name="slide">
            <p v-if="isShow"> 普通的标签,即将出现动画效果 </p>
        </transition>

        <!-- 调用第三方的动画库 -->
        <transition enter-active-class="" leave-active-class="">

        </transition>
    </div>

    <script>
        var vue = new Vue({
            el: '#demo',
            data: {
                isShow: false
            }
        })
    </script>

</body>

key值:

v-if 或者 v-for 在进行标签显示/隐藏/排序时,会重复利用已经存在的标签,而不是创建新标签

组件也是重复使用的

通过key值给标签增加标记

<body>
    <div id="demo">
        <button @click=" info= 'username' ">用户名</button>
        <button @click=" info= 'password' "> 密码 </button>
        <template v-if="info === 'username'">
            <input type="text" placeholder="请输入用户名" key="user" />
        </template>
        <template v-else>
            <input type="text" placeholder="请输入密码" key="pass">
        </template>

        <ul>
            <!-- 标签重新排序时,内容变化,但是标签排序不变,加key值之后,标签内容都变化 -->
            <li v-for="(ins, index) in 4" :key="'ins' + index">
                {{ ins }}
            </li>
        </ul>
    </div>
    <script>
        var vue = new Vue({
            el: '#demo',
            data: {
                info: 'username'
            }
        })
    </script>
</body>

vue组件--插槽:

<body>
    <div id="demo">
        <!-- 组件中的原始内容,默认会被组件的模板内容所替代 -->
        <my-com>
            <h2 slot="h2"> 标题标签 </h2>
            <p slot="p2"> 普通的标签 </p>
            <section>普通的section标签</section>
            <main> 普通的main标签 </main>
        </my-com>

        <!-- vue中的数据传递:父往子传,子往父传,非父子传 -->
        <my-tab>
            <!-- 
                父组件的使用范围,即将使用子组件中的变量
                 其实是,组件的原始内容,使用组件的模板变量
             -->
            <h3> 用到组件的变量呢 </h3>
            <!--
                老版本写法 slot-scope属性,值自定义,
                slot标签对所设置的属性及其属性值,会自动被aa接收
            -->
            <p slot-scope="aa"> {{aa.msg}} </p>
            <!--
                新版本写法
                通过特殊的template标签对,以及v-slot指令,通过属性值接收slot标签对中的属性及其属性值
                v-slot 简写为#

                匿名标签slot 默认的name属性是default,可忽略不写
                作为作用域插槽存在时,通过v-slot:default接收数据
             -->

            <template #default="mm"> {{mm}}</template>
            <template #head="ccc"> {{ ccc }} </template>
        </my-tab>
    </div>

    <!--
    slot标签对,用来存储组件的没有设置slot属性的原始内容,没有设置属性,被称为匿名插槽
    具有name属性的slot标签对,用来存储组件原始内容中设置有对应slot属性值的标签,被称为具名插槽
    -->
    <script id="my-com" type="text/html">
        <div class="my-com">
            <h1> 组件的大标题 </h1>
            <slot name="h2"></slot>
            <slot name="p2"> </slot>
            <slot></slot>
        </div>
    </script>

    <script id="my-tab" type="text/html">
        <div class="my-tab">
            <h2> 作用域插槽的标题 </h2>
            <p> {{num}} </p>
            <slot :msg="num"></slot>
            <slot name="head" :bb="num"></slot>
        </div>
    </script>


    <script>
        var vue = new Vue({
            el: '#demo',
            data: {

            },
            components: {
                myCom: {
                    template: '#my-com',
                    data() {
                        return {

                        }
                    }
                },
                myTab: {
                    template: '#my-tab',
                    data() {
                        return {
                            num: 12
                        }
                    }
                }
            }

        })
    </script>

</body>

vue组件--动态组件:

<body>
    <div id="demo">
        <button @click="show = 'my-com' "> 选项1 </button>
        <button @click="show = 'my-tab' "> 选项2 </button>
        <button @click="show = 'my-aaa' "> 选项3 </button>
        <!--
        动态组件,通过特殊的component标签以及is属性,设置组件显示
        任意自定义标签,只要具有特殊的is属性,标记组件的
    -->
        <component :is="show"></component>
    </div>

    <script id="mycom" type="text/html">
        <div class="my-com">
            <h1> com组件 </h1>
        </div>
    </script>

    <script id="my-tab" type="text/html">
        <div class="my-tab">
            <h1> tab组件 </h1>
        </div>
    </script>

    <script id="my-aaa" type="text/html">
        <div class="my-aaa">
            <h1> aaa组件 </h1>
        </div>
    </script>

    <script>
        var vue = new Vue({
            el: '#demo',
            data: {
                show: 'my-com'
            },
            components: {
                myCom: {
                    template: '#mycom',
                    data() {
                        return {

                        }
                    }
                },
                myTab: {
                    template: '#my-tab',
                    data() {
                        return {

                        }
                    }
                },
                myAaa: {
                    template: '#my-aaa',
                    data() {
                        return {

                        }
                    }
                }
            }
        })
    </script>
</body>

vue实例的属性:

<body>
    <div id="demo">
        <h3 ref="h3"> h3标签 </h3>
        <my-com ref="coms"></my-com>
    </div>
    <script id="mycom" type="text/html">
        <div class="mycom">
            <h2 ref="h2"> 组件 </h2>
        </div>
    </script>
    <script>
        var vue = new Vue({
            el: '#demo',
            mounted() {
                // vue实例属性一律$开头
                console.log('-----分割线-----');
                // 获取实例或组件的根元素
                console.log(this.$el);
                // 获取组件或实例范围中具有ref属性的标签或组件 reference 参考
                console.log(this.$refs);
                // 获取组件中所有的子组件
                console.log(this.$children);
                console.log(this.$refs.coms === this.$children[0]);
            },
            components: {
                myCom: {
                    template: '#mycom',
                    mounted() {
                        console.log('子组件')
                        console.log(this.$el);
                        console.log(this.$refs);
                        // 获取父组件
                        console.log(this.$parent);
                        // 获取插槽
                        console.log(this.$slots);
                    }
                }
            }
        })
    </script>
</body>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值