详解如何使用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 相关文章推荐
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
jQuery实现的一个自定义Placeholder属性插件
Aug 11 Javascript
JavaScript操作选择对象的简单实例
May 16 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
angular源码学习第一篇 setupModuleLoader方法
Oct 20 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
Mar 15 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 Javascript
手机注册发送验证码倒计时的简单实例
Nov 15 Javascript
总结JavaScript在IE9之前版本中内存泄露问题
Apr 28 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 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遍历二维数组的代码
2011/04/22 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
基于ssm框架实现layui分页效果
2019/07/27 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python中super函数的用法
2017/11/17 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
python 实现图片裁剪小工具
2021/02/02 Python
函授自我鉴定
2013/11/06 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
初二生物教学反思
2014/02/03 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
内勤岗位职责
2015/02/10 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫