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版本A*寻路算法
Dec 22 Javascript
jQuery隔行变色与普通JS写法的对比
Apr 21 Javascript
js实现拖拽效果
Feb 12 Javascript
简介JavaScript中substring()方法的使用
Jun 06 Javascript
基于jQuery实现的幻灯图片切换
Dec 02 Javascript
javascript表单正则应用
Feb 04 Javascript
Javascript中prototype与__proto__的关系详解
Mar 11 Javascript
使用 vue-i18n 切换中英文效果
May 23 Javascript
js input输入百分号保存数据库失败的解决方法
May 26 Javascript
关于JavaScript中高阶函数的魅力详解
Sep 07 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
Nov 01 jQuery
vscode自定义vue模板的实现
Jan 27 Vue.js
关于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获取数组中键值最大数组项的索引值
2015/03/17 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Python获取央视节目单的实现代码
2015/07/25 Python
Python模块包中__init__.py文件功能分析
2016/06/14 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
浅析Python四种数据类型
2018/09/26 Python
Python 多维List创建的问题小结
2019/01/18 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
如何在django中实现分页功能
2020/04/22 Python
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
服务之星获奖感言
2014/01/21 职场文书
庆七一活动方案
2014/01/25 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
留守儿童工作方案
2014/06/02 职场文书
临时租车协议范本
2014/09/23 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
九年级化学教学反思
2016/02/22 职场文书
python实现高效的遗传算法
2021/04/07 Python
Python基础知识之变量的详解
2021/04/14 Python