jjzjj

需求:vue+element-ui+sortable.js表格行和列拖拽(宽度自定义)

一起加油 2023-03-28 原文

一、效果图

二、代码实现

注:需要安装依赖  pnpm i sortablejs -S

<template>
  <div style="padding: 15px">
    <h3 style="text-align: left; padding: 10px; background: #ccc">
      vue+element-ui+sortable.js表格行和列拖拽
    </h3>
    <!-- 属性border可实现单元格拖拽获得字段宽度的改变--`@header-dragend`具体参考官网的方法 -->
    <el-table
      ref="dataTable"
      :data="customColumnList"
      class="customer-table"
      border
      row-key="id"
      align="left"
      @select="handleSelectionChange"
    >
      <el-table-column
        type="selection"
        :selectable="checkSelectable"
        align="center"
        width="55"
      ></el-table-column>
      <el-table-column prop="label" label="字段名" width="180">
        <template slot-scope="scope">
          {{ scope.row.label }}
        </template>
      </el-table-column>
      <el-table-column prop="width" label="宽度" width="180">
        <template slot-scope="scope">
          <div class="right-box">
            <p style="padding-right: 5px">宽度</p>
            <el-input
              style="width: 60px"
              size="mini"
              type="text"
              v-model="scope.row.width"
              @keyup.enter.native="this.rowDrop()"
            ></el-input>
            <p style="padding-left: 5px">px</p>
          </div>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

 

<script>
import Sortable from "sortablejs";
export default {
  name: "login",
  data() {
    return {
      customColumnList: [
        {
          id: 1,
          label: "linger1",
          width: "220",
        },
        {
          id: 2,
          label: "linger2",
          resizable: false,
          width: "70",
        },
        {
          id: 3,
          label: "linger3",
          width: "150",
        },
        {
          id: 4,
          label: "linger4",
          width: "120",
          resizable: false,
        },
        {
          id: 5,
          label: "linger5",
          width: "200",
          resizable: false,
        },
      ],
      hasSelectList: [1, 5, 2],
    };
  },
  mounted() {
    this.getTableData();
    this.rowDrop();
  },
  methods: {
    getTableData() {
      // 默认选中
      this.$nextTick(() => {
        this.customColumnList.forEach((row) => {
          if (this.hasSelectList.indexOf(row.id) >= 0) {
            this.$refs.dataTable.toggleRowSelection(row, true);
          }
        });
      });
    },
    // 监听复选框的选择
    handleSelectionChange(section) {
      this.hasSelectList = section.map((item) => item.id);
      const List = this.customColumnList.filter((item) =>
        section.map((items) => items.id).some((_item) => item.id === _item)
      );
      // 排序后的列表
      console.log(List);
      // console.log(this.hasSelectList);
    },
    // 设置失效的行数id=5不可勾选
    checkSelectable(row) {
      if (row.id !== 5) {
        return true
        }
    },
    //行拖拽
    rowDrop() {
      const tbody = document.querySelector(".el-table__body-wrapper tbody");
      const _this = this;
      Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
          const currRow = _this.customColumnList.splice(oldIndex, 1)[0];
          _this.customColumnList.splice(newIndex, 0, currRow);
          console.log(_this.customColumnList);
        },
      });
      console.log(_this.customColumnList);
    },
    //列拖拽
    // columnDrop() {
    //   const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
    //   console.log("wrapperTr:", wrapperTr);
    //   this.sortable = Sortable.create(wrapperTr, {
    //     animation: 180,
    //     delay: 0,
    //     handle: ".move", // 只有带move类名的元素才能拖动,多选框禁止拖动
    //     onEnd: (evt) => {
    //       // 因为手动加了一个多选框, 不在表头循环数组内, 所以这里减1
    //       let oldIndx = evt.oldIndex - 1;
    //       let newIndx = evt.newIndex - 1;
    //       const oldItem = this.dropCol[oldIndx];
    //       // 真正改变列数据--变化列头,就能实现列拖动 列数据按列头索引取值 {{ scope.row[dropCol[index].prop] }}
    //       this.dropCol.splice(oldIndx, 1); // 删除旧一行 删除为1
    //       this.dropCol.splice(newIndx, 0, oldItem); // 插入新一行 插入为0
    //     },
    //   });
    // },
  },
};
</script>

 

<style scoped>
.right-box {
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>
<style>
/* 取消单元格的列的border */
.el-table--border .el-table__cell {
  border: none;
}
.el-table--border,
.el-table--group {
  border: none;
}
/* 去掉表格单元格边框 */
/* 头部边框设置 */
/*  表格最外边框 */
.el-table--border, .el-table--group {
  border: none;
}
.customer-table thead tr th.is-leaf{
  border: 1px solid #EBEEF5;
  border-right: none;
}
.customer-table thead tr th:nth-last-of-type(2){
  border-right: 1px solid #EBEEF5;
}
</style>

 

有关需求:vue+element-ui+sortable.js表格行和列拖拽(宽度自定义)的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  3. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  4. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  5. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  6. ruby-on-rails - Prawn - 表格单元格内的链接 - 2

    我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  9. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  10. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

随机推荐