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

相关推荐
释怀不想释怀2 小时前
Ajax,vue生命周期(自动加载页面发出请求)Axios
前端·javascript·ajax
一点晖光2 小时前
ios底部按钮被挡住
前端·ios·微信小程序
VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue智慧医药系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
cz追天之路8 小时前
华为机考--- 字符串最后一个单词的长度
javascript·css·华为·less
Light608 小时前
CSS逻辑革命:原生if()函数如何重塑我们的样式编写思维
前端·css·响应式设计·组件化开发·css if函数·声明式ui·现代css
蜡笔小嘟8 小时前
宝塔安装dify,更新最新版本--代码版
前端·ai编程·dify
Irene19919 小时前
Vue:useSlots 和 useAttrs 深度解析
vue.js·useslots·useattrs
ModyQyW9 小时前
HBuilderX 4.87 无法正常读取 macOS 环境配置的解决方案
前端·uni-app
bitbitDown9 小时前
我的2025年终总结
前端
五颜六色的黑9 小时前
vue3+elementPlus实现循环列表内容超出时展开收起功能
前端·javascript·vue.js