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 的 prototype问题。
Jan 03 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
js实现简单锁屏功能实例
May 27 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
基于javascript的Form表单验证
Dec 29 Javascript
js实现密码强度检验
Jan 15 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
Apr 25 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
jQuery获取随机颜色的实例代码
May 21 jQuery
微信小程序实现弹出菜单
Jul 19 Javascript
bootstrap datepicker的基本使用教程
Jul 09 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写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
php实现图片缩放功能类
2013/12/18 PHP
php GUID生成函数和类
2014/03/10 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
Python程序慢的重要原因
2020/09/04 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
南京某公司笔试题
2013/01/27 面试题
优秀大学生的自我评价
2014/01/16 职场文书
满月酒主持词
2014/03/27 职场文书
世界遗产的导游词
2015/02/13 职场文书
投诉信回复范文
2015/07/03 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js