美文网首页
第九章 render函数

第九章 render函数

作者: 诺CIUM | 来源:发表于2019-01-24 19:36 被阅读15次

9.1 render函数初步了解

template下只允许有一个子节点

<template id="hdom">
    <div>
        <h1 v-if="level==1">
            <slot></slot>
        </h1>
        <h2 v-if="level==2">
            <slot></slot>
        </h2>
        <h3 v-if="level==3">
            <slot></slot>
        </h3>
    </div>
</template>

//是用vue组件定义
// Vue.component('child',{
//     props:['level'],
//     template:'#hdom'
// })

//使用render函数进行定义组件
Vue.component('child',{
    render:function (createElement) {
        return createElement('h'+this.level,
        this.$slots.default);
    },
    props:['level']
})

9.2 render函数的第一个参数

render函数的方法中,参数必须是 createElement,createElement的类型是function
render函数的第一个参数可以是 String | Object | Function

Vue.component('child',{
    // ----第一个参数必选
    //String--html标签
    //Object---一个含有数据选项的对象
    //FUnction---方法返回含有数据选项的对象
    render: function (createElement) {
        alert(typeof createElement)
        // return createElement('h1')
        // return createElement({
        //     template:'<div>锄禾日当午</div>'
        // })
     var domFun = function () {
         return {
              template:'<div>锄禾日当午</div>'
         }
      }
     return createElement(domFun());
     }
});

9.3 render函数的第二个参数

Vue.component('child',{
// ----第二个参数可选,第二个参数是数据对象----只能是Object
    render: function (createElement) {
        return createElement({
            template:'<div>我是8px</div>'
        },{
          style: {
             fontSize: '8px'  
          }
        }
     })
    }
});

9.4 render函数的第三个参数

第三个参数也是可选=== String | Array 作为我们构建函数的子节点来使用

Vue.component('child',{
    // ----第三个参数是可选的,可以是 String | Array---代表子节点
    render: function (createElement) {
        return createElement('div',[
            createElement('h1','我是h1标题'),
            createElement('h6','我是h6标题')
        ])
    }
});

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

第三个 参数存的就是vnode
createElement(‘header’,header), 返回的就是vnode
var header = this.$slots.header; //–这返回的内容就是含有=vnode的数组

Vue.component('my-component',{
    render:function (createElement) {
        var header = this.$slots.header; //--这返回的内容就是含有=vnode的数组
        var main = this.$slots.default;
        var footer = this.$slots.footer;
        return createElement('div',[
            createElement('header',header),
            createElement('main',main),
            createElement('footer',footer)
        ]);
    }
})

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

<div id="app" >
    {{show}}
    <my-component :show="show"> </my-componen>
</div>

//需求:点击按钮切换美女图片

Vue.component('my-component',{
    props:['show'],
    render:function (createElement) {
        var imgsrc;
        if(this.show){
            imgsrc = 'img/001.jpg'
        }else{
            imgsrc = 'img/002.jpg'
        }
        return createElement('img',{
            attrs:{
                src: imgsrc
            },
            style:{
                width:'600px',
                height:'400px'
             }
        });
    }
})

9.7 v­-model在render函数中的使用

<!--<my-component :name="name" @input="showName"></my-component>-->

<my-component :name="name" v-model="name"></my-component>

<br> {{name}}
//需求:

var app = new Vue({
      el: '#app',
      data: {
        name: 'JACK'
      },
      components: {
        'my-component': {
          render: function(createElement){
            var _this = this
            return createElement('input',{
              domProps: {
                value: this.name
              },
              on: {
                input: function(event){
                  _this.$emit('input',event.target.value)
                }
              }
            })
          },
          props:['name']
        }
      },
      // methods: {
      //   showname: function(val){
      //     this.name = val
      //   }
      // }
    })

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

Vue.component('my-component',{
    render:function (createElement) {
        return createElement('div',this.$scopedSlots.default({
            text:'我是子组件传递过来的数据',
            msg: 'scopetext'
        }))
    }
})

9.9 函数化组件的应用

使用context的转变——­

this.text----context.props.text
this.$slots.default-----context.children

functional: true,表示该组件无状态无实例

  <div id="app">
    <my-component text="aaaa">

    </my-component>
  </div>


var app = new Vue({
      el: '#app',
      components: {
        'my-component': {
          functional: true,  // 函数化组件的应用,表示vue实例无状态,无实例(不能用 this)
          render: function(createElement,context){
            return createElement('button',{
              on: {
                click: function(){
                  console.log(context) // 表示本身组件
                  console.log(context.parent) //表示父组件,当下是vue实例
                  console.log(context.props.text) //表示本身组件的数据
                }
              }
            },'点击我')
          }
        }
      }
    })

相关文章

  • 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...

  • 第九章 render函数

    9.1 render函数初步了解 template下只允许有一个子节点 9.2 render函数的第一个参数 在r...

  • 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(虚拟节点)...

网友评论

      本文标题:第九章 render函数

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