详解如何使用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 相关文章推荐
JSuggest自动匹配下拉框使用方法(示例代码)
Dec 27 Javascript
jquery实现保存已选用户
Jul 21 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
Sep 27 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
Feb 18 Javascript
Weex开发之地图篇的具体使用
Oct 16 Javascript
8个非常实用的Vue自定义指令
Dec 15 Vue.js
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+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
用ADODB.Stream转换
2007/01/22 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
pandas DataFrame数据转为list的方法
2018/04/11 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Flask框架信号用法实例分析
2018/07/24 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
python 19个值得学习的编程技巧
2020/08/15 Python
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
运动会通讯稿400字
2014/01/28 职场文书
临床护士自荐信
2014/01/31 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL