详解如何使用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方法和技巧大全
Dec 27 Javascript
jQuery AJAX回调函数this指向问题
Feb 08 Javascript
js原型链原理看图说明
Jul 07 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
JavaScript的面向对象编程基础
Aug 13 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
Oct 15 Javascript
jquery彩色投票进度条简单实例演示
Jul 23 Javascript
JavaScript的React框架中的JSX语法学习入门教程
Mar 05 Javascript
简单实现bootstrap选项卡效果
Feb 08 Javascript
js实现返回顶部效果
Mar 10 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 jQuery
微信小程序实现时间戳格式转换
Jul 20 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
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
javascript Array对象基础知识小结
2010/11/16 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python实现简单加密解密机制
2019/03/19 Python
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
高中军训感言800字
2014/03/05 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
工商局调档介绍信
2015/10/22 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书