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" />

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

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

相关推荐
CAD老兵3 分钟前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
JasonYin10 分钟前
AI 定义的 H5移动端 开发规范,直接抄作业!
前端
诗章与猫12 分钟前
Leaflet 渲染 100 万 marker 卡成 PPT?我用 WebGL 重写了渲染器
前端
用户9210802628618 分钟前
在 AI 代码生成项目里接入 Thought:别展示“玄学思维链”,只展示用户真正关心的工具调用
前端
WL_arm35 分钟前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5
艾醒(AiXing-w)37 分钟前
LangChain 1.0 入门(二):LangChain 全模型标准化接入最佳实践(小白参数详解版)
前端·javascript·langchain
计算机魔术师1 小时前
我看了 Hugging Face 的 Daily Papers,发现这件事
前端
yu俞娥宝2 小时前
Codex官网前端可抄吗?技术拆解、风险边界与合规借鉴方案
前端
捧 花2 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
Hilaku2 小时前
一行 CSS 新特性干掉 20 行 JavaScript ?
前端·javascript·程序员