vue组件jsx语法的具体使用


Posted in Javascript onMay 21, 2018

如果使用render函数来写比较复杂的vue组件,对于可读性和可维护性都很不友好,而使用jsx就会让我们回到更接近于模板的语法。babel转译器会将jsx转译为render函数渲染。

配置

需要用到babel插件

安装

npm install\
 babel-plugin-syntax-jsx\
 babel-plugin-transform-vue-jsx\
 babel-helper-vue-jsx-merge-props\
 babel-preset-env\
 --save-dev

.babelrc配置

在plugins中添加transform-vue-jsx

{
 "presets": ["env"],
 "plugins": ["transform-vue-jsx"]
}

基础示例

转义前

<div id="foo">{this.text}</div>

转译后

h('div', {
 attrs: {
  id: 'foo'
 }
}, [this.text])

Note:h函数为vue实例的$createElement方法,必须存在于jsx的作用域中,在渲染函数中必须以第一个参数传入,如:

render (h) { // <-- h 函数必须在作用域内
 return <div id="foo">bar</div>
}

自动注入h函数

从3.4.0开始,在用ES2015语法声明的方法和getter访问器中(使用function关键字或箭头函数除外),babel会自动注入hconst h = this.$createElement)函数,所以可以省略(h)参数。

Vue.component('jsx-example', {
 render () { // h 会自动注入
  return <div id="foo">bar</div>
 },
 myMethod: function () { // h 不会注入
  return <div id="foo">bar</div>
 },
 someOtherMethod: () => { // h 不会注入
  return <div id="foo">bar</div>
 }
})

@Component
class App extends Vue {
 get computed () { // h 会自动注入
  return <div id="foo">bar</div>
 }
}

 Vue JSX 和 React JSX对比

首先, Vue2.0 的vnode 格式与react不同,createElement函数的第二个参数是一个数据对象,接受一个嵌套的对象,每一个嵌套对象都会有对应的模块处理。

Vue2.0 render语法

render (h) {
 return h('div', {
  // 组件props
  props: {
   msg: 'hi'
  },
  // 原生HTML属性
  attrs: {
   id: 'foo'
  },
  // DOM props
  domProps: {
   innerHTML: 'bar'
  },
  // 事件是嵌套在`on`下面的,所以将不支持修饰符,如:`v-on:keyup.enter`,只能在代码中手动判断keyCode
  on: {
   click: this.clickHandler
  },
  // For components only. Allows you to listen to
  // native events, rather than events emitted from
  // the component using vm.$emit.
  nativeOn: {
   click: this.nativeClickHandler
  },
  // class is a special module, same API as `v-bind:class`
  class: {
   foo: true,
   bar: false
  },
  // style is also same as `v-bind:style`
  style: {
   color: 'red',
   fontSize: '14px'
  },
  // other special top-level properties
  key: 'key',
  ref: 'ref',
  // assign the `ref` is used on elements/components with v-for
  refInFor: true,
  slot: 'slot'
 })
}

对应的Vue2.0 JSX语法

render (h) {
 return (
  <div
   // normal attributes or component props.
   id="foo"
   // DOM properties are prefixed with `domProps`
   domPropsInnerHTML="bar"
   // event listeners are prefixed with `on` or `nativeOn`
   onClick={this.clickHandler}
   nativeOnClick={this.nativeClickHandler}
   // other special top-level properties
   class={{ foo: true, bar: false }}
   style={{ color: 'red', fontSize: '14px' }}
   key="key"
   ref="ref"
   // assign the `ref` is used on elements/components with v-for
   refInFor
   slot="slot">
  </div>
 )
}

JSX展开运算符

支持JSX展开,插件会智能的合并数据属性,如:

const data = {
 class: ['b', 'c']
}
const vnode = <div class="a" {...data}/>

合并后的数据为:

{ class: ['a', 'b', 'c'] }

Vue 指令

JSX对大多数的Vue内建指令都不支持,唯一的例外是v-show,该指令可以使用v-show={value}的语法。大多数指令都可以用编程方式实现,比如v-if就是一个三元表达式,v-for就是一个array.map()等。

如果是自定义指令,可以使用v-name={value}语法,但是改语法不支持指令的参数arguments和修饰器modifier。有以下两个解决方法:

将所有内容以一个对象传入,如:v-name={{ value, modifier: true }}

使用原生的vnode指令数据格式,如:

const directives = [
 { name: 'my-dir', value: 123, modifiers: { abc: true } }
]

return <div {...{ directives }}/>

原文地址(https://github.com/vuejs/babel-plugin-transform-vue-jsx#usage)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 学习书 推荐
Jun 13 Javascript
Javascript在IE和FireFox中的不同表现简析
Dec 03 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
easyui datagrid 键盘上下控制选中行示例
Mar 31 Javascript
JavaScript时间操作之年月日星期级联操作
Jan 15 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
Aug 01 Javascript
深入理解node.js之path模块
May 03 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 Javascript
elementUI多选框反选的实现代码
Apr 03 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
关于vue的语法规则检测报错问题的解决
May 21 #Javascript
JS实现520 表白简单代码
May 21 #Javascript
了解ESlint和其相关操作小结
May 21 #Javascript
vue2.0 实现导航守卫(路由守卫)
May 21 #Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 #Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 #Javascript
Vue中父子组件通讯之todolist组件功能开发
May 21 #Javascript
You might like
PHP的面试题集
2006/11/19 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
java解析json方法总结
2019/05/16 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
Python实现Dijkstra算法
2018/10/17 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python对列表的操作知识点详解
2019/08/20 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
python多进程使用函数封装实例
2020/05/02 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
幼教个人求职信范文
2013/12/02 职场文书
办公设备采购方案
2014/03/16 职场文书
行政内勤岗位职责
2014/04/07 职场文书
中学清明节活动总结
2014/07/04 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
民事申诉状范本
2015/05/20 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis