el-table点击某一行高亮并显示小圆点的实现代码

yizhihongxing

为了实现“el-table点击某一行高亮并显示小圆点”的效果,我们可以使用Vue的指令和事件等相关机制来实现:

1. 安装element-ui

在开始之前,我们需要先安装并引入element-ui库,可以通过npm或者yarn来进行安装:

# 使用npm进行安装
npm install element-ui --save

# 使用yarn进行安装
yarn add element-ui

接着,在项目入口处(一般是main.js文件)引入element-ui的CSS和JS:

// main.js

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

安装并引入成功后,我们就可以开始实现“el-table点击某一行高亮并显示小圆点”的效果:

2. 编写模板代码

首先,我们需要创建一个表格组件,并在数据列表tableData中添加一列isActive,该列用于标记该行当前是否处于激活状态。

<template>
  <el-table :data="tableData" highlight-row>
    <el-table-column label="日期" prop="date"></el-table-column>
    <el-table-column label="姓名" prop="name"></el-table-column>
    <el-table-column label="地址" prop="address"></el-table-column>
    <el-table-column label="操作">
      <template slot-scope="scope">
        <el-button @click.prevent.stop="handleClick(scope.$index, scope.row.isActive)">点击</el-button>
        <el-tooltip :open-delay="800" content="i am tooltip" placement="top">
          <i :class="{'el-icon-circle-check': scope.row.isActive}"></i>
        </el-tooltip>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { date: '2021-01-01', name: '张三', address: '北京市', isActive: false },
        { date: '2021-01-02', name: '李四', address: '上海市', isActive: false },
        { date: '2021-01-03', name: '王五', address: '广州市', isActive: false },
        { date: '2021-01-04', name: '赵六', address: '深圳市', isActive: false },
      ],
      activeIndex: null,
    };
  },
  methods: {
    handleClick(index, isActive) {
      // 如果该行已被激活,则取消激活状态;否则激活该行。
      this.tableData[index].isActive = !isActive;
      this.activeIndex = isActive ? null : index;
    },
  },
};
</script>

在上述代码中,我们使用了highlight-row指令来实现点击行高亮的效果;每一行都会渲染一个el-button组件和一个el-tooltip组件,用于触发handleClick方法并显示小圆点。

handleClick方法用于处理行的激活状态,每次点击时都会切换该行的激活状态,并记录激活行的索引值activeIndex

接下来,我们需要为激活的行添加样式,以便实现高亮的效果:

.table-highlight .el-table__body > tbody > tr.active-row td {
  background-color: #f5f7fa;
}

最后,在表格的根元素上添加.table-highlight类名,并给每一行绑定一个active-row样式类,我们就可以实现“el-table点击某一行高亮并显示小圆点”的效果了:

<template>
  <div class="table-highlight">
    <el-table :data="tableData" highlight-row>
      <el-table-column label="日期" prop="date"></el-table-column>
      <el-table-column label="姓名" prop="name"></el-table-column>
      <el-table-column label="地址" prop="address"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button @click.prevent.stop="handleClick(scope.$index, scope.row.isActive)">点击</el-button>
          <el-tooltip :open-delay="800" content="i am tooltip" placement="top">
            <i :class="{'el-icon-circle-check': scope.row.isActive}"></i>
          </el-tooltip>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { date: '2021-01-01', name: '张三', address: '北京市', isActive: false },
        { date: '2021-01-02', name: '李四', address: '上海市', isActive: false },
        { date: '2021-01-03', name: '王五', address: '广州市', isActive: false },
        { date: '2021-01-04', name: '赵六', address: '深圳市', isActive: false },
      ],
      activeIndex: null,
    };
  },
  methods: {
    handleClick(index, isActive) {
      // 如果该行已被激活,则取消激活状态;否则激活该行。
      this.tableData[index].isActive = !isActive;
      this.activeIndex = isActive ? null : index;
    },
  },
};
</script>

<style scoped>
.table-highlight .el-table__body > tbody > tr.active-row td {
  background-color: #f5f7fa;
}
.active-row {
  cursor: pointer;
}
</style>

下面是另一个示例,使用vue.js+element-ui+vue-router4.x开发一个有主从数据关系的菜单管理系统:

<template>
  <div class="menu-manage" :style="{ width: $device.isDesktop ? 'calc(100% - 200px)' : '100%' }">
    <!-- 左侧菜单目录 -->
    <el-menu
      :default-active="$router.currentRoute.path"
      @select="$router.push"
      router
      background-color="#fff"
      text-color="#333"
      :collapse="$device.isDesktop ? $route.meta.collapse : false"
      :unique-opened="$device.isDesktop"
      :default-openeds="$route.matched.length > 2 ? ['/' + $route.matched.slice(2).map(item => item.path).join('/')] : []"
      class="menu-manage-left">
      <template v-if="$device.isDesktop">
        <el-menu-item
          v-for="menu in menus"
          :index="menu.path"
          :key="menu.id"
          :class="[menu.children && menu.children.length ? 'menu-manage-left-item-haschild' : '']">
          <i :class="menu.icon"></i>
          <span v-text="menu.name"></span>
        </el-menu-item>
      </template>
      <template v-else>
        <el-cascader-panel v-model="cascaderValue" :options="options"></el-cascader-panel>
      </template>
    </el-menu>
    <!-- 右侧主要内容 -->
    <div class="menu-manage-right">
      <keep-alive>
        <router-view />
      </keep-alive>
    </div>
  </div>
</template>

<script>
import { ElMenu, ElMenuItem, ElSubmenu, ElCascaderPanel } from 'element-plus';
import { getMenuList } from '@/api/user';

export default {
  name: 'MenuManage',
  components: {
    [ElMenu.name]: ElMenu,
    [ElMenuItem.name]: ElMenuItem,
    [ElSubmenu.name]: ElSubmenu,
    [ElCascaderPanel.name]: ElCascaderPanel,
  },
  data() {
    return {
      menus: [],
      cascaderValue: [],
      options: [],
    };
  },
  mounted() {
    this.initMenuList();
  },
  computed: {
    deviceType() {
      return this.$device.type;
    },
  },
  watch: {
    cascaderValue: {
      handler(newVal) {
        const path = newVal.map(item => item.path).join('/');
        this.$router.push(`/${path}`);
      },
      deep: true,
    },
  },
  methods: {
    async initMenuList() {
      try {
        const result = await getMenuList();
        this.menus = this.buildMenuTree(result.data);
        this.buildCascaderOptions(this.menus);
      } catch (error) {
        this.$message.error(error.message || '菜单列表数据获取失败!');
      }
    },
    buildMenuTree(data) {
      // TODO: 将列表数据构造成树形结构
    },
    buildCascaderOptions(data) {
      // TODO: 将树形结构的菜单数据构造成ElCascaderPanel组件的选项数据
    },
  },
};
</script>

<style scoped lang="scss">
.menu-manage {
  height: 100%;

  .menu-manage-left {
    height: 100%;
    overflow-y: auto;

    .menu-manage-left-item-haschild.is-active {
      background-color: #f0f2f5;

      > i,
      > span {
        color: #409eff;
      }
    }
  }

  .menu-manage-right {
    height: calc(100% - 50px);
    padding: 20px;
  }
}
</style>

在上面的示例代码中,我们使用element-uiElMenu组件作为左侧的菜单目录;通过router选项实现路由的跳转,使用@select事件监听菜单项的激活状态并进行路由的跳转;在手机端通过ElCascaderPanel组件来渲染菜单目录,并使用watch监听cascaderValue数组的变化,通过$router.push方法实现路由的跳转。

此外,我们还使用了组件的混入选项$device,根据设备类型动态设置菜单的折叠和开启状态、右侧宽度,并使用keep-alive组件缓存已加载的页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:el-table点击某一行高亮并显示小圆点的实现代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 整理HTML5的一些新特性与Canvas的常用属性

    整理HTML5的一些新特性与Canvas的常用属性 HTML5是Hypertext Markup Language的第五个版本,它引入了许多新特性,使得网页开发变得更加便捷,用户体验也得到了显著的提升。 HTML5的新特性 语义化标签 HTML5 引入了一些新的语义化标签,如: <article>:表示文档、页面、站点或应用程序中的一个独立结构,…

    css 2023年6月9日
    00
  • javascript高仿热血传奇游戏实现代码

    下面是“javascript高仿热血传奇游戏实现代码”的完整攻略。 简介 热血传奇是一个经典的网游,我们可以通过使用 JavaScript 和 HTML5 技术来实现一个类似的网页游戏。在这个游戏中,我们可以实现玩家角色的创建、地图的绘制、怪物的生成和战斗系统等。下面将分几个步骤来实现这个游戏。 步骤 第一步:创建地图和角色 我们可以使用 canvas 元素…

    css 2023年6月10日
    00
  • 网页设计中的 serif 和 sans-serif字体应用

    当我们进行网页设计时,选择字体是一个非常重要的环节。其中,serif 和 sans-serif 是常用的字体分类。下面是在网页设计中如何使用这两种字体的攻略。 什么是 serif 和 sans-serif 字体 serif 和 sans-serif 是字体的一种分类,是由英文字母的末尾是否有小突起决定的。 serif 字体:末尾有小突起的字体,例如常见的 T…

    css 2023年6月10日
    00
  • CSS属性之定位属性(图文详解)

    CSS属性之定位属性(图文详解) CSS定位属性会对元素的显示位置进行控制,包括position、top/bottom和left/right等属性。本文将为大家详细介绍CSS定位属性,以及如何正确应用它们。 position属性 position属性用来指定元素在文档中的定位方式。常用的值有4种: static(默认):元素在文档中遵循正常流程布局,不进行特…

    css 2023年6月9日
    00
  • Illustator制作网页超酷的长阴影效果 两种AI制作方法介绍

    让我详细为您讲解一下 “Illustrator制作网页超酷的长阴影效果 两种AI制作方法介绍”的完整攻略。 1. 简介 长阴影效果是一种流行的网页设计技巧,可以使网页元素在平面感中增加层次感和深度感。本文将介绍两种使用Illustrator 制作长阴影效果的方法。 2. 利用渐变工具制作长阴影效果 实现步骤 打开Illustrator,创建一个新的文档,选择…

    css 2023年6月9日
    00
  • css 解决表格边框不显示的问题

    对于表格边框不显示的问题,我们可以通过 CSS 来解决。以下是一些解决表格边框不显示问题的方式: 1. 设置 border-collapse 属性 当表格的边框不显示时,我们可以在 table 元素中添加 border-collapse: collapse; 属性来解决此问题。例如: table { border-collapse: collapse; } …

    css 2023年6月10日
    00
  • CSS3+Js实现响应式导航条

    下面是详细讲解 CSS3+Js 实现响应式导航条的完整攻略。 什么是响应式导航条? 响应式导航条是指适应不同屏幕尺寸的导航条,可以在不同设备上实现优雅的展示。例如,在宽屏显示器上,导航条可以展示为一排按钮;在移动设备上,为了节省空间,导航条可以通过菜单按钮下拉显示子菜单。 实现响应式导航条的必要条件 使用 HTML 标签搭建导航条的结构。 使用 CSS 样式…

    css 2023年6月10日
    00
  • jQuery写fadeTo示例代码

    当需要在页面上实现元素渐变过渡效果时,可以使用jQuery的fadeTo()方法。下面是完整的攻略: 1. 概览 jQuery中的fadeTo()方法可以让元素在指定时间内渐变到指定的不透明度。该方法可以接受两个参数: duration: 指定过渡动画的时间,单位为毫秒(默认为400ms) opacity: 指定目标不透明度,范围在0到1之间(默认为1) 该…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部