Vue动态组件和异步组件


Vue动态组件和异步组件

动态组件和异步组件的简单使用


一、动态组件

使用标签<component v-bind:is="nxShow"></component>
Vue提供的动态组件的标签component
会根据:is="nxShow"中的nxShow的值自己寻找组件,
即省略了写方法的那步

在使用时,一般结合<keep-alive></keep-alive>标签,让标签切换后留有缓存
自己写的例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动态组件</title>
</head>
<body>
    <div id="app">

    </div>
    <script src="js/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data(){
                return{
                    msg:'动态组件如下(v-show的方法展示)',
                    nxShow:'nx-btn'
                }
            },
            methods:{
                change(){
                    this.nxShow = this.nxShow==='nx-btn'?'nx-input':'nx-btn';
                },
                btnFun(item){
                    this.msg = item;
                }
            },
            template:`
                <div>
                    <h3>这里换了个写法,把内容不放在上面了div里了,放在template里,作用是一样的</h3>
                    <h3>{{msg}}</h3>
                </div>

                <div>
                    <nx-btn v-show="nxShow==='nx-btn'" v-on:btn-click="btnFun"></nx-btn>

                    <nx-input v-show="nxShow==='nx-input'"></nx-input>
                    <p>-------------</p>
                    <h3>Vue提供的动态组件的标签component
                      会根据:is="nxShow"中的nxShow的值自己寻找组件,
                      即省略了写方法的那步
                    </h3>
                    <h3>但是这样组件不会缓存,切换后内容消失得使用keep-alive标签,才能有缓存</h3>
                    <keep-alive>
                        <component v-bind:is="nxShow" v-on:btn-click="btnFun"></component>
                    </keep-alive>

                    <p>-------------</p>
                    <button v-on:click="change">切换显示</button>
                </div>

            `
        });
        /*这里复习一下全局组件的写法:1、创建实例;2、注册组件;3、挂在实例*/
        app.component('nxBtn',{
            methods: {
                btnClick(){
                    /*这里复习了子传父的方法,实现了子组件修改父组件中的内容*/
                    this.$emit('btnClick','你点击了子组件');
                }
            },
            template: `
                <button v-on:click="btnClick">点我跳转</button>
            `
        });
        app.component('nxInput',{
            template:`
                <input type="text">
            `
        });

        app.mount("#app");
    </script>
</body>
</html>

运行演示:
(分割线上是v-show实现,分割线下是vue标签实现

<keep-alive>
        <component v-bind:is="nxShow" v-on:btn-click="btnFun"></component>
 </keep-alive>

在这里插入图片描述
点击切换显示
在这里插入图片描述
输入后的内容,在组件切换后会保留缓存内容
在这里插入图片描述

二、异步组件

使用这个来写Vue.defineAsyncComponent(()=>{})

Vue.defineAsyncComponent()=>{
           return new Promise((resolve, reject)=>{
           })
         }

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异步组件</title>
</head>
<body>
    <div id="app">
        <async-items></async-items>
    </div>
    <script src="js/vue.js"></script>
    <script>
        const app = Vue.createApp({
            data(){
                return{
                    msg:'基础模板'
                }
            }
        });
        /*
        *注册一个全局异步组件
        *使用Vue.defineAsyncComponent()=>{
        *   return new Promise((resolve, reject)=>{
        *   })
        * }
        * 来写
        *
        * Promise((resolve,reject)=>{})解决js中多个异步回调难以维护和控制问题
        * setTimeout(()=>{},3000)让前面的内容延时3秒再运行
        * */
        app.component('async-items',Vue.defineAsyncComponent(()=>{
            return new Promise((resolve, reject)=>{
                setTimeout(()=>{
                    resolve({
                        template:`
                            <div style="background-color: mediumpurple;height: 200px;width: 200px">从服务端请求的异步组件</div>
                        `
                    })
                },3000)
            })
        }));

        app.mount("#app");
    </script>
</body>
</html>

运行效果:
在这里插入图片描述
三秒后
在这里插入图片描述


总结

整理了,自己学习vue时,对动态组件和异步组件的总结

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠溪泽岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值