vue3 组件自己引用自己 递归组件 组件命名

本人前端开发一枚,以前一直用vue2.0,为了更新自己掌握的技术学习如何使用vue3.0。

在vue3.0项目中想要实现菜单组件,要使用到递归组件的方法,发现不知道怎么给组件重命名!!

在vue2.0中想要实现递归组件方式很简单,只要给组件命名,然后自己调用即可:

<template>
    <div>
        <menu-item :menuList="menuList"></menu-item> //调用自己
    </div>
</template>

<script>
export default {
  name: 'menuItem', //给组件命名
  props: {
    menuList: {
        type: Array,
        default: () => []
    }
  },
  data () {
    return {
      
    }
  }
}
</script>

<style scoped lang='less'>

</style>

然而在vue3.0中由于采用了script setup 语法糖,这种命名方式就不可行了,原因是它会自动以文件名为主,不需要再写name属性:

<script setup>
</script>

后来发现直接在script setup同级中再添加一个script即可:

<template>
    <div>
        <menu-item :menuList="menuList"></menu-item> //调用自己
    </div>
</template>

<script>
    export default {
        name: 'menuItem' //给组件命名
    }
</script>

<script setup>
    const props = defineProps({
        menuList: {
            type: Array,
            default: () => []
        }
    })
</script>


<style scoped lang='less'>

</style>

使用插件:unplugin-vue-define-options 给组件定义别名

1.安装插件

npm install unplugin-vue-define-options -D

2.在vite.config.js文件中配置

import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'
import DefineOptions from 'unplugin-vue-define-options/vite'
 
export default defineConfig({
  plugins: [vue(), DefineOptions()],
});

3.配置完成,在组件中使用:

<template>
    <div>
        <menu-item :menuList="menuList"></menu-item> //调用自己
    </div>
</template>

<script setup>
    defineOptions({
        name: 'menuItem' //给组件命名
    });
    const props = defineProps({
        menuList: {
            type: Array,
            default: () => []
        }
    })
</script>


<style scoped lang='less'>

</style>

使用了typescript的,可以配合插件直接在script标签中设置name,具体方式如下:

1.安装插件:

npm install vite-plugin-vue-setup-extend

2.在script 标签中直接设置name即可:

<script lang="ts" setup name="menuItem">

</script>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用vue3和ts语法封装一个树形组件: 1. 创建一个Vue组件命名为Tree,该组件将接受以下属性: ```ts interface TreeNode { id: string; name: string; children?: TreeNode[]; } interface TreeProps { treeData: TreeNode[]; collapsable?: boolean; showCheckbox?: boolean; disabledCheckboxIds?: string[]; defaultCheckedIds?: string[]; onChecked?: (checkedIds: string[]) => void; } ``` 其中,treeData是树结构的数据,collapsable表示节点是否可折叠,showCheckbox表示是否显示复选框,disabledCheckboxIds表示禁用某些节点的复选框,defaultCheckedIds表示默认选中的节点,onChecked表示选中节点时的回调函数。 2. 在组件的setup函数中,先声明一些响应式数据: ```ts import { ref, reactive } from 'vue'; interface CheckboxState { [id: string]: boolean; } export default { props: { //... }, setup(props: TreeProps) { const treeData = ref(props.treeData); const checkboxState = reactive<CheckboxState>({}); const checkedIds = computed(() => { return Object.keys(checkboxState).filter(id => checkboxState[id]); }); } } ``` 这里用ref存储treeData数据,并用reactive将checkboxState声明为响应式对象,用computed计算出选中的节点列表。 3. 定义一些内部方法,用于处理树结构的展开、折叠、选中、取消选中等操作: ```ts export default { //... setup(props: TreeProps) { //... const expandCollapse = (id: string) => { // 处理展开折叠操作 }; const checkUncheck = (id: string) => { // 处理选中取消选中操作 }; const isIndeterminate = (id: string) => { // 判断某个节点是否处于部分选中状态 }; const getCheckedStatus = (id: string) => { // 获取某个节点的选中状态 }; } } ``` 4. 最后,编写模板中的代码,用递归方式展示树形结构,根据props的属性动态显示折叠、复选框等。 ```html <template> <div class="tree"> <ul> <li v-for="node in treeData" :key="node.id"> <div class="tree-node"> <span v-if="collapsable" @click="expandCollapse(node.id)"> {{ node.children ? (collapsedNodes.includes(node.id) ? '▶' : '▼') : '' }} </span> <input v-if="showCheckbox && !disabledCheckboxIds.includes(node.id)" type="checkbox" :indeterminate="isIndeterminate(node.id)" :checked="getCheckedStatus(node.id)" @change="checkUncheck(node.id)"> <span>{{ node.name }}</span> </div> <tree v-if="node.children && (!collapsable || !collapsedNodes.includes(node.id))" :treeData="node.children" :collapsable="collapsable" :showCheckbox="showCheckbox" :disabledCheckboxIds="disabledCheckboxIds" :defaultCheckedIds="defaultCheckedIds" :onChecked="onChecked" :key="node.id" /> </li> </ul> </div> </template> ``` 以上就是使用vue3和ts语法封装一个树形组件的步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值