关于vue的jsx语法

Posted 阿伮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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         

 

以上是关于关于vue的jsx语法的主要内容,如果未能解决你的问题,请参考以下文章

写vue3+ jsx+ts语法+ storybook展示的组件库

写vue3+ jsx+ts语法+ storybook展示的组件库

写vue3+ jsx+ts语法+ storybook展示的组件库

用vue3+ jsx+ts语法写的组件库

关于React之JSX语法理解

vue 和 jest 的“当前未启用对实验语法 'jsx' 的支持”