详解如何使用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 相关文章推荐
js 页面关闭前的出现提示的实现代码
May 25 Javascript
jQuery实现 注册时选择阅读条款 左右移动
Apr 11 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
Feb 21 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
Mar 06 Javascript
HTML页面定时跳转方法解析(2种任选)
Dec 22 Javascript
vue如何实现observer和watcher源码解析
Mar 09 Javascript
Vue侦测相关api的实现方法
May 22 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
vue实现路由懒加载及组件懒加载的方式
Jun 11 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
Nov 19 Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 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
实现树状结构的两种方法
2006/10/09 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
python模块之StringIO使用示例
2015/04/08 Python
python 多线程重启方法
2019/02/18 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
python开发入门——列表生成式
2020/09/03 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
成人教育自我鉴定
2013/11/01 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
2014年教师节寄语
2014/08/11 职场文书
股份转让协议书范本
2015/01/27 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android