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 相关文章推荐
用roll.js实现的图片自动滚动+鼠标触动的特效
Mar 18 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
jquery中toggle函数交替使用问题
Jun 22 Javascript
jQuery实现的超简单点赞效果实例分析
Dec 31 Javascript
快速学习AngularJs HTTP响应拦截器
Dec 31 Javascript
javascript实现抽奖程序的简单实例
Jun 07 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
Jan 18 Javascript
JS完成画圆圈的小球
Mar 07 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
vue移动端实现红包雨效果
Jun 23 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
vue移动端使用canvas签名的实现
Jan 15 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/10/09 PHP
PHP的SQL注入过程分析
2012/01/06 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
实例解析php的数据类型
2018/10/24 PHP
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
python自动zip压缩目录的方法
2015/06/28 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
怎么快速自学python
2020/06/22 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
培训主管的岗位职责
2013/11/23 职场文书
中药学专业求职信
2014/05/31 职场文书
霸气队列口号
2014/06/18 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
出差报告怎么写
2014/11/06 职场文书
以权谋私检举信范文
2015/03/02 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
运动会3000米加油稿
2015/07/21 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书