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

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

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

相关推荐
漂流瓶jz3 分钟前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
这是个栗子6 分钟前
【问题解决】用pnpm创建的 Vue3项目找不到 .eslintrc.js文件 及 后续的eslint配置的解决办法
javascript·vue.js·pnpm·eslint
前端架构师-老李14 分钟前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心43 分钟前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武1 小时前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
花姐夫Jun1 小时前
基于Vue+Python+Orange Pi Zero3的完整视频监控方案
vue.js·python·音视频
牧马少女1 小时前
css 画一个圆角渐变色边框
前端·css
zy happy1 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年2 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
Nan_Shu_6142 小时前
学习:JavaScript(5)
开发语言·javascript·学习