vue3树形结构如何实现右击弹框显示

如图所示效果

一、 树结构

首先我们需要借助NaiveUI组件库中的 【 n-tree】 组件来实现属性结构的渲染

示例代码如下:

html 复制代码
<n-tree
    :show-irrelevant-nodes="false"  // 是否在搜索状态显示和搜索无关的节点
    :pattern="pattern"   //  默认搜索的内容
    :data="data"   // 树的节点数据
    block-line     //  节点整行撑开
    draggable        //  是否可拖拽
    key-field="lid"    // 替代 TreeOption 中的 key 字段名
    label-field="name"   // 替代 TreeOption 中的 label 字段名
    :selectable="false"   //  节点是否可以被选中
    @dragend="treeDrag"    //  不是最后一个子节点不能拖拽
    :node-props="treeProps"    //  节点的 HTML 属性,这里就是绑定的右击的数据
    :default-expanded-keys="treeDefaultExpanded"  // 树结构的绑定
/>

二、下拉菜单

html 复制代码
 <n-dropdown
    placement="bottom-start"  // 设置下拉菜单出现的位置,这里是底部开始
    trigger="manual"  // 设置触发下拉菜单的方式,这里是手动触发。
    :x="x"            //  用来设置下拉菜单出现的具体位置的坐标
    :y="y"            //  用来设置下拉菜单出现的具体位置的坐标
    :show="showDropdown"          // 控制下拉菜单显示隐藏
    :options="dropdownOptions"    // 定义了下拉菜单中的选项
    :on-clickoutside="onClickoutside"  //  定义了当用户点击下拉菜单外部时的处理函数
    @select="handleSelect"  //  事件监听器,当用户从下拉菜单中选择一个选项时,会触发该函数
/>

三、涉及到的事件

1)初始化

javascript 复制代码
type TableTreeItem = {
  prefix: string | (() => VNode);
  suffix: string | (() => VNode);
} & APIModelExploreOpenModel.OpenModelDataTreeItem;


const x = ref(0);


const y = ref(0);


const showDropdown = ref(false);


const dropdownOptions = shallowRef<DropdownOption[]>([
  {
    key: 'addNewData',
    label: '这里是右击下拉框的名字',
  },
  {
    key: 'addNewData1',
    label: '可以写多个',
  },
  {
    key: 'addNewData2',
    label: '写几个就展示几个框',
  },
]);

2)自定义事件【树结构中的事件,可以获取定位】

javascript 复制代码
const treeProps = ({ option }: { option: TreeOption }) => {
  return {
        onContextmenu(e: MouseEvent) {
          dropdownOptions.value.forEach((it) => {
            it.tabId = option.llaytabid;
          });
          showDropdown.value = true;
          x.value = e.clientX;
          y.value = e.clientY;
          e.preventDefault();
        },
      }
};

3)用户点击下拉菜单时的事件

javascript 复制代码
const onClickoutside = () => {
  showDropdown.value = false;
};

4)传参给子组件时的事件

javascript 复制代码
const checkTableAddNewDataInst = ref<InstanceType<typeof CheckTableAddNewData>>();

const handleSelect = (key: string, option: DropdownOption) => {
  showDropdown.value = false;
  switch (key) {
    case 'addNewData':
      checkTableAddNewDataInst.value!.show(option.tabId as number);
      break;
  }
};

5)子组件在父组件的位置,且通过ref进行传参

html 复制代码
<demo ref="checkTableAddNewDataInst" />

以上步骤就可实现右击出现下拉框时间啦~~~

撒花✿✿ヽ(°▽°)ノ✿

相关推荐
GISer_Jing2 分钟前
React底层架构深度解析:从虚拟DOM到Fiber的演进之路
前端·react.js·架构
斯密码赛我是美女9 分钟前
ssti刷刷刷
java·服务器·前端
Mryan200521 分钟前
Angular | 利用 `ChangeDetectorRef` 解决 Angular 动态显示输入框的聚焦问题
前端·javascript·angular.js
郭尘帅66623 分钟前
Vue3中实现轮播图
开发语言·前端·javascript
众乐乐_20081 小时前
Java 后端给前端传Long值,精度丢失的问题与解决
java·前端·状态模式
一叶茶1 小时前
VsCode和AI的前端使用体验:分别使用了Copilot、通义灵码、iflyCode和Trae
前端·vscode·gpt·ai·chatgpt·copilot·deepseek
熊猫钓鱼>_>1 小时前
基于MCP的桥梁设计规范智能解析与校审系统构建实践
前端·easyui·设计规范
qq_346295271 小时前
require/exports 或 import/export的联系和区别,各自的使用场景
javascript
flying robot1 小时前
小结:JavaScript 模块化工具链
javascript