第九章 render函数

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) //表示本身组件的数据
                }
              }
            },'点击我')
          }
        }
      }
    })
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Vue.js 2.x与vue.js 1.x最大的区别就在于2.x使用了Virtual Dom(虚拟Dom)来更新D...
    六个周阅读 941评论 0 11
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 4,989评论 0 29
  • 前几天想学学Vue中怎么编写可复用的组件,提到要对Vue的render函数有所了解。可仔细一想,对于Vue的ren...
    kangaroo_v阅读 115,829评论 13 171
  • 9.1 render函数初步了解 template下只允许有一个子节点实现一个属性level值(1-3)的更改对应...
    sweetBoy_9126阅读 169评论 0 0
  • 回忆 首先,render函数中手写h=>h(app),new Vue()实例初始化init()和原来一样。$mou...
    LoveBugs_King阅读 2,206评论 1 2