详解如何使用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创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
jQuery实现带水平滑杆的焦点图动画插件
Mar 08 Javascript
归纳下js面向对象的几种常见写法总结
Aug 24 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
Nov 07 Javascript
vue-cli webpack 开发环境跨域详解
May 18 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
Mar 07 Javascript
Vue实战教程之仿肯德基宅急送App
Jul 19 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 18 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
Feb 15 Javascript
swiper自定义分页器的样式
Sep 14 Javascript
关于uniApp editor微信滑动问题
Jan 15 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与java通过socket通信的实现代码
2013/10/21 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
基于vue实现分页效果
2017/11/06 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
Python延时操作实现方法示例
2018/08/14 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
商务专员岗位职责
2013/11/23 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
公司周年庆典标语
2014/10/07 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL