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 相关文章推荐
Div自动滚动到末尾的代码
Oct 26 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
深入理解JavaScript中的对象
Jun 04 Javascript
详述JavaScript实现继承的几种方式(推荐)
Mar 22 Javascript
jQuery animate easing使用方法图文详解
Jun 17 Javascript
利用Javascript实现BMI计算器
Aug 16 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
Jan 15 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
解决Layui选择全部,换页checkbox复选框重新勾选的问题方法
Aug 14 Javascript
AngularJS自定义表单验证功能实例详解
Aug 24 Javascript
js prototype深入理解及应用实例分析
Nov 25 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 Document 代码注释规范
2009/04/13 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
Python 通过pip安装Django详细介绍
2017/04/28 Python
python生成随机图形验证码详解
2017/11/08 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
python发送告警邮件脚本
2018/09/17 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
建筑经济管理专业求职信分享
2014/01/06 职场文书
学校校庆演讲稿
2014/05/22 职场文书
企业职业病防治方案
2014/05/29 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers