当前位置:   article > 正文

Vue+elementUI+sortableJS实现父/子组件值传递及el-table表格行拖拽_elementui子组件传值给父组件

elementui子组件传值给父组件

一、效果图如下

二、首先要实现拖拽行,需要安装sortableJs插件,执行命令:npm install sortablejs --save

三、共两个代码文件,一个父组件Parent.vue,一个子组件Child.vue,如下所示

a.Parent.vue,主要提供了子组件标签使用,传递到子组件的数据tableData,子组件可调用的方法。

  1. <template>
  2. <div class="app-container">
  3. <h1>父组件标题:以下表格为子组件展示</h1>
  4. <!--需要将tableData数据传递到子组件就需要在这里设置属性绑定
  5. 子组件需要调父组件方法,父组件需要在这里绑定,类似parentMethod,可以设置多个,属性名自定义-->
  6. <el-child :tableData="tableData" @haveCallBack="haveCallBack" @parentMethod="parentMethod"></el-child>
  7. </div>
  8. </template>
  9. <script>
  10. import Child from "./Child";
  11. export default {
  12. name: "Parent",
  13. components: {"el-child": Child},
  14. data() {
  15. return {
  16. tableData: [
  17. {
  18. date: "2016-05-02",
  19. name: "王小虎",
  20. address: "上海市普陀区金沙江路 1518 弄",
  21. },
  22. {
  23. date: "2016-05-04",
  24. name: "王小虎",
  25. address: "上海市普陀区金沙江路 1517 弄",
  26. },
  27. {
  28. date: "2016-05-01",
  29. name: "王小虎",
  30. address: "上海市普陀区金沙江路 1519 弄",
  31. },
  32. {
  33. date: "2016-05-03",
  34. name: "王小虎",
  35. address: "上海市普陀区金沙江路 1516 弄",
  36. },
  37. {
  38. date: "2016-05-07",
  39. name: "王y虎",
  40. address: "上海市普陀区金沙江路 1516 弄",
  41. },
  42. {
  43. date: "2016-05-08",
  44. name: "王q虎",
  45. address: "上海市普陀区金沙江路 1516 弄",
  46. },
  47. {
  48. date: "2016-05-09",
  49. name: "王小p",
  50. address: "上海市普陀区金沙江路 1516 弄",
  51. },
  52. ]
  53. };
  54. },
  55. methods: {
  56. parentMethod(row) {
  57. console.log("父组件方法已调用,子组件传递日期打印:" + row.date);
  58. },
  59. haveCallBack(row, callback) {
  60. console.log("父组件方法已调用,子组件传递日期打印:" + row.date);
  61. callback(row.date);
  62. }
  63. }
  64. }
  65. </script>

b.Child.vue,主要显示表格数据,处理表格拖拽,以及调用父组件方法并获取方法返回值。

  1. <template>
  2. <div>
  3. <!--这里row-key必须要加唯一的prop,不加拖拽位置会不对-->
  4. <el-table :data="tableData" class="t1" row-key="date" style="width: 100%" :default-sort="{prop:'id',order:'descending'}">
  5.     <!--前端编号显示列,default-sort设置通过该列将数据倒序展示-->
  6.     <el-table-column align="center" label="编号" prop="id" type="index" width="80px" sortable/>
  7. <el-table-column label="日期" prop="date" width="180"></el-table-column>
  8. <el-table-column label="姓名" prop="name" width="180"></el-table-column>
  9. <el-table-column label="地址" prop="address"></el-table-column>
  10. <el-table-column align="center" class-name="small-padding" label="操作" width="180px">
  11. <template slot-scope="scope">
  12. <el-button v-hasPermi="['minigame:level:edit']" icon="el-icon-edit"
  13. size="mini"
  14. type="text"
  15. @click="callParentMethod(scope.row)">调用父组件方法
  16. </el-button>
  17. <el-button v-hasPermi="['minigame:level:edit']" icon="el-icon-edit"
  18. size="mini"
  19. type="text"
  20. @click="haveCallBack(scope.row)">调用父组件方法并回调
  21. </el-button>
  22. </template>
  23. </el-table-column>
  24. </el-table>
  25. </div>
  26. </template>
  27. <script>
  28. import Sortable from "sortablejs"; // 引入拖拽js 这个是实现拖拽功能的核心,可以通過npm 安裝,文檔鏈接:http://www.sortablejs.com/options.html
  29. export default {
  30. name: "Child",
  31. components: {},
  32. //父组件传过来的数据属性名
  33. props: ['tableData'],
  34. data() {
  35. return {};
  36. },
  37. mounted() {
  38. //调用拖拽行方法
  39. this.rowDrop()
  40. },
  41. methods: {
  42. callParentMethod(row) {
  43. //在子组件调用父组件的方法,需要传参就在后面带
  44. this.$emit('parentMethod', row)
  45. },
  46. haveCallBack(row) {
  47. this.$emit('haveCallBack', row, rsp => {
  48. console.log("回调到子组件,打印日期:" + rsp)
  49. })
  50. },
  51. //拖拽行方法
  52. rowDrop() {
  53. const tbody = document.querySelector('.t1 tbody')
  54. Sortable.create(tbody, {
  55. disabled: false, // 是否开启拖拽
  56. ghostClass: 'sortable-ghost', //拖拽样式
  57. animation: 150, // 拖拽延时,效果更好看
  58. group: { // 是否开启跨表拖拽
  59. pull: false,
  60. put: false
  61. },
  62. onEnd: (e) => { // 这里主要进行数据的处理,拖拽实际并不会改变绑定数据的顺序,这里需要自己做数据的顺序更改
  63. let arr = this.tableData; // 获取表数据
  64. arr.splice(e.newIndex, 0, arr.splice(e.oldIndex, 1)[0]); // 数据处理
  65. this.$nextTick(function () {
  66. this.tableData = arr;
  67. });
  68. }
  69. });
  70. }
  71. }
  72. }
  73. </script>
  74. <style scoped>
  75. .sortable-ghost {
  76. opacity: 0.4;
  77. background: #00a7d0;
  78. }
  79. </style>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/279794
推荐阅读
相关标签
  

闽ICP备14008679号