Vue动态组件

news2025/1/21 9:43:03

等疫情结束了,要开始爬爬山、看看海,做些不会后悔的事情


在这里插入图片描述

一、概念

1. 示例

组件是可复用的 Vue 实例,且带有一个名字,这里实现一个最简单的组件:

父组件:

<template>
  <div>
    <h1>Father</h1>
    <!-- 调用子组件 -->
    <Son />
  </div>
</template>
<script>
// 引入子组件模块
import Son from './son'
export default {
  components: {
  	// 声明子组件
    Son
  },
}
</script>

子组件:

<template>
    <h1>Son</h1>
</template>

2. 复用

组件可以被任意次复用,并且每个组件内部都可以独立维护,利用 slot 插槽 可以实现组件自由拓展

对插槽还不太熟悉的可以查看 Vue.js 文档

父组件:

<template>
  <div class="fahter">
    <Son></Son>
    <i>------------------------------</i>
    <Son>
        <template v-slot:main>
            <h1>Father-main</h1>
        </template>
    </Son>
    <i>------------------------------</i>
    <Son>
        <template v-slot:footer><div /></template>
        <h1>Father</h1>
    </Son>
  </div>
</template>
<script>
import Son from './son'
export default {
  components: {
    Son
  },
}
</script>

子组件:

<template>
  <div>
    <slot><h1>header</h1></slot>
    <slot name="main"><h1>main</h1></slot>
    <slot name="footer"><h1>footer</h1></slot>
  </div>
</template>

效果:
在这里插入图片描述

3. 组件传值

⑴. 父传子


父组件:

<template>
    <div class="father">
        <Son :toSonValue="fatherValue"></Son>
    </div>
</template>
<script>
import Son from './son'
export default {
    data() {
        return {
            fatherValue: 'value => father'
        }
    },
    components: {
        Son
    },
}
</script>

子组件:

<template>
    <h1>{{ this.toSonValue }}</h1>
</template>
<script>
export default {
    props: {
        toSonValue: {
            type: String
        }
    },
    data() {
        return {
            sonValue: 'value => son'
        }
    }
}
</script>

⑵. 子传父

子组件:

<template>
    <div>
        <h1>son</h1>
        <button @click="sendValue">传值</button>
    </div>
</template>
<script>
export default {
    data() {
        return {
            sonValue: 'value => son'
        }
    },
    methods: {
        sendValue() {
            this.$emit('father-methods', this.sonValue)
        }
    }
}
</script>

父组件:

<template>
    <div class="father">
        <Son @father-methods="click" />
        <h1>{{ this.sonValue }}</h1>
    </div>
</template>
<script>
import Son from './son'
export default {
    data() {
        return {
            sonValue: ''
        }
    },
    components: { Son },
    methods: {
        click(payload) {
            console.log('get')
            this.sonValue = payload
        }
    }
}
</script>

⑶. ref 传值(父传子)

父组件:

<template>
    <div class="father">
        <Son ref="son" />
        <button @click="click">传值</button>
    </div>

</template>
<script>
import Son from './son'
export default {
    data() {
        return {
            fatherValue: 'value => father'
        }
    },
    components: { Son },
    methods: {
        click() {
            this.$refs.son.getFatherValue(this.fatherValue)
        }
    }
}
</script>

子组件:

<template>
        <h1>{{this.fatherValue}}</h1>
</template>
<script>
export default {
    data() {
        return {
            fatherValue: ''
        }
    },
    methods: {
        getFatherValue(payload) {
            this.fatherValue = payload
        }
    }
}
</script>

⑷. parent 传值(子传父)

子组件:

<template>
    <div>
        <h1>son</h1>
        <button @click="sendValue">传值</button>
    </div>
</template>
<script>
export default {
    data() {
        return {
            sonValue: 'value => son'
        }
    },
    methods: {
        sendValue() {
            this.$parent.getSonValue(this.sonValue)
        }
    }
}
</script>

父组件:

<template>
    <div>
        <Son />
        <h1>{{ this.sonValue }}</h1>
    </div>
</template>
<script>
import Son from './son'
export default {
    data() {
        return {
            sonValue: ''
        }
    },
    components: { Son },
    methods: {
        getSonValue(payload) {
            this.sonValue = payload
        }
    }
}
</script>


二、动态组件

1. is

  • 一个标签页面切换不同组件
  • 组件不会直接全部挂载,切换的时候才会挂载
<template>
    <div>
        <component :is="assembly"/>
        <div>
            <button @click="changeAssembly(1)">son1</button>
            <button @click="changeAssembly(2)">son2</button>
            <button @click="changeAssembly(3)">son3</button>
        </div>
    </div>
</template>
<script>
export default {
    data() {
        return {
            assembly: ''
        }
    },
    components: {     
        son1: () => import('./son1'),
        son2: () => import('./son2'),
        son3: () => import('./son3'),
    },
    methods: {
        changeAssembly(value) {
            if(value === 1) {
                this.assembly = 'son1'
            } else if(value === 2){
                this.assembly = 'son2'
            } else if(value === 3) {
                this.assembly = 'son3'
            } else {}
        }
    }
}
</script>

预览:
在这里插入图片描述

2. keep-alive

动态加载的组件,会导致 DOM 重新注册和销毁,从而重置用户表单、刷新了用户页面等等问题;所以希望那些标签的组件实例,能够被在它们第一次被创建的时候缓存下来。

<keep-alive>
   <component :is="assembly" />
</keep-alive>


三、异步组件

太难了,学不动,有大佬了解可以发文章链接我学习一下



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【让CSDN的浪漫弥漫女神节】_Unity基础不动山不摇_回顾篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

promise 以及经典面试题

1.Promise 它是一个ES6提出一个新语法&#xff0c;用来优化异步代码的写法。promise&#xff1a;承诺 ● 生活中&#xff0c;它是用来表述 对将来要发生的事情的肯定。 例如 &#xff1a; 高中生说&#xff0c;老师&#xff0c;我会考上一所好大学的&#xff1b;销售员说&…

刷题日常计~JS④

作者 : SYFStrive 博客首页 : 点击跳转HomePage &#x1f4dc;&#xff1a; 初编程JavaScript之每天10&#x1f5e1;5题 &#x1f449; 从质变到量变&#x1f4aa; &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区…

Ajax 前后端数据交互

ajax 数据交互 今天又是奋斗的一天&#xff0c;行吧&#xff0c;来学习ajax ajax 数据交互什么是ajax&#xff1f;ajax的优势ajax的使用创建一个ajax对象配置这个对象发送请求接受返回过来的数据ajax状态码readystatechangeresponseTextajax请求方式封装一个属于自己的ajax什么…

2022年最新最详细在IDEA中配置Tomcat(含有详细图解过程)、建立使用IEDA建立一个Web项目的案例

1、首先已经成功安装过tomcat 如果没有成功安装&#xff0c;参考这篇tomcat安装教程(安装成功可忽略)&#xff1a;https://blog.csdn.net/weixin_43304253/article/details/117001797 2、在IDEA中配置tomcat的详细步骤 2.1、run ->Edit Confifurations 2.2 、点击加号 2.…

微信小程序自定义导航栏,实现不同用户角色登陆后显示不同的tabbar(避坑版)

在我们开发小程序的过程中&#xff0c;会遇到权限登录问题&#xff0c;不同的角色登录后显示的底部导航栏tabbar是不一样的。网上看到了很多的博客&#xff0c;多多少少会有些坑&#xff0c;会遇到问题。今天这篇博客就可以一次性解决。 了解概念 自定义tabbar 使用方法 app…

React修改Antd组件样式的方法

1.修改默认组件样式和写自己组件样式的区别 当我们写自己的样式时&#xff0c;在组件页面中定义class名称&#xff0c;再在less文件中对这个class定义样式。 //index.js import React,{useState} from react; import styles from ./index.less;const Index (props) >{ret…

36.一文讲透JavaScript日期对象Date,时间戳、1970、date方法、date计算

文章目录JavaScript日期和时间处理方法Date对象的创建new Date()new Date(milliseconds)1970年之前的时间&#xff1f;new Date(date_str)new Date(year, month, date, hours, minutes, sec, ms)Date对象的方法获取日期内容设置日期内容日期的自动校准日期转为数字、日期差值Da…

Node.js安装及环境配置之Windows篇

Node.js安装及环境配置之Windows篇Node.js安装及环境配置之Windows篇一、安装环境二、安装node.js步骤三、前期准备四、开始安装五、环境配置Node.js安装及环境配置之Windows篇 一、安装环境 1、本机系统&#xff1a;Windows 10&#xff08;64位&#xff09; 2、Node.js&…

纯js判断文件流格式类型:pdf,doc,docx,xls,xlsx,ppt,pptx一次搞定!

目录使用js判断文件类型的场景方法特点输入输出方法步骤1. 查看每种格式文件的16进制码&#xff0c;提取不同文件类型的“特征数”。2. 先判断大类型&#xff0c;在具体大类下判断小类型项目地址&#xff1a;纯前端基于react实现的多类型文件预览&#xff1a;通过arraybuffer判…

uniapp全局组件全局使用(不在每个页面template使用,仅支持H5),函数式调用全局组件方法

最简单的使用&#xff0c;在 main.js 编写如下代码&#xff0c;即可将 xxx 组件在每个页面显示 // main.js// 引入组件 import xxx from "/components/xxx.vue";// 将该组件挂载在document.body下 document.body.appendChild(new xxx().$mount().$el); 函数式调用全…

JS高级知识总结

文章目录1. this指向问题2. 对象进阶2.1 对象的定义和使用2.2 对象访问器2.2.1 Getter2.2.2 Setter2.3 对象构造器2.4 对象原型2.4.1 prototype属性2.4.2 \_\_proto\_\_ 属性2.4.3 constructor属性2.4.4 原型链2.5 Object对象2.5.1 管理对象2.5.2 保护对象3. 函数进阶3.1 函数的…

.Net Core中间件

目录 一、什么是中间件 二、中间件的用途 三、中间件的三个概念 四、自定义中间件 五、ASP.NET Core附带中间件组件 六、中间件和过滤器的区别 一、什么是中间件 在浏览网站或者使用手机App加载内容的时候&#xff0c;浏览器或者手机App其实在向Web服务器发送HTTP请求。服…

NodeJS安装(npm包管理器)

1、nodejs下载 windows下的NodeJS安装是比较方便的&#xff0c; 只需要登陆官网&#xff08;Node.js&#xff09;&#xff0c;直接点击64-bit下载安装 2、安装过程基本直接“NEXT”&#xff0c;NodeJS已经集成了npm&#xff0c;所以npm也一并安装好了 3、在cmd窗口输入node -…

React-DevTools开发者工具安装

React开发者工具最简单的安装方式自然是科学上网&#xff0c;通过Google Chrome浏览器访问应用商店安装了。以下介绍另一种安装方式&#xff1a;基于 react-devtools的GitHub项目源码编译进行插件安装。 目录 React-DevTools&#xff1a;GitHub项目地址 React-DevTools&#x…

修改elementUI中el-date-picker内置样式

一.编写背景 今天正在日常的需求编写和bug调试中&#xff0c;产品提出了这样一个需求。为了满足用户在新增数据时的便捷准确&#xff0c;时间选择格式为“年月日时”&#xff0c;即用户不需要选择分合秒&#xff0c;换句话说就是下图中红色框的两项不需要。 二.问题分析。 当时…

基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…

如何使用 JavaScript 读取文件

您可以使用 JavaScript File API 加载选定文件的内容。本节介绍 File API 的基本用法。 现在让我们看看如何使用 File API。 使用 JavaScript 读取文件概述 选择带有输入元素的文件 在 HTML 中&#xff0c;您可以通过将 input 元素的 type 属性设置为 file 来选择文件。 &…

vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref 1.设置&#xff1a;【:ref“‘XXX’ index”】XXX -->自定义ref的名字 2.获取&#xff1a;let ref eval(‘this.$refs.XXX’ index)[0] 3.示例&#xff1a; 代码如下所示 <template><div class"ref_test"><div v-fo…

常用的几种布局方式---Flex 布局(垂直居中展示)

常用的几种布局方式---Flex 布局(垂直居中展示&#xff09; 前言一、默认使用静态布局二、flex布局1.父元素container1.1.display:flex1.2.flex-direction属性1.3.主轴与侧轴1.4.justify-content属性1.5.align-items属性1.6.flex-wrap属性2.子元素items 前言 怎样让一个元素在…