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 相关文章推荐
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
Dec 26 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
Oct 16 Javascript
浅谈js中变量初始化
Feb 03 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
Javascript 高阶函数使用介绍
Jun 15 Javascript
js精美的幻灯片画集特效代码分享
Aug 29 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
easyui tree带checkbox实现单选的简单实例
Nov 07 Javascript
JS实现简易刻度时钟示例代码
Mar 11 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
Apr 18 Javascript
Vue通过input筛选数据
Oct 26 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
微信公众平台开发-微信服务器IP接口实例(含源码)
2017/03/05 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
Python使用turtule画五角星的方法
2015/07/09 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
python中bytes和str类型的区别
2019/10/21 Python
浅析使用Python搭建http服务器
2019/10/27 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
python画环形图的方法
2020/03/25 Python
Python魔术方法专题
2020/06/19 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
比较基础的php面试题及答案-编程题
2012/10/14 面试题
大学生职业生涯规划书模板
2014/01/03 职场文书
单位消防安全责任书
2014/07/23 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书