Vue动态组件与v-once指令

1、动态组件

动态组件可以实现组件之间的切换,先看一个不使用动态组件实现组件切换显示的例子

<div id="root">
        <child-one v-if="type==='child-one'"></child-one>
        <child-two v-if="type==='child-two'"></child-two>
        <button @click="handleBtnClick">change</button>
    </div>
    <script>
        Vue.component('child-one',{
            template: '<div>child-one</div>'
        })
        Vue.component('child-two',{
            template:'<div>child-two</div>'
        })
        var vm=new Vue({
            el: '#root',
            data:{
                type: 'child-one'
            },
            methods: {
                handleBtnClick: function () {
                    this.type=(this.type==='child-one'?'child-two':'child-one');
                }
            }
        })
    </script>

结果展示: 

 

 使用动态组件:绑定is特性来切换不同的组件,如下例

<div id="root">
        <component :is="type"></component> <!--使用动态组件-->
        <!--<child-one v-if="type==='child-one'"></child-one>-->
        <!--<child-two v-if="type==='child-two'"></child-two>-->
        <button @click="handleBtnClick">change</button>
    </div>
    <script>
        Vue.component('child-one',{
            template: '<div>child-one</div>'
        })
        Vue.component('child-two',{
            template:'<div>child-two</div>'
        })
        var vm=new Vue({
            el: '#root',
            data:{
                type: 'child-one'
            },
            methods: {
                handleBtnClick: function () {
                    this.type=(this.type==='child-one'?'child-two':'child-one');
                }
            }
        })
    </script>

结果展示: 

2、v-once

不需要表达式

 渲染普通的 HTML 元素在 Vue 中是非常快速的,但有的时候你可能有一个组件,这个组件包含了大量静态内容。在这种情况下,你可以在根元素上添加 v-once 特性以确保这些内容只计算一次然后缓存起来。即只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。

上例可以修改为:

<div id="root">
        <component :is="type"></component>        
        <button @click="handleBtnClick">change</button>
    </div>
    <script>
        Vue.component('child-one',{
            template: '<div v-once>child-one</div>'<--!使用v-once指令,优化性能>
        })
        Vue.component('child-two',{
            template:'<div v-once>child-two</div>'<--!使用v-once指令,优化性能>
        })
        var vm=new Vue({
            el: '#root',
            data:{
                type: 'child-one'
            },
            methods: {
                handleBtnClick: function () {
                    this.type=(this.type==='child-one'?'child-two':'child-one');
                }
            }
        })
    </script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值