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单元)正好满足需求,如果是一些嵌套元素的点击事件,还需要再斟酌这个样式的细节。

相关推荐
极速蜗牛20 分钟前
告别部署焦虑!PinMe:前端开发者的极简部署神器
前端·javascript
uhakadotcom1 小时前
Python Protobuf 全面教程:常用 API 串联与实战指南
前端·面试·github
by__csdn1 小时前
微前端架构:从理论到实践的全面解析
前端·javascript·vue.js·架构·typescript·vue·ecmascript
漫长的~以后1 小时前
Edge TPU LiteRT V2拆解:1GB内存设备也能流畅跑AI的底层逻辑
前端·人工智能·edge
小福气_1 小时前
自定义组件 vue3+elementPlus
前端·javascript·vue.js
程序员博博1 小时前
这才是vibe coding正确的打开方式 - 手把手教你开发一个MCP服务
javascript·人工智能·后端
piaoroumi1 小时前
UVC调试
linux·运维·前端
前端不太难2 小时前
RN 调试效率低,一点小改动就需要重新构建?解决手册(实战 / 脚本 / Demo)
前端·react native·重构
是谁眉眼2 小时前
vue环境变量
前端·javascript·vue.js
3秒一个大2 小时前
JSX 基本语法与 React 组件化思想
前端·react.js