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 相关文章推荐
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
js改变embed标签src值的方法
Apr 10 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
微信小程序云开发修改云数据库中的数据方法
May 18 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
17道题让你彻底理解JS中的类型转换
Aug 08 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 Javascript
解决vue addRoutes不生效问题
Aug 04 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投票程序源码
2007/03/11 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php+mysql实现的二级联动菜单效果详解
2016/05/10 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
vue中的mvvm模式讲解
2019/01/31 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
Tornado 多进程实现分析详解
2018/01/12 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python元组常见操作示例
2019/02/19 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
出生公证委托书
2014/04/03 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
2014年维修工作总结
2014/11/22 职场文书
顶岗实习计划书
2015/01/16 职场文书
务工证明怎么写
2015/06/18 职场文书
领导欢送会主持词
2015/07/06 职场文书
素质拓展训练感想
2015/08/07 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python