美文网首页
Vue中component组件的使用

Vue中component组件的使用

作者: Roct | 来源:发表于2024-03-13 16:56 被阅读0次

    在业务开发中经常遇到功能类似但是UI不一致的组件,如果使用多个v-if的话页面会变的及其啰嗦,所以可以使用component组件来统一渲染。

    1. 创建commonComponents
    <template>
      <div>
        <colArrow
          v-if="getComponent && useCol"
          class="lc-ml-8"
          @toToggleComponent="toToggleComponent"
        />
        <component
          :is="getComponent"
          :active="active"
          :nodeName="nodeName"
          @update:node-name="updateNodeNameByNodeId"
          @openSetting="openSettingPanel"
          @delete="deleteComponent"
        />
      </div>
    </template>
    <script setup lang="ts">
    import ColArrow from '@/views/lowCodeDetail/arrowComponents/colArrow.vue'
    import { computed } from 'vue'
    import { COMPONENTTYPE } from '@/views/lowCodeDetail/hooks/componentType'
    
    const props = defineProps({
      // 是否使用内部的线;即colArrow组件
      useCol: {
        type: Boolean,
        default: true
      },
      // 是否处于活跃状态
      active: Boolean,
      // node的名字
      nodeName: String,
      // node的类型
      nodeType: String
    })
    const emit = defineEmits([
      'toToggleComponent',
      'updateNodeNameByNodeId',
      'openSettingPanel',
      'deleteComponent',
      'update:node-name'
    ])
    
    const getComponent = computed(() => {
      switch (props.nodeType) {
        case COMPONENTTYPE.API:
          return 'ApiComponents'
    
        case COMPONENTTYPE.NOTICE:
          return 'NoticeComponents'
    
        case COMPONENTTYPE.SCRIPT:
          return 'ScriptComponents'
    
        case COMPONENTTYPE.JSON:
          return 'JsonComponents'
    
        default:
          return null
      }
    })
    
    const toToggleComponent = () => {
      emit('toToggleComponent')
    }
    
    const updateNodeNameByNodeId = (val: string) => {
      emit('update:node-name', val)
      emit('updateNodeNameByNodeId', val)
    }
    
    const openSettingPanel = () => {
      emit('openSettingPanel')
    }
    
    const deleteComponent = () => {
      emit('deleteComponent')
    }
    </script>
    <style scoped lang="scss"></style>
    
    
    1. 创建注册文件register.ts文件
    import { App } from 'vue'
    import lodash from 'lodash'
    import ApiComponents from '../components/apiComponents.vue'
    import JsonComponents from '../components/jsonComponents.vue'
    import NoticeComponents from '../components/noticeComponents.vue'
    import ScriptComponents from '../components/scriptComponents.vue'
    
    // 画布通用组件, 即内部不能添加子组件的组件
    const components = [
      ApiComponents,
      JsonComponents,
      NoticeComponents,
      ScriptComponents
    ]
    
    const commonComponents = (app: App): void => {
      components.forEach((component) => {
        app.component(lodash.upperFirst(component.__name), component)
      })
    }
    
    export default commonComponents
    
    
    1. 在main.ts中注册
    const app = createApp()
    commonComponents(app)
    
    1. 在业务文件中使用
    <common-component
      :active="item.active"
      v-model:node-name="item.nodeName"
      :node-type="item.nodeType"
      @toToggleComponent="toToggleComponent(item.nodeId)"
      @update:node-name="
        (val) => updateNodeNameByNodeId(item.nodeId, val)
      "
      @openSetting="openSettingPanel(item)"
      @delete="deleteComponent(item)"
    />
    

    相关文章

      网友评论

          本文标题:Vue中component组件的使用

          本文链接:https://www.haomeiwen.com/subject/rqkizdtx.html