vue 自定义表格

40 篇文章 0 订阅

dom部分  主要用的是Ant Design of Vue - Ant Design Vue (antdv.com)  组件ant

        <table border class="border-table">
            <thead class="bg-color">
              <tr>
                <th v-for="(i,index) in topHead" :key="index">
                  <div class="flex align-cecnter ">
                    <span class="span-x" v-if="i.name=='手机号'||i.name=='Union ID'">*</span>
                    <span class="span-x" v-if="i.name=='操作'"></span>
                    <a-dropdown>
                      <div class=" a-buttond" v-if="i.name=='新增列'">
                        <div class="antion-in">+</div>
                        <span class="span-t"> {{i.name}}</span>
                      </div>
                      <a-menu slot="overlay" v-if="i.name!='新增列'">
                        <!-- 基础 -->
                        <a-sub-menu v-for="(item,indexs) in i.childe" v-if="item.name!='删除'&&item.name!='自定义字段'"
                          :key="indexs" :title="item.name">
                          <a-menu-item>
                            <a-input-search @click.stop="getChange1" v-model="searchValue1" style="width:200px"
                              placeholder="请输入标签名进行搜索" allow-clear @change="getChange1"></a-input-search>
                          </a-menu-item>
                          <Empty v-if="setone4.length === 0" class="Empty" />
                          <a-menu-item @click="handleMenuClick1(index,dex)" v-for="(ins,dex) in setone4" :key="dex">
                            {{ins.name}}
                          </a-menu-item>
                        </a-sub-menu>
                        <!-- 自定义 -->
                        <a-sub-menu v-for="(item,indexs) in i.childe" v-if="item.name!='删除'&& item.name!='基础属性'"
                          :key="indexs" :title="item.name">
                          <a-menu-item>
                            <a-input-search @click.stop="getChange2" v-model="searchValue2" style="width:200px"
                              placeholder="请输入标签名进行搜索" allow-clear @change="getChange2"></a-input-search>
                          </a-menu-item>
                          <Empty v-if="setone3.length === 0" class="Empty" />
                          <a-menu-item v-else @click="handleMenuClick2(index,indexs)" v-for="(iee,indexs) in setone3"
                            :key="indexs"> {{iee.name}}</a-menu-item>
                        </a-sub-menu>
                        <a-menu-item v-for="(item,indexs) in i.childe" v-if="item.name=='删除'" :key="indexs"
                          @click="handleMenuClick3(index)">
                          删除
                        </a-menu-item>
                      </a-menu>
                      <!-- 新增111111111111111111111111 -->
                      <a-menu slot="overlay" v-if="i.name=='新增列'">
                        <a-sub-menu v-for="(item,indexs) in i.childe" v-if="item.name!='删除'&&item.name!='自定义字段'"
                          :key="indexs" :title="item.name">
                          <a-menu-item>
                            <a-input-search @click.stop="getChange1" v-model="searchValue1" style="width:200px"
                              placeholder="请输入标签名进行搜索" allow-clear @change="getChange1"></a-input-search>
                          </a-menu-item>
                          <Empty v-if="setone4.length === 0" class="Empty" />
                          <a-menu-item @click="handleMenuClick4(index,dex)" v-for="(ins,dex) in setone4" :key="dex">
                            {{ins.name}}
                          </a-menu-item>
                        </a-sub-menu>
                        <a-sub-menu v-for="(item,indexs) in i.childe" v-if="item.name!='删除'&& item.name!='基础属性'"
                          :key="indexs" :title="item.name">
                          <a-menu-item>
                            <a-input-search @click.stop="getChange2" v-model="searchValue2" style="width:200px"
                              placeholder="请输入标签名进行搜索" allow-clear @change="getChange2"></a-input-search>
                          </a-menu-item>
                          <Empty v-if="setone3.length === 0" class="Empty" />
                          <a-menu-item v-else @click="handleMenuClick5(index,indexs)" v-for="(iee,indexs) in setone3"
                            :key="indexs"> {{iee.name}}</a-menu-item>
                        </a-sub-menu>
                        <a-menu-item v-for="(item,indexs) in i.childe" v-if="item.name=='删除'" :key="indexs"
                          @click="handleMenuClick3(index)">
                          删除
                        </a-menu-item>
                      </a-menu>
                      <a-button v-show="i.name!='手机号'&&i.name!='新增列'&&i.name!='操作'&&i.name!='Union ID'"
                        class="a-button">
                        {{i.name}}
                        <a-icon type="down" />
                      </a-button>
                    </a-dropdown>
                    <span class="span-in" v-if="i.name=='手机号'||i.name=='Union ID'"> {{i.name}}</span>
                    <span class="span-in" v-if="i.name=='操作'"> {{i.name}}</span>
                  </div>
                </th>
              </tr>
            </thead>
            <tbody class="bg-tbody" v-for=" (i,index) in tbody">
              <tr v-for="(it,ind) in  i.list" :key="ind">
                <td v-for="(im,clause) in  it.row" :key="clause">
                  <div :class=" tbody.length==1?  'delete':'deleteAct'" v-if="im.name=='删除'" @click.stop="ded(index)">
                    {{im.name}}
                  </div>
                  <textarea class="textareae" v-else :maxlength="maxlength" rows="1" v-model="im.name" placeholder="请输入"
                    @input="handleInput($event,clause)"></textarea>
                </td>
              </tr>
            </tbody>
            <tfoot class="bg-tfoot">
              <tr>
                <td colspan="20">
                  <div class="flex align-start" @click.stop="add">
                    <div class="antion-in">+</div>
                    <div class="delete"> 新增行(最多50行)</div>
                  </div>
                </td>
              </tr>
            </tfoot>
          </table>

数据部分 没用的地方我没挑出来

  props: ['tabIndex'],//这个地方是这个页面收到的 1 ,2 判断状态 
    components: {},
    data() {
      return {
        topHead: [{
            name: '操作',
          },
          {
            name: this.tabIndex == 1 ? "手机号" : "Union ID",
          }, {
            name: '来源',
            setpes: 1,
            childe: [{
                name: '基础属性'
              },
              {
                name: '自定义字段'
              },
              {
                name: '删除'
              },
            ]
          }, {
            name: '年龄',
            setpes: 1,
            childe: [{
                name: '基础属性'
              },
              {
                name: '自定义字段'
              },
              {
                name: '删除'
              },
            ]
          }, {
            name: '描述',
            setpes: 1,
            childe: [{
                name: '基础属性'
              },
              {
                name: '自定义字段'
              },
              {
                name: '删除'
              },
            ]
          }, {
            name: '新增列',
            childe: [{
                name: '基础属性'
              },
              {
                name: '自定义字段'
              },
            ]
          },
        ],


        tbody: [{
          list: [{
            row: [{
              name: '删除'
            }, {
              name: ''
            }, {
              name: ''
            }, {
              name: ''
            }, {
              name: ''
            }]
          }]
        }, ],

        close: '已关闭',


        setone1: [{
          name: "aaaaaa",
          setpes: 1
        }, {
          name: "bbbbbb",
          setpes: 1
        }, {
          name: "cccccc",
          setpes: 1
        }],

        setone4: [{
          name: "aaaaaa",
          setpes: 1
        }, {
          name: "bbbbbb",
          setpes: 1
        }, {
          name: "cccccc",
          setpes: 1
        }],

        setone2: [{
          name: "1",
          setpes: 2
        }, {
          name: "2",
          setpes: 2
        }, {
          name: "3",
          setpes: 2
        }],

        setone3: [{
          name: "1",
          setpes: 2
        }, {
          name: "2",
          setpes: 2
        }, {
          name: "3",
          setpes: 2
        }],
        searchValue1: '',
        searchValue2: '',
        listAdd: [{
          row: [{
            name: '删除'
          }, {
            name: ''
          }, {
            name: ''
          }, {
            name: ''
          }, {
            name: ''
          }]
        }],
        loadOver: false,
        maxlength: 64,

js部分没用的地方没调出来

  ded(e) {
        let ta = this
        let resdata = JSON.parse(JSON.stringify(ta.tbody));
        if (resdata.length == 1) {
          return false
        }
        ta.$confirm({
          title: '提示',
          content: '是否要删除此行数据?',
          centered: true,
          okText: '删除',
          cancelText: '取消',
          onOk() {
            ta.tbody.splice(e, 1)
          }
        })

      },
      // 最关键的部分,监听scrollHeight,设置输入框高度
      handleInput(e, clause) {
        // let rea = /^[0-9.]+$/; //数字
        //     if (!rea.test(e.target._value)) {
        //       console.log('budui')
        //       i.list[index].row[1].name = ""
        //       return false;
        //     } else {
              if (this.tabIndex == 1) {
                if (clause == 1) {
                  this.maxlength = 11
                }
              }
   //          }
        e.target.style.height = 'auto'
        e.target.style.height = `${e.target.scrollHeight}px`
      },

      add() {
        let list = []
        if( this.tbody.length<50){
          this.tbody.forEach((i, index) => {
            list = i
          })
          
          if (list.length) {
            this.tbody.push(list)
          } else {
            list = {
              list: this.listAdd
            }
            this.tbody.push(list)
            console.log(this.tbody)
          }
        }
      },
      onChange(checked) {
        console.log(`a-switch to ${checked}`);
        this.close = checked ? '已打开' : '已关闭'
      },
      getChange1(e) {
        console.log(11111111111, this.searchValue1, this.setone1)
        let value = this.searchValue1
        let setone1 = []
        this.setone1.forEach((i) => {
          if (i.name == value) {
            setone1.push({
              name: i.name
            })
          }
        })
        console.log(setone1)
        if (this.searchValue1) {
          this.setone4 = setone1
        } else {
          this.setone4 = this.setone1
        }
      },
      getChange2(e) {
        console.log(11111111111, e)
        let value = this.searchValue2
        let setone2 = []
        this.setone2.forEach((i) => {
          if (i.name == value) {
            setone2.push({
              name: i.name,
            })
          }
        })
        if (this.searchValue2) {
          this.setone3 = setone2
        } else {
          this.setone3 = this.setone2
        }
      },
      handleMenuClick1(inx, e) {
        this.searchValue1 = ''
        let index = inx
        let idex = inx

        let topHeadName = this.topHead[inx].name
        let setone2Name = this.setone1[e].name
        let setpes = this.setone1[e].setpes
        this.searchValue1 = ''
        if (this.topHead[inx].setpes == 1) {
          this.setone1.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
          this.setone4.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
        } else {
          this.setone2.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
          this.setone3.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
        }
        this.setone1.splice(e, 1)
        this.setone4.splice(e, 1)
        this.topHead[inx].name = setone2Name
        this.topHead[inx].setpes = setpes
        console.log('this.topHead[inx].setpes1', this.topHead[inx].setpes)
        this.tbody.forEach((i) => {
          i.list[0].row[idex].name = ""
        })


      },

      handleMenuClick2(inx, e) {
        let index = inx
        let idex = inx
        console.log(2, inx, e, )
        let topHeadName = this.topHead[inx].name
        let setone2Name = this.setone2[e].name
        let setpes = this.setone2[e].setpes
        this.searchValue2 = ''
        if (this.topHead[inx].setpes == 1) {
          this.setone1.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
          this.setone4.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
        } else {
          this.setone2.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
          this.setone3.push({
            name: topHeadName,
            setpes: this.topHead[inx].setpes
          })
        }
        this.setone2.splice(e, 1)
        this.setone3.splice(e, 1)
        this.topHead[inx].name = setone2Name
        this.topHead[inx].setpes = setpes
        console.log('this.topHead[inx].setpes2', this.topHead[inx].setpes)
        this.tbody.forEach((i) => {
          i.list[0].row[idex].name = ""
        })
      },
      handleMenuClick3(inx, e) {
        let index = inx
        let idex = inx
        let topHeadName = this.topHead[inx].name
        console.log('inx', inx, this.topHead[inx].setpes)
        let setpes = this.topHead[inx].setpes
        if (this.topHead[inx].setpes == 1) {
          this.setone1.push({
            name: topHeadName,
            setpes: setpes
          })
          this.setone4.push({
            name: topHeadName,
            setpes: setpes
          })
        } else {
          this.setone2.push({
            name: topHeadName,
            setpes: setpes
          })
          this.setone3.push({
            name: topHeadName,
            setpes: setpes
          })
        }

        this.topHead.splice(inx, 1)
        this.tbody.forEach((i) => {
          i.list[0].row.splice(idex, 1)
        })
      },

      handleMenuClick4(inx, e) {
        let index = inx
        let idex = inx
        let setone2Name = this.setone1[e].name
        let setpes = this.setone1[e].setpes
        this.topHead.splice(idex, 0, {
          name: setone2Name,
          setpes: setpes,
          childe: [{
              name: '基础属性'
            },
            {
              name: '自定义字段'
            },
            {
              name: '删除'
            },
          ]
        })
        this.searchValue1 = ''
        this.setone1.splice(e, 1)
        this.setone4.splice(e, 1)
        this.listAdd[0].row.push({
          name: ""
        })
        this.tbody[0].list[0].row.splice(inx, 0, {
          name: ""
        })

      },

      handleMenuClick5(inx, e) {
        let index = inx
        let idex = inx
        let setone2Name = this.setone2[e].name
        let setpes = this.setone2[e].setpes
        this.topHead.splice(idex, 0, {
          name: setone2Name,
          setpes: setpes,
          childe: [{
              name: '基础属性'
            },
            {
              name: '自定义字段'
            },
            {
              name: '删除'
            },
          ]
        })
        this.searchValue2 = ''
        this.setone2.splice(e, 1)
        this.setone3.splice(e, 1)
        this.listAdd[0].row.push({
          name: ""
        })
        this.tbody[0].list[0].row.splice(inx, 0, {
          name: ""
        })
      },
      navTab() {

      },
      aButton() {
        this.tbody.forEach((i, index) => {
          if (i.list[index].row[1].name == "") {
            this.$message.error(`${this.topHead[1].name}格式不对,请重新输入`);
          }
        })
      }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱嗨喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值