当前位置:   article > 正文

VUE 实现table 动态增加行增加列,且行内属性自定义,行内内容可编辑,标题栏内容可编辑_vue table新增行 自定义id

vue table新增行 自定义id

VUE 实现table 动态增加行增加列,且行内属性自定义,行内内容可编辑,标题栏内容可编辑

最终实现效果如下图

  源码

  1. <template>
  2. <div class="edit-box">
  3. <div class="botom-box">
  4. <Button type="primary" size="small" @click="AddRow">增加行</Button>
  5. <Button type="primary" size="small" @click="AddColumn">增加列</Button>
  6. </div>
  7. <div class="data-box" ref="tabdiv">
  8. <Table :height="tabheight" border :columns="columndata" :data="rowsdata" class="table-css"></Table>
  9. </div>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. data() {
  15. return {
  16. tabheight:0,
  17. columndata:[
  18. {
  19. title: '名称',
  20. key: 'name',
  21. width:150,
  22. fixed: 'left',
  23. resizable:true ,
  24. render: (h, params) => {
  25. var _this = this;
  26. return h('div', [
  27. h('Icon', {
  28. props: {
  29. type: 'md-close-circle',
  30. size:"15"
  31. },
  32. style:{
  33. color:'#FF0000',
  34. cursor: 'pointer',
  35. float:'left',
  36. margin:"5px 10px 0px 0px"
  37. },
  38. on: {
  39. click: () => {
  40. if(_this.rowsdata.length>1){
  41. _this.rowsdata.splice(params.index,1);
  42. }else{
  43. this.$Message.warning('至少要保留一行数据!');
  44. }
  45. }
  46. }
  47. }),
  48. h('Input', {
  49. props: {
  50. value: params.row[params.column.key],
  51. },
  52. style:{
  53. width:'75%',
  54. float:'left'
  55. },
  56. on: {
  57. 'on-change': event => {
  58. params.row[params.column.key] = event.target.value;
  59. _this.rowsdata[params.index]= params.row;
  60. },
  61. }
  62. })
  63. ])
  64. }
  65. },
  66. {
  67. title: '属性值',
  68. key: 'value1',
  69. width:120,
  70. resizable:true,
  71. render: (h, params) => {
  72. var _this = this;
  73. return h('InputNumber', {
  74. props: {
  75. value: params.row[params.column.key],
  76. step: 1,
  77. },
  78. style:{
  79. width:'100%',
  80. float:'left'
  81. },
  82. on: {
  83. 'on-change': event => {
  84. params.row[params.column.key] = event;
  85. _this.rowsdata[params.index]= params.row;
  86. },
  87. }
  88. })
  89. },
  90. renderHeader:(h, params,) => {
  91. var _this = this;
  92. return h('div', [
  93. h('Icon', {
  94. props: {
  95. type: 'md-close-circle',
  96. size:"15"
  97. },
  98. style:{
  99. color:'#FF0000',
  100. cursor: 'pointer',
  101. float:'left',
  102. margin:"5px 10px 0px 0px"
  103. },
  104. on: {
  105. click: () => {
  106. if(_this.columndata.length>2){
  107. _this.columndata.splice(params.index,1);
  108. }else{
  109. this.$Message.warning('属性值至少保留一列!');
  110. }
  111. }
  112. }
  113. }),
  114. h('Input', {
  115. props: {
  116. value: params.column.title,
  117. },
  118. style:{
  119. width:'70%',
  120. float:'left'
  121. },
  122. on: {
  123. 'on-change': event => {
  124. params.column.title = event.target.value;
  125. _this.columndata[params.index]= params.column;
  126. }
  127. }
  128. })
  129. ])
  130. }
  131. }
  132. ],
  133. rowsdata:[
  134. {name:'苹果',value1:11}
  135. ],
  136. columnIndex:1//当前动态添加列的数量
  137. }
  138. },
  139. methods: {
  140. AddRow(){
  141. var row = JSON.parse(JSON.stringify(this.rowsdata[0]));
  142. for(var name in row){
  143. if(name=="name"){
  144. row[name]="name";
  145. }else{
  146. row[name]=0;
  147. }
  148. }
  149. this.rowsdata.push(row);
  150. },
  151. AddColumn(){
  152. this.columnIndex++;
  153. var keyName = 'value' + this.columnIndex;
  154. this.rowsdata.forEach((value , index) => {
  155. value[keyName] = 0;
  156. })
  157. var column = {
  158. title: '属性值'+this.columnIndex,
  159. key: keyName,
  160. width:120,
  161. resizable:true,
  162. render: (h, params) => {
  163. var _this = this;
  164. return h('InputNumber', {
  165. props: {
  166. value: params.row[params.column.key],
  167. step: 1,
  168. },
  169. style:{
  170. width:'100%',
  171. float:'left'
  172. },
  173. on: {
  174. 'on-change': event => {
  175. params.row[params.column.key] = event;
  176. _this.rowsdata[params.index]= params.row;
  177. },
  178. }
  179. })
  180. },
  181. renderHeader:(h, params,) => {
  182. var _this = this;
  183. return h('div', [
  184. h('Icon', {
  185. props: {
  186. type: 'md-close-circle',
  187. size:"15"
  188. },
  189. style:{
  190. color:'#FF0000',
  191. cursor: 'pointer',
  192. float:'left',
  193. margin:"5px 10px 0px 0px"
  194. },
  195. on: {
  196. click: () => {
  197. if(_this.columndata.length>2){
  198. _this.columndata.splice(params.index,1);
  199. }else{
  200. this.$Message.warning('属性值至少保留一列!');
  201. }
  202. }
  203. }
  204. }),
  205. h('Input', {
  206. props: {
  207. value: params.column.title,
  208. },
  209. style:{
  210. width:'70%',
  211. float:'left'
  212. },
  213. on: {
  214. 'on-change': event => {
  215. params.column.title = event.target.value;
  216. _this.columndata[params.index]= params.column;
  217. }
  218. }
  219. })
  220. ])
  221. }
  222. }
  223. this.columndata.push(column);
  224. }
  225. },
  226. mounted() {
  227. this.tabheight = window.innerHeight*0.5695;
  228. }
  229. }
  230. </script>
  231. <style scoped>
  232. .edit-box{ width: 100%; height: 60vh; font-size: 14px;}
  233. /* padding: 1vh 1vw; */
  234. .botom-box {width: 100%; height: 3vh; text-align: right;}
  235. .data-box{ float:left; width: 100%; height:57vh;border: 1px solid rgb(211, 214, 208); border-radius: .133333rem;}
  236. /* 滚动条 */
  237. .table-css >>> .ivu-table-overflowY::-webkit-scrollbar {
  238. width: 10px;
  239. height: 10px;
  240. }
  241. .table-css >>> .ivu-table-overflowX::-webkit-scrollbar {
  242. width: 10px;
  243. height: 10px;
  244. }
  245. </style>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/692035
推荐阅读
相关标签
  

闽ICP备14008679号