• Vue实现动态组件


    使用场景:同一个区域因状态不同或者tab页,展示给用户不同模版样式逻辑的组件

    动态组件实现,是通过使用 is attribute 来切换不同的组件

    v-bind:is="currentTabComponent">

     一、公共动态组件父组件(可以通过keep-alive缓存)

    1. <!-- 公共动态组件 isComponent.vue -->
    2. <template>
    3. <div>
    4. <el-button :class="currentClass(item)" v-for="item in Object.keys(Dict)" :key="item" @click="changeBtn(item)">
    5. {{ item }}
    6. </el-button>
    7. <div>
    8. <keep-alive>
    9. <!-- 根据component搭配is内容进行动态切换显示内容 -->
    10. <component :is="currentTabComponent" :data="data" ref="comp"></component>
    11. </keep-alive>
    12. </div>
    13. </div>
    14. </template>
    15. <script>
    16. // 引入动态显示的组件
    17. import compA from './components/dynamicComponents/compA.vue'
    18. import compB from './components/dynamicComponents/compB.vue'
    19. export default {
    20. name: "myTabsName",
    21. components: { compA, compB },
    22. data() {
    23. return {
    24. currentTabComponent: 'compA',
    25. data: '西游记',
    26. // 自定义字典
    27. Dict: {
    28. '西游记': 'compA',
    29. '水浒传': 'compB',
    30. }
    31. };
    32. },
    33. computed: {
    34. // 通过计算属性添加class
    35. currentClass() {
    36. return (item) => {
    37. if (this.currentTabComponent === this.Dict[item]) { return 'active' }
    38. }
    39. }
    40. },
    41. methods: {
    42. // 切换tab事件
    43. changeBtn(val) {
    44. this.currentTabComponent = this.Dict[val]
    45. this.data = val
    46. }
    47. },
    48. };
    49. </script>
    50. <style lang="scss" scoped>
    51. .active {
    52. background-color: red;
    53. color: white;
    54. }
    55. </style>

     二、1.公共动态组件子组件A

    1. <!-- 公共动态子组件 compA.vue -->
    2. <template>
    3. <div class="aa">
    4. {{ data }}
    5. <br>
    6. <el-input class="inp" v-model="formA"></el-input>
    7. </div>
    8. </template>
    9. <script>
    10. export default {
    11. name: "compA",
    12. props: {
    13. data: {
    14. type: String,
    15. default: ''
    16. }
    17. },
    18. data() {
    19. return {
    20. formA: ''
    21. }
    22. }
    23. };
    24. </script>
    25. <style>
    26. .aa {
    27. background-color: rgb(250, 203, 211);
    28. margin: 10px auto;
    29. width: 500px;
    30. height: 300px;
    31. }
    32. .inp {
    33. width: 100px;
    34. }
    35. </style>

      二、2.公共动态组件子组件B

    1. <!-- 公共动态子组件 compB.vue -->
    2. <template>
    3. <div class="bb">
    4. {{ data }}
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: "compB",
    10. props: {
    11. data: {
    12. type: String,
    13. default: ''
    14. }
    15. },
    16. };
    17. </script>
    18. <style>
    19. .bb {
    20. background-color: rgb(181, 200, 244);
    21. margin: 10px auto;
    22. width: 500px;
    23. height: 300px;
    24. }
    25. </style>

    做个记录,如有不足,欢迎补充。

     不要忽视你达成的每个小目标,它是你前进路上的垫脚石。冲!

  • 相关阅读:
    【python与数据分析】CH5 函数
    STM32的USB接口介绍
    SoftMax回归
    正确利用JS赋值表达式返回值
    冰冰学习笔记:二叉树的进阶OJ题与非递归遍历
    白嫖Amazon MemoryDB并构建你专属的Redis内存数据库
    Linux系统中curl命令用法详解
    LeetCode 84.柱状图中最大的矩形
    DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之十大知识领域之4核心—成本进度管理
    Python爬虫入门
  • 原文地址:https://blog.csdn.net/stella_stella123/article/details/139316396