vue 2.0 Render函数

2017-08-04  本文已影响3345人  回调的幸福时光

前言

如果你使用过React框架,相信你一定了解过JSX语法糖。在此不去长篇大论JSX语法,简单的说就是可以js和html混用,经过编译后转化为JavaScript语法。
而除了JSX之外,在react中也可以直接用js语法来书写元素,但是在JSX中html结构更加直观。

创建HTML的几种方式

reactivity-system.png

createElement 参数

createElement() 有3个参数:

深入data object参数

就是createElement的第二个参数。

{
  'class': {
     // 和`v-bind:class`一样的API
  },
  style: {
     // 和`v-bind:style`一样的API
  },
  attrs: {
     // 正常的 html 特性
  },
  props: {
     // 组件 props
  },
  domProps: {
    // DOM 属性
  },
  on: {
    // 事件监听器基于on
    // 不再支持如 `v-on:keyup.enter` 修饰器,需手动匹配 keyCode
  },
  nativeOn: {
    // 仅对于组件,用于监听原生组件,而不是组件内部使用`vm.$emit`触发的事件
  },
  directives: [
    {
      // 自定义指令,注意事项:不能对绑定的旧值设值
      // vue 会为您持续追踪
    }
  ],
  scopedSlots: {
  },
  slot: '', // 如果组件是其他组件的子组件,需为 slot 指定名称
  // 其他特殊顶层属性
  key: '',
  ref: ''
}

约束

就是createElement的第三个参数。
组件树中的所有 VNodes 必须是唯一的。

使用 JavaScript 代替模板功能

v-if / v-for

v-if 在render中用if / else实现;
v-for 在render中用map实现

v-model

  render: function (createElement) {
  var self = this
  return createElement('input', {
    domProps: {
      value: self.value
    },
    on: {
      input: function (event) {
        self.value = event.target.value
        self.$emit('input', event.target.value)
      }
    }
  })
}

别名

将 h 作为 createElement 的别名是 Vue 生态系统中的一个通用惯例,实际上也是 JSX 所要求的,如果在作用域中 h 失去作用, 在应用中会触发报错。

es5

new Vue({
  el: '#demo',
  render: function (h) {
    return (
      h(APP)
    )
  }
})

es6

new Vue({
  el: '#demo',
  render: h => h(APP)
})
上一篇下一篇

猜你喜欢

热点阅读