首页 > 其他分享 >vue简单实现一个table组件

vue简单实现一个table组件

时间:2022-08-15 23:55:53浏览次数:41  
标签:vue false name tr 组件 table copySelectItems border id

看到elementUI封装的el-table组件觉得很有意思,就自己简单实现了自己的一个table组件,具体功能有

 columns:表头  data:数据  border:是否有边框  zebra:是否有斑马纹  hover:悬浮效果 change:change事件 具体样式自己修改,只实现功能  

使用

 <MyTable
      :columns="columns"
      :data="data"
      border
      zebra
      hover
      :selectItems.sync="selectItems"
      @change="itemsChange"
    ></MyTable>

数据

columns: [
        {
          title: "Name",
          key: "name",
        },
        {
          title: "Age",
          key: "age",
        },
        {
          title: "Gender",
          key: "gender",
        },
        {
          title: "Address",
          key: "address",
        },
      ],
      data: [
        {
          id: 0,
          name: "lisi",
          age: 19,
          gender: "男",
          address: "江西南昌",
          date: "2022/08/15",
        },
        {
          id: 1,
          name: "wangwu",
          age: 17,
          gender: "男",
          address: "江西丰城",
          date: "2022/08/15",
        },
        {
          id: 2,
          name: "liliu",
          age: 19,
          gender: "女",
          address: "江西吉安",
          date: "2022/08/15",
        },
        {
          id: 3,
          name: "liuqi",
          age: 16,
          gender: "男",
          address: "江西上饶",
          date: "2022/08/15",
        },
        {
          id: 4,
          name: "xiaoming",
          age: 16,
          gender: "男",
          address: "江西新余",
          date: "2022/08/15",
        },
        {
          id: 5,
          name: "xiaohong",
          age: 16,
          gender: "女",
          address: "江西景德镇",
          date: "2022/08/15",
        },
      ],

组件定义

<template>
  <div class='content'>
    <div>
      <table ref="table" :class="['wapperTable',border?'border':'noboder',{zebra},{hover}]">
        <tr>
          <th style="width:30px;text-align: center;"><input type="checkbox" :checked="isChecked" ref="ischecked" @change="selectAll($event)"></th>
          <th v-for="column in columns" :key="column.key">{{column.title}}</th>
        </tr>
        <tr v-for="row in data" :key="row.id">
          <td style="width:30px;text-align: center;"><input type="checkbox" @change="selectItemsChange(row,$event)" :checked='ischecked2' /></td>
          <td v-for="col in columns" :key="col.key">
            {{row[col.key]}}
          </td>
        </tr>
      </table>
    </div>
  </div>
</template>

<script>
export default {
  name: 'MyTable',
  props: {
    selectItems: {
      type: Array,
      default: () => []
    },
    columns: {
      type: Array,
      default: () => []
    },
    data: {
      type: Array,
      default: () => []
    },
    border: {
      type: Boolean,
      default: false
    },
    zebra: {
      type: Boolean,
      default: false
    },
    hover: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      isChecked: false,
      ischecked2: false,
      copySelectItems: []
    }
  },
  methods: {
    selectItemsChange(row, e) {
      //深拷贝
      this.copySelectItems = JSON.parse(JSON.stringify(this.selectItems))
      if (e.target.checked) {
        //选中,添加
        this.copySelectItems.push(row)
      } else {
        //删除
        const index = this.copySelectItems.findIndex(
          (item) => item.id === row.id
        )
        this.copySelectItems.splice(index, 1)
      }
      //判断全选按钮
      if (this.data.length === this.copySelectItems.length) {
        this.$refs.ischecked.indeterminate = false
        this.isChecked = true
      } else if (
        this.data.length !== this.copySelectItems.length &&
        this.copySelectItems.length > 0
      ) {
        //设置半选状态
        this.$refs.ischecked.indeterminate = true
      } else {
        this.$refs.ischecked.indeterminate = false
        this.isChecked = false
      }
      //将拷贝数组传给update
      this.$emit('update:selectItems', this.copySelectItems)
    },
    selectAll(e) {
      if (e.target.checked) {
        //全选
        this.ischecked2 = true
        //将数组全部放入
        this.copySelectItems = []
        this.copySelectItems = this.data
      } else {
        this.ischecked2 = false
        this.copySelectItems = []
      }
      //将拷贝数组传给update
      this.$emit('update:selectItems', this.copySelectItems)
    },
    scrollEvent(tr) {
      tr.classList.add('absolution')
    }
  }
}
</script>

<style scoped lang="less">
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}
.content {
  width: 80%;
  margin: 0 auto;
  padding: 30px;
}
.wapperTable {
  text-align: left;
}
//有边框
.border {
  border-collapse: collapse;
  tr td {
    border: 1px solid #ddd;
  }
  tr th {
    border: 1px solid #ddd;
  }
}
//无边框
.noboder {
  tr td {
    border-bottom: 1px solid #ddd;
  }
  tr th {
    border-bottom: 1px solid #ddd;
  }
}
//斑马条纹
.zebra {
  tr:nth-child(even) {
    background: #ddd;
    opacity: 0.9;
  }
}
// 悬浮
.hover {
  tr:hover {
    cursor: pointer;
    background-color: #ddd;
  }
}
</style>

效果图

 

 

 点击的change事件都能被触发,并将选择的数据正确传输。

 

标签:vue,false,name,tr,组件,table,copySelectItems,border,id
From: https://www.cnblogs.com/lijun12138/p/16590136.html

相关文章

  • VUE+Django前后端分离-第三部分【前后端数据传递】
    一、前端代码首先:前端中任何变量都要被定义,具体如下:   <template><div><h3>推置引擎测试界面</h3><el-form:inline="true":model="for......
  • Vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
    场景Vue+Leaflet实现加载OSM显示地图:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上,使用Leaflet.pm插件实现在页面上......
  • Vue面试题-组件间通信方式
    父子组件:props(父传子)$emit/$on(子传父) $on已被Vue3废弃$parent/$children$children已被Vue3废弃ref隔代组件:透传:$attrs/$listeners$listners已被Vue3废......
  • 解决Vue报错Uncaught (in promise) NavigationDuplicated: Avoided redundant navigat
         有效的解决方法如下:(亲测有效)方法一:在router文件夹下,添加如下代码:Vue.use(Router)constrouter=newRouter({routes})constVueRouterPush......
  • 14 Django_forms组件之ChoiceField类型
    如果想要灵活应用ChoiceField,那么请看如下:classTransactionRecord(ActiveBaseModel):"""交易记录"""charge_type_class_mapping={1:"success",......
  • web和vue-cli
    1、什么是WebpackWebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包......
  • Vue 检测数据
    主要逻辑类似:<script>letdata={name:'name',address:'address',};//创建了一个监视对象,监视data属性的变化constobs=ne......
  • 加载远程vue文件 vue3-sfc-loader
    需求项目在写一些需求的时候,现场可能会有些变动,但是不想从新打包,这种情况可以考虑单独不打包的vue文件注意vue2import{loadModule}from'vue3-sfc-loader/dist/vue2......
  • VUE+Django前后端分离-第二部分
    四、前端layout及页面跳转1、在src/components目录下创建HeaderAsideMainHeader.vue:<template><header><div><h1style="margin-to......
  • 通过网页形式创建vue
      命令:npmui  在终端输入vueui进入网页    即可进行创建......