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 类型判断代码分析
Mar 28 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
Apr 02 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
jQuery图片轮播滚动切换代码分享
Apr 20 Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 Javascript
Javascript中关于Array.filter()的妙用详解
Dec 04 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
Vue-Router模式和钩子的用法
Feb 28 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 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函数与传递参数实例分析
2014/11/15 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Python语言异常处理测试过程解析
2020/01/08 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
九年级政治教学反思
2014/02/06 职场文书
尊师重教演讲稿
2014/09/04 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
毕业生政审意见范文
2015/06/04 职场文书