关于vue的jsx语法
react的jsx语法很好用,但是vue的jsx语法就不是很好用了。
vue的jsx语法不能实现双向数据绑定以及各种比如v-for指令,只能自己用代码用另一种方式实现出来。着实是费了一些功夫,现在来说一下我使用vue的jsx语法过程中用到的东西吧,当个记录,也方便以后查看。
因为我的项目用得是iview的框架,所以这里用的是iview的table组件+vue2.0+jsx
传送门:iview:https://www.iviewui.com/components/table
vue的jsx语法:https://cn.vuejs.org/v2/guide/render-function.html#ad
以下是代码:
1 //以下是table 2 <div style="width:100%;"> 3 <i-table border :columns="columns2" :data="data2" style="width:100%;"></i-table> 4 </div> 5 6 7 //以下是data数据 8 9 export default{ 10 data(){ 11 return { 12 columns2: [ 13 { 14 title: "编号", 15 key: "num", 16 align: "center", 17 width: 150, 18 render: (h, params) => { 19 return h("div", [h("strong", params.index + 1)]); 20 } 21 }, 22 { 23 title: "原文本", 24 key: "OriginalText", 25 align: "center", 26 render: (h, params) => { 27 console.log(params.row); 28 const _self = this; 29 const arr = []; 30 debugger; 31 console.log(_self.data2[params.index].OriginalText, "OriginalText"); 32 33 _self.data2[params.index].OriginalText.forEach((item, index) => { 34 arr.push( 35 h("Input", { 36 props: { 37 value: item.OriginalText 38 }, 39 style: { 40 margin: "5px 0" 41 }, 42 on: { 43 input: value => { 44 debugger; 45 console.log(item.OriginalText); 46 params.row.OriginalText[index].OriginalText = value; 47 console.log(value); 48 _self.data2[params.index] = params.row; 49 _self.n++; 50 console.log(_self.data2); 51 } 52 } 53 }) 54 ); 55 }); 56 return h( 57 "Row", 58 { 59 style: { 60 padding: "10px 0" 61 } 62 }, 63 [ 64 h( 65 "i-col", 66 { 67 attrs: { 68 span: 20 69 } 70 }, 71 arr 72 ), 73 h( 74 "i-col", 75 { 76 attrs: { 77 span: 4 78 }, 79 style: { 80 marginTop: "8px" 81 } 82 }, 83 [ 84 h( 85 "Button", 86 { 87 attrs: { 88 type: "ghost", 89 size: "small" 90 }, 91 style: { 92 border: "none" 93 }, 94 on: { 95 click: function() { 96 debugger; 97 // console.log(_self.data2[params.index].OriginalText,'_self.data2[params.index].OriginalText') 98 _self.data2[params.index].OriginalText.push({ 99 OriginalText: "" 100 }); 101 _self.n++; 102 } 103 } 104 }, 105 [ 106 h("Icon", { 107 props: { 108 type: "plus-circled" 109 }, 110 style: { 111 fontSize: "24px", 112 color: "#39f" 113 } 114 }) 115 ] 116 ) 117 ] 118 ) 119 ] 120 ); 121 } 122 }, 123 { 124 title: "替换文本", 125 key: "replaceText", 126 align: "center", 127 render: (h, params) => { 128 console.log(params.row); 129 const _self = this; 130 const arr = []; 131 132 _self.data2[params.index].replaceText.forEach((item, index) => { 133 arr.push( 134 h("Input", { 135 props: { 136 value: item.replaceText 137 }, 138 style: { 139 margin: "5px 0" 140 }, 141 on: { 142 input: value => { 143 // debugger; 144 console.log(item.replaceText); 145 params.row.replaceText[index] = value; 146 console.log(value); 147 _self.data2[params.index] = params.row; 148 console.log(_self.data2); 149 _self.n++; 150 } 151 } 152 }) 153 ); 154 }); 155 return h( 156 "Row", 157 { 158 style: { 159 padding: "10px 0" 160 } 161 }, 162 [ 163 h( 164 "i-col", 165 { 166 attrs: { 167 span: 20 168 } 169 }, 170 arr 171 ), 172 h( 173 "i-col", 174 { 175 attrs: { 176 span: 4 177 }, 178 style: { 179 marginTop: "8px" 180 } 181 }, 182 [ 183 h( 184 "Button", 185 { 186 attrs: { 187 type: "ghost", 188 size: "small" 189 }, 190 style: { 191 border: "none" 192 }, 193 on: { 194 click: function() { 195 debugger; 196 _self.data2[params.index].replaceText.push({ 197 replaceText: "" 198 }); 199 console.log(_self.data2); 200 } 201 } 202 }, 203 [ 204 h("Icon", { 205 props: { 206 type: "plus-circled" 207 }, 208 style: { 209 fontSize: "24px", 210 color: "#39f" 211 } 212 }) 213 ] 214 ) 215 ] 216 ) 217 ] 218 ); 219 } 220 }, 221 { 222 title: "操作", 223 key: "action", 224 width: 200, 225 align: "center", 226 render: (h, params) => { 227 return h("div", [ 228 h( 229 "Button", 230 { 231 props: { 232 type: "error", 233 size: "small" 234 }, 235 style: { 236 marginRight: "5px" 237 }, 238 on: { 239 click: () => { 240 //this.delete(params.index); 241 } 242 } 243 }, 244 "删除" 245 ) 246 ]); 247 } 248 } 249 ], 250 data2: [ 251 { 252 OriginalText: [ 253 { OriginalText: "这是原始文本1" }, 254 { OriginalText: "这是原始文本2" } 255 ], 256 replaceText: [ 257 { replaceText: "这是替换文本1" }, 258 { replaceText: "这是替换文本1" } 259 ] 260 }, 261 { 262 OriginalText: [ 263 { OriginalText: "这是原始文本1" }, 264 { OriginalText: "这是原始文本2" } 265 ], 266 replaceText: [ 267 { replaceText: "这是替换文本1" }, 268 { replaceText: "这是替换文本1" }, 269 { replaceText: "这是替换文本1" } 270 ] 271 }, 272 { 273 OriginalText: [ 274 { OriginalText: "这是原始文本1" }, 275 { OriginalText: "这是原始文本2" } 276 ], 277 replaceText: [ 278 { replaceText: "这是替换文本1" }, 279 { replaceText: "这是替换文本1" }, 280 { replaceText: "这是替换文本1" }, 281 { replaceText: "这是替换文本2" } 282 ] 283 }, 284 { 285 OriginalText: [ 286 { OriginalText: "这是原始文本1" }, 287 { OriginalText: "这是原始文本2" } 288 ], 289 replaceText: [ 290 { replaceText: "这是替换文本1" }, 291 { replaceText: "这是替换文本1" }, 292 { replaceText: "这是替换文本1" }, 293 { replaceText: "这是替换文本2" } 294 ] 295 }, 296 { 297 OriginalText: [ 298 { OriginalText: "这是原始文本1" }, 299 { OriginalText: "这是原始文本2" } 300 ], 301 replaceText: [ 302 { replaceText: "这是替换文本1" }, 303 { replaceText: "这是替换文本1" }, 304 { replaceText: "这是替换文本1" }, 305 { replaceText: "这是替换文本2" } 306 ] 307 }, 308 309 ], 310 } 311 312 } 313 314 315 } 316