css阻止点击事件(disabled样式与逻辑统一)

需求场景

我有一个列表需要渲染,并且提供列表项的移动操作,如下:

对于第一项与最后一项,既要上移下移的icon样式置灰,还要在点击事件中忽略对他们的操作(计算css样式,同时js逻辑也需要特殊处理就非常难受)

最终解决

<i @click="xxx">元素添加样式:pointer-events: none;这样就阻止了其点击事件,所以我们只需要计算i标签的样式何时需要添加pointer-events: none;,而js逻辑中只需要负责单纯的上移或者下移的数组操作

示例代码

html:

html 复制代码
<xxx组件库-table-column label="操作">
  <template #default="{ row: option, $index: index }">
    <xxx组件库-button
      size="small"
      type="text-primary"
      @click="onDeleteOptionClick(option)"
      >删除</xxx组件库-button
    >
​
    <i
      class="xxx组件库icon xxx组件库icon-arrow-up"
      :class="getOrderIconClass(EOrderChangeType.UP, index)"
      @click="onOrderChangeClick(EOrderChangeType.UP, index)"
    />
    <i
      class="xxx组件库icon xxx组件库icon-arrow-down"
      :class="getOrderIconClass(EOrderChangeType.DOWN, index)"
      @click="onOrderChangeClick(EOrderChangeType.DOWN, index)"
    />
  </template>
</xxx组件库-table-column>

ts:

ts 复制代码
// 删除回调
const onDeleteOptionClick = (clickOption: IOptionItem) => {
  interactionConfig.options = interactionConfig.options.filter(
    (option) => option !== clickOption
  );
};
​
// 移动类型枚举(上移/下移)
const enum EOrderChangeType {
  UP = 'up',
  DOWN = 'down',
}
​
// 移动回调(数组项位置交换)
const onOrderChangeClick = (type: EOrderChangeType, index: number) => {
  const temp = interactionConfig.options[index];
  if (type === EOrderChangeType.UP) {
    interactionConfig.options[index] = interactionConfig.options[index - 1];
    interactionConfig.options[index - 1] = temp;
  } else if (type === EOrderChangeType.DOWN) {
    interactionConfig.options[index] = interactionConfig.options[index + 1];
    interactionConfig.options[index + 1] = temp;
  }
};
​
// disable样式计算函数(第一项不能上移/最后一项不能下移)
const getOrderIconClass = (type: EOrderChangeType, index: number) => {
  if (
    (index === 0 && type === EOrderChangeType.UP) ||
    (index === interactionConfig.options.length - 1 &&
      type === EOrderChangeType.DOWN)
  )
    return 'xxx组件库icon-disabled';
  return '';
};

scss:

scss 复制代码
:deep(.mtdicon) {
  color: green;
  &.mtdicon-disabled {
    pointer-events: none;
    &::before {
      color: gray;
    }
  }
}

plus

关于pointer-events: none;的能力可能更加强大以及复杂,这里针对i标签(一个最小dom单元)正好满足需求,如果是一些嵌套元素的点击事件,还需要再斟酌这个样式的细节。

相关推荐
青青家的小灰灰7 分钟前
深入理解 JavaScript 箭头函数:从语法糖到核心机制
前端·javascript·面试
cxxcode10 分钟前
Web Vitals 数据采集机制分析
前端
sniper13 分钟前
AI+Shopify 前端开发:实战一年后,聊聊 AI Agent 和前端的生死局
前端
南囝coding14 分钟前
OpenClaw 到底能干什么?可以看看这 60 个真实用例
前端·后端
重庆穿山甲18 分钟前
Java开发者的大模型入门:AgentScope Java组件全攻略(二)
前端·后端
我爱吃土豆111923 分钟前
从零到上架:Chrome 新标签页生产力扩展 FocusTab
前端·产品
敲代码的约德尔人24 分钟前
我在 3 个项目中踩坑后,才真正理解了 JavaScript 设计模式
前端·javascript
子淼81225 分钟前
Kali Linux 入门指南:基础操作与常用指令解析
前端
Highcharts.js25 分钟前
Highcharts时间线图(Timeline Chart)完全指南:事件序列的可视化叙事图表
javascript·信息可视化·数据分析·highcharts·图表开发·时间线图表
QYR市场调研33 分钟前
低密度聚乙烯市场竞争格局变化趋势
前端