美文网首页
render 函数

render 函数

作者: 苦瓜_6 | 来源:发表于2018-09-04 07:51 被阅读0次

在render函数的方法中,参数必须是 createElement,createElement是一个function。

    Vue.component('child', {
      render: function (createElement) {
        return createElement('h' + this.level, // 标签名称
          this.$slots.default); // 子组件中的阵列
      },
      props: ['level']
    })

createElement 的第一个参数

createElement 的第一个参数是必选的,它可以是 {String | Object | Function}中的任何一种 。

  • String ---- html 标签
    render: function (createElement) { 
        return createElement('h' + this.grade, // case1: String
          this.$slots.default) // 子组件中的阵列
  • Object ---- 一个含有数据选项的对象
render: function (createElement) {
        return createElement({ //case2: Object
          template: '<h2>h2</h2>'
        })
      }
  • Function ----- 方法返回含有数据选项的对象
render: function (createElement) {
        let func = function () {
          return {
            template: '<h3>h3</h3>' // case3: Function
          }
        };
        return createElement(func())
      }

createElement 的第二个参数

第二个参数是一个包含模板相关属性的数据对象(比如 class,style,attrs,domProps 等等),只能是对象。

 render: function(createElement) {
         return createElement(
           'div',
            // createElement 第二个参数是数据对象,只能是对象。
           {    
            'class': { //  由于class 在JS 中是关键字,所以用了引号,但是实际上不加也不会报错
              active: false,
              error: true
            },
            style: {
              fontSize: '24px',
              color: '#b2d235'
            },
            attrs: { //  正常的HTML特性,比如 src
              id: 'foo'
            },
            domProps: { // 用来写原生的 DOM 属性
              innerHTML: '<p> hi ~ <p>'
            }
           }  
         )
       }
    }

createElement 的第三个参数

第三个参数也是可选 , 类型为 String 或 Array (Array用的更多一些),作为构建函数的子节点来使用的。

    render: function (createElment) {
                return createElment('div',[
                createElment('p','我是子节点')
                ])
      }

this.$slots在render函数中的应用

  render: function(createElement) {
        // debugger
         let header = this.$slots.header;
         console.log(header);
         let main = this.$slots.default;
         let footer = this.$slots.footer;
         return createElement('div',[
         createElement('header',header),
         createElement('main',main),
         createElement('footer',footer)
         ] )
       } 

在render函数中使用props传递数据

let componentA = {
      props: ['show'],
      render: function (createElement) {
        let src;
        if (this.show) {
          src = './images/1.jpg'
        } else {
          src = './images/2.jpg'
        }
        return createElement('div', {
          style: {
            marginTop: '30px'
          }
        }, [
          createElement('img', {
            attrs: {
              src: src
            },
            style: {
              width: '400px'
            }
          })
        ])
      }
    }

v-model在render函数中的应用

    <component-a v-model = "msg" :message = "msg"></component-a>

let componentA = {
      props: ['message'],
      render: function(createElement) {
        return createElement ('input',{
          domProps: {
            value: this.message
          },
          on: {
            input: () =>{
              this.$emit('input',event.target.value)
            }
          }
        })
      }
    }

作用域插槽在render函数中的使用

      <component-a >
         <template slot-scope = "prop">
           {{ prop.msg }}
         </template>
      </component-a>
    let componentA = {
      render: function(createElement) {
        return createElement('div',this.$scopedSlots.default({
        msg:'xxxxx'
      }))
      }
    }

函数化组件的应用

functional: true表示该组件无状态(没有响应式数据),无实例(没有this 上下文)

    let componentA = {
      functional: true, // functional: true,表示该组件无状态无实例
      props: ['msg'],
      render: function (createElement, context) {
        return createElement('button', {
          on: {
            'click': () => {
              console.log(context);
              console.log(context.parent); // 父组件app
              console.log(context.parent.count); //父组件的count: 0
              console.log(context.props.msg); //  传过来的msg
              console.log(this) // undefined
            }
          }
        }, '点我看控制台有什么')
      }
    }

相关文章

  • vue的render函数

    render函数的作用 我们自己使用render函数 render函数---通过initrender加入vm对象原...

  • VUE/MUI 项目小记

    render虚拟DOM构造函数 MUI上拉加载 render函数

  • vue中的render函数式组件

    问题:1、render函数是什么2、render函数怎么用 1. render函数是什么 简单的说,在vue中我们...

  • vue渲染流程

    把模板转化成render函数 调用render函数产生虚拟节点,将虚拟节点插入到真实节点上 生成render函数方...

  • Vue render函数认识和使用

    1、认识render函数参数使用 (1)、 render函数的第一个参数 在render函数的方法中,参数必须是c...

  • RN 错误大全

    这个错误的原因是render函数出错,具体就是在render函数里面写了注释,所以千万不要在render函数里写注...

  • React学习笔记2

    1.render函数对于props和state必须是纯函数 render函数不能改变props和state的属性,...

  • 4-组件与 prop、state

    语法: 引入Component 新建一个类,继承Component 实现render函数 在render函数内返回...

  • vue编译模板

    一,with语法 二,编译模板 1,模板编译为render函数,执行render函数返回vnode(虚拟节点)...

  • React V17.0源码 学习笔记(一)

    ReactDOM.render 函数调用说明 ReactDOM.render(element,container,...

网友评论

      本文标题:render 函数

      本文链接:https://www.haomeiwen.com/subject/jreewftx.html