vue render函数

render 函数
render: function (createElement) {
  return createElement('h1', this.blogTitle)
}
虚拟 DOM

Vue 通过建立一个虚拟 DOM对真实 DOM 发生的变化保持追踪

Vue.js(2.0版本)与React的其中最大一个相似之处,就是他们都使用了一种叫'Virtual DOM'的东西。所谓的Virtual DOM基本上说就是它名字的意思:虚拟DOM,DOM树的虚拟表现。它的诞生是基于这么一个概念:改变真实的DOM状态远比改变一个JavaScript对象的花销要大得多

Virtual DOM是一个映射真实DOM的JavaScript对象,如果需要改变任何元素的状态,那么是先在Virtual DOM上进行改变,而不是直接改变真实的DOM。当有变化产生时,一个新的Virtual DOM对象会被创建并计算新旧Virtual DOM之间的差别。之后这些差别会应用在真实的DOM上。

return createElement('h1', this.blogTitle)
createElement函数的参数
createElement(
//----------- 第1个参数 -----------------------------------------------------------
  // {String | Object | Function}
  // 一个 HTML 标签字符串,组件选项对象,或者一个返回值类型为 String/Object 的函数,必要参数
  'div',
//----------- 第2个参数 -----------------------------------------------------------
  // {Object}
  // 一个包含模板相关属性的数据对象
  // 这样,您可以在 template 中使用这些属性。可选参数。
  {
  // 和`v-bind:class`一样的 API
  'class': {
    foo: true,
    bar: false
  },
  // 和`v-bind:style`一样的 API
  style: {
    color: 'red',
    fontSize: '14px'
  },
  // 正常的 HTML 特性************
  attrs: {
    id: 'foo'
  },
  // 组件 props
  props: {
    myProp: 'bar'
  },
  // DOM 属性************
  domProps: {
    innerHTML: 'baz'
  },
  // 事件监听器基于 `on`************
  // 所以不再支持如 `v-on:keyup.enter` 修饰器
  // 需要手动匹配 keyCode。
  on: {
    click: this.clickHandler
  },
  // 仅对于组件,用于监听原生事件,而不是组件内部使用 `vm.$emit` 触发的事件。
  nativeOn: {
    click: this.nativeClickHandler
  },
  // 自定义指令。注意事项:不能对绑定的旧值设值************
  // Vue 会为您持续追踪
  directives: [
    {
      name: 'my-custom-directive',
      value: '2',
      expression: '1 + 1',
      arg: 'foo',
      modifiers: {
        bar: true
      }
    }
  ],
  // Scoped slots in the form of  ************
  // { name: props => VNode | Array<VNode> }
  scopedSlots: {
    default: props => createElement('span', props.text)
  },
  // 如果组件是其他组件的子组件,需为插槽指定名称
  slot: 'name-of-slot',
  // 其他特殊顶层属性************
  key: 'myKey',
  ref: 'myRef'
},
//----------- 第3个参数 -----------------------------------------------------------
  // {String | Array}
  // 子节点 (VNodes),由 `createElement()` 构建而成,
  // 或使用字符串来生成“文本节点”。可选参数。
  [
    '先写一些文字',
    createElement('h1', '一则头条'),
    createElement(MyComponent, {
      props: {
        someProp: 'foobar'
      }
    })
  ]
)

字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode。

Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数。

使用javascript代替模板功能,某些api要自己实现

1、使用if/else代替v-if
2、使用map代替v-for, 只有map方法才能检测改变,其他的方法不能根据数据的改变能改变相应的状态
3、v-model 使用domProps来实现双向绑定

createElement('input',  
       {  
           domProps:{  
               value:self.v  
                   },  
            on:{  
                 input:function(event){  
                        self.$emit('input',event.target.value)  

                         }  
                   }  
       });  
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前几天想学学Vue中怎么编写可复用的组件,提到要对Vue的render函数有所了解。可仔细一想,对于Vue的ren...
    kangaroo_v阅读 116,127评论 13 171
  • Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML。然而在一些场景中,你真的需要 JavaS...
    O8阅读 2,437评论 0 3
  • 一般的,数据渲染我们这么写 使用render函数,函数内部返回createElement回调 会发现render产...
    IceCover阅读 4,695评论 0 0
  • 通常构建一个vue的项目,在开发环境搭建完成,开始写组件,大多数情况下构建每个组件的模板使用template,但是...
    光头小青蛙阅读 193评论 0 1
  • 最近在用elementUI写管理后台的时候,遇到了需要在el-table表头自定义的功能,所以搜索了下vue官网,...
    天驱丶阅读 3,403评论 0 2