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

为了实现“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日

相关文章

  • JS实现普通轮播图特效

    JS实现普通轮播图特效主要包含以下步骤: 利用CSS实现轮播图的基本布局,例如轮播图容器和图片容器的样式设置等。需要注意的是,轮播图容器一般为固定宽度,图片容器需要设置为横向排列并且宽度为轮播图容器的n倍(其中n为图片数量)。 .carousel { width: 600px; /* 容器宽度为600像素 */ overflow: hidden; /* 超出…

    css 2023年6月10日
    00
  • 分享12个Webpack中常用的Loader(小结)

    请允许我逐步讲解“分享12个Webpack中常用的Loader(小结)”的完整攻略。 标题 本文的标题是“分享12个Webpack中常用的Loader(小结)”, 介绍 在Web开发中,Webpack已成为一个重要的构建工具。Webpack的Loader是Webpack功能的重要组成部分之一,它可以在打包构建过程中实现各类文件的转换、处理和优化。在本文中,我…

    css 2023年6月10日
    00
  • 网页添加CSS样式表的四种方法

    当我们建立一个网站时,我们需要对页面的样式进行设计和美化,以提高用户对网站的感知度和用户体验。在这个过程中,我们可以通过添加CSS样式表对网站进行样式的统一设置与优化。 网页添加CSS样式表的四种方法: 1.内联式方式 在HTML标签中通过style属性来设置CSS样式,此方式直接作用于当前标签,使用简单,但会导致HTML代码冗长,且样式难以维护。 示例代码…

    css 2023年6月10日
    00
  • 使用CSS的clip-path属性实现不规则图形的显示

    使用CSS的clip-path属性可以实现不规则图形的显示。它能够将元素裁剪成各种形状,让你可以创造出独特的图形效果。下面是具体的攻略: 1. 了解clip-path属性 clip-path属性是用来设置元素裁剪路径的。它可以取值为none、url()、inset()、circle()、ellipse()、polygon()等,其中最常用的是polygon(…

    css 2023年6月10日
    00
  • 简单的二级菜单导航实现css代码

    我来为你详细讲解如何实现简单的二级菜单导航的 CSS 代码。 一、HTML 结构 首先要确定好导航的 HTML 结构。在本次攻略中,我们将使用一个无序列表 <ul> 来构建导航栏。每个一级菜单都是一个 <li> 元素,并包含一个链接,同时如果有子菜单,则需要在该 <li> 元素中嵌套一个新的 <ul> 列表用于…

    css 2023年6月10日
    00
  • CSS的pointer-events属性详细介绍(作用和注意事项)

    当我们使用 CSS 编写网页时,我们经常需要处理各种与用户操作相关的事件,例如点击、滚动、鼠标悬停等等。而在处理这些事件时,可能需要使用一些 CSS 属性来帮助我们完成这些任务,其中 pointer-events 就是其中之一。 什么是 pointer-events 属性? pointer-events 属性是一个 CSS 属性,用于设置元素是否可以被用户操…

    css 2023年6月10日
    00
  • CSS3 3D制作实战案例分析

    下面是“CSS3 3D制作实战案例分析”的完整攻略。 CSS3 3D基础 在进行3D制作前,需要了解CSS3 3D基础。CSS3 3D中主要的属性有transform-style、perspective、transform,其中: transform-style用于定义子元素是位于3D空间还是平面空间中,默认值为flat,表示位于平面空间中。 perspec…

    css 2023年6月10日
    00
  • jquery mobile移动端幻灯片滑动切换效果

    题目:jquery mobile移动端幻灯片滑动切换效果完整攻略 1.需求分析 我要在我的网站上添加移动端幻灯片滑动切换效果。该效果具有以下特点: 以响应式布局方式实现,适应不同屏幕分辨率 支持手势滑动和点击切换两种方式 支持自动播放和手动控制两种模式 支持多种切换效果,如fade、slide、turn等 兼容性良好,支持主流移动设备和浏览器 2.方案设计 …

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