详解如何使用webpack在vue项目中写jsx语法


Posted in Javascript onNovember 08, 2017

本文介绍了如何使用webpack在vue项目中写jsx语法,分享给大家,具体如下:

我们知道Vue 2.0中对虚拟DOM的支持。我们可以通过JavaScript动态的创建元素,而不用在template中写HTML代码。虚拟DOM最终将被渲染为真正的DOM。

data: {
 msg: 'Hello world'
},
render (h) {
 return h(
 'div',
 { attrs: { id: 'my-id' },
 [ this.msg ]
 );
}

渲染后的内容为:

<div id='my-id'>Hello world</div>

Vue 2.0中的render为我们开启了一片新的天地,赋予了我们无限的想象力。比如,我们可以把React中用到的JSX语法应用到Vue中来。接下来,我们就聊聊怎么在Vue项目中使用JSX.

JSX简介

JSX是基于Javascript的语言扩展, 它允许在Javascript代码中插入XML语法风格的代码。如下所示:

data: {
 msg: 'Hello world'
},
render (h) {
 return (
 <div id='my-id'>,
  { this.msg } 
 </div>
 );
}

但值得注意的是,浏览器默认是解析不了JSX的,它必须要先编译成标准的JavaScript代码才可以运行。就像我们需要将sass或者less编译为CSS代码之后才能运行一样。

在Vue中使用JSX

Vue框架并没有特意地去支持JSX,其实它也没必要去支持,因为JSX最后都会编译为标准的JavaScript代码。既然这样, 那Vue和JSX为什么能配合在一起使用呢? 很简单, 因为Vue支持虚拟DOM, 你可以用JSX或者其他预处理语言,只要能保证render方法正常工作即可。

Vue官方提供了一个叫做babel-plugin-transform-vue-jsx的插件来编译JSX, 我们稍后介绍如何使用它。

为什么要在Vue中使用JSX

为什么要再Vue中使用JSX ? 其实Vue并没有强迫你去使用JSX, 它只是提供了一种新的方式而已。正所谓萝卜青菜,各有所爱。有的人觉得在render方法中使用JSX更简洁,有的人却觉得在JavaScript代码中混入HTML代码很恶心。反正你喜欢就用,不喜欢就不用呗。废话少说,我们先看一个简单的应用:
script.js

new Vue({
 el: '#app',
 data: {
 msg: 'Click to see the message'
 },
 methods: {
 hello () {
  alert('This is the message')
 }
 }
});

index.html

<div id="app">
 <span 
  class="my-class" 
  style="cursor: pointer" 
  v-on:click="hello"
 >
  {{ msg }}
 </span>
</div>

代码很简单,就是在页面上显示一个span, 里面的内容为"Click to see the message"。当点击内容时,弹出一个alert。我们看看用render怎么实现。

用Vue 2.0中的render函数实现

script.js

new Vue({
 el: '#app',
 data: {
 msg: 'Click to see the message'
 },
 methods: {
 hello () {
  alert('This is the message')
 }
 },
 render (createElement) {
 return createElement(
  'span',
  {
  class: { 'my-class': true },
  style: { cursor: 'pointer' },
  on: {
   click: this.hello
  }
  },
  [ this.msg ]
 );
 },
});

index.html

<div id="app"><!--span will render here--></div>

使用JSX来实现

script.js

new Vue({
 el: '#app',
 data: {
 msg: 'Click to see the message.'
 },
 methods: {
 hello () {
  alert('This is the message.')
 }
 },
 render: function render(h) {
 return (
  <span
  class={{ 'my-class': true }}
  style={{ cursor: 'pointer' }}
  on-click={ this.hello }
  >
  { this.msg }
  </span>
 )
 }
});

index.html和上文一样。

babel-plugin-transform-vue-jsx

正如前文所说, JSX是需要编译为JavaScript才可以运行的, 所以第三个样例需要有额外的编译步骤。这里我们用Babel和Webpack来进行编译。

打开你的webpack.config.js文件, 加入babel loader:

loaders: [
 { test: /\.js$/, loader: 'babel', exclude: /node_modules/ }
]

新建或者修改你的.babelrc文件,加入 babel-plugin-transform-vue-jsx 这个插件

{
 "presets": ["es2015"],
 "plugins": ["transform-vue-jsx"]
}

现在运行webpack, 代码里面的JSX就会被正确的编译为标准的JavaScript代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 Javascript
浅谈javascript的分号的使用
May 12 Javascript
Web前端开发工具——bower依赖包管理工具
Mar 29 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
微信小程序商品详情页规格属性选择示例代码
Oct 30 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
thinkjs 文件上传功能实例代码
Nov 08 #Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
Nov 08 #jQuery
在React 组件中使用Echarts的示例代码
Nov 08 #Javascript
浅谈mint-ui loadmore组件注意的问题
Nov 08 #Javascript
es6在react中的应用代码解析
Nov 08 #Javascript
mac中利用NVM管理不同node版本的方法详解
Nov 08 #Javascript
浅谈vue-router2路由参数注意的问题
Nov 08 #Javascript
You might like
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
vue如何判断dom的class
2018/04/26 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
Python多线程实现同步的四种方式
2017/05/02 Python
python flask 多对多表查询功能
2017/06/25 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
使用python生成目录树
2018/03/29 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
车间调度岗位职责
2013/11/30 职场文书
师生聚会感言
2014/01/26 职场文书
初中考试作弊检讨书
2014/02/01 职场文书
元旦晚会策划方案
2014/02/18 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
员工旷工检讨书
2015/08/15 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL