详解如何使用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判断浏览器是否是IE的比较好的办法
May 08 Javascript
jquery 学习笔记一
Apr 07 Javascript
Javascript new关键字的玄机 以及其它
Aug 25 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
Bootstrop实现多级下拉菜单功能
Nov 24 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
Apr 08 Javascript
vue router 源码概览案例分析
Oct 09 Javascript
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 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实现Session存储到Redis
2015/11/11 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js使用心得分享
2015/01/13 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python性能优化的20条建议
2014/10/25 Python
Python日志模块logging简介
2015/04/13 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
python适合人工智能的理由和优势
2019/06/28 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
新驾驶员个人自我评价
2014/01/03 职场文书
综合实践活动总结
2014/05/05 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
保安公司服务承诺书
2014/05/28 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
演讲稿开场白台词
2014/08/25 职场文书
教师理论学习心得体会
2016/01/21 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书