Vue 學(xué)習(xí)筆記 render函數(shù)

Vue 學(xué)習(xí)筆記 九 、render函數(shù)

9.1 render函數(shù)初步了解

template下只允許有一個子節(jié)點

<div id="app">
            <child :level="level">
                klk
            </child>

        </div>
        
                    
<!--        <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> -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
//使用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']
})

            var app = new Vue({
                el: '#app',
                data: {level:3}
            })
        </script>

9.2 render函數(shù)的第一個參數(shù)

在render函數(shù)的方法中妹笆,參數(shù)必須是createElement,createElement的類型是function,render函數(shù)的第一個參數(shù)可以是 String | Object | Function

        <script>
Vue.component('child', {
            // ----第一個參數(shù)必選
            //String--html標(biāo)簽
            //Object---一個含有數(shù)據(jù)選項的對象
            //Function---方法返回含有數(shù)據(jù)選項的對象
            render: function (createElement) {
                alert(typeof createElement)
                                //return createElement('div')
                // return createElement('h1')
                // return createElement({
                // template:'<div>鋤禾日當(dāng)午</div>'
                // })
                var domFun = function () {
                    return {
                        template: '<div>鋤禾日當(dāng)午</div>'
                    }
                }
                return createElement(domFun());
            }
        });

            var app = new Vue({
                el: '#app',
                data: {level:3}
            })
        </script>

9.3 render函數(shù)的第二個參數(shù)

        <div id="app">

<child></child>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            Vue.component('child', {
                // ----第二個參數(shù)可選,第二個參數(shù)是數(shù)據(jù)對象----只能是Object
                render: function(createElement) {
                    return createElement({
                        template: '<div>我是龍的傳人</div>'
                    }, {
                        'class': {
                            foo: true,
                            baz: false
                        },
                        style: {
                            color: 'red',
                            fontSize: '16px'
                        },
                        //正常的html特性
                        attrs: {
                            id: 'foo',
                            src: 'http://baidu.com'
                        },
                        //用來寫原生的Dom屬性
                        domProps: {
                            // innerHTML: '<span style="color:blue;font-size: 18px">我是藍(lán)色</span>'
                        }
                    })
                }
            });

            var app = new Vue({
                el: '#app',
                data: {
                    level: 3
                }
            })
        </script>

9.3 render函數(shù)的第三個參數(shù)

第三個參數(shù)也是可選===String | Array—作為我們構(gòu)建函數(shù)的子節(jié)點來使用的

Vue.component('child', {
            // ----第三個參數(shù)是可選的,可以是 String | Array---代表子節(jié)點
            render: function (createElement) {
                return createElement('div', [
                    createElement('h1', '我是h1標(biāo)題'),
                    createElement('h6', '我是h6標(biāo)題')
                ])
            }
        });

9.4 this.$slots在render函數(shù)中的應(yīng)用

createElement(‘header’,header), 返回的就是VNODE
var header = this.$slots.header? //–這返回的內(nèi)容就是含有=VNODE的數(shù)組

            Vue.component('child', {
                render: function(createElement) {
                    var header = this.$slots.header;
                    var main = this.$slots.default;
                    var footer = this.$slots.footer;
                    return createElement('div', [
                        createElement('header', header),
                        createElement('main', main),
                        createElement('footer', footer)
                    ]);
                }
            });

9.5 在render函數(shù)中使用props傳遞數(shù)據(jù)

            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'
                        }
                    });
                    }
                
            })
            var app = new Vue({
                el: '#app',
                data: {
                    show: false
                },
                methods: {
                    switchShow() {
                        this.show = !this.show;
                    }
                }
            })

9.6 v--model在render函數(shù)中的使用

        <div id="app">
                    <my-component :name="name" v-model="name"></my-component>
            <br> {{name}}
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            Vue.component('my-component', {
                props: ['name'],
                render: function(createElement) {
                    var self = this; //指的就是當(dāng)前的VUE實例
                    return createElement('input', {
                            domProps: {
                                value: self.name
                            },
                        on: {
                            input: function(event) {
                                //此處的this指的是什么狸涌?指的就是window
//                              var a = this;
//                              console.log(a)
                                console.log(self)
                                self.$emit('input', event.target.value)
                            }
                        }
                    })
                }       
            })
            
            var app=new Vue({
                el:'#app',
                data:{
                    name:'',
                }
            })

9.7 作用域插槽在render函數(shù)中的使用

            Vue.component('my-component', {
                render:function(creatElement){
                    return creatElement('div',this.$scopedSlots.default({
                        text:'傳遞的信息',
                        msg:'scopetext'
                    }))
                }
            })
            

9.8 函數(shù)化組件的應(yīng)用

使用context的轉(zhuǎn)變

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

functional: true,表示該組件無狀態(tài)無實例

Demo

        <div id="app">
            <my-component value="hhh">
            </my-component>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            Vue.component('my-component', {
                functional: true, //當(dāng)前vue實例無狀態(tài),無實例(沒有this的概念)
                render: function(creatElement, context) {
                    return creatElement('button', {
                        on: {
                            click: function() {
                                console.log(context)
                                console.log(context.parent)
                                console.log(context.props.value)
                            }
                        }
                    }, '點擊學(xué)習(xí)context')
                },
                props: ['value']
            })

            var app = new Vue({
                el: '#app',
                data: {
                    msg: '父組件的msg'
                }
            })
        </script>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末最岗,一起剝皮案震驚了整個濱河市帕胆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌般渡,老刑警劉巖懒豹,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驯用,居然都是意外死亡脸秽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門蝴乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來记餐,“玉大人,你說我怎么就攤上這事薇正∑停” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵挖腰,是天一觀的道長雕沿。 經(jīng)常有香客問我,道長猴仑,這世上最難降的妖魔是什么审轮? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上断国,老公的妹妹穿的比我還像新娘贤姆。我一直安慰自己,他們只是感情好稳衬,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布霞捡。 她就那樣靜靜地躺著,像睡著了一般薄疚。 火紅的嫁衣襯著肌膚如雪碧信。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天街夭,我揣著相機與錄音砰碴,去河邊找鬼。 笑死板丽,一個胖子當(dāng)著我的面吹牛呈枉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埃碱,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼猖辫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砚殿?” 一聲冷哼從身側(cè)響起啃憎,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎似炎,沒想到半個月后辛萍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡羡藐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年贩毕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仆嗦。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辉阶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欧啤,到底是詐尸還是另有隱情,我是刑警寧澤启上,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布邢隧,位于F島的核電站,受9級特大地震影響冈在,放射性物質(zhì)發(fā)生泄漏倒慧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纫谅。 院中可真熱鬧炫贤,春花似錦、人聲如沸付秕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽询吴。三九已至掠河,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猛计,已是汗流浹背唠摹。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奉瘤,地道東北人勾拉。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像盗温,于是被迫代替她去往敵國和親藕赞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前幾天想學(xué)學(xué)Vue中怎么編寫可復(fù)用的組件肌访,提到要對Vue的render函數(shù)有所了解找默。可仔細(xì)一想吼驶,對于Vue的ren...
    kangaroo_v閱讀 116,061評論 13 171
  • 深入響應(yīng)式 追蹤變化: 把普通js對象傳給Vue實例的data選項惩激,Vue將使用Object.defineProp...
    冥冥2017閱讀 4,868評論 6 16
  • 一、了解Vue.js 1.1.1 Vue.js是什么蟹演? 簡單小巧风钻、漸進式、功能強大的技術(shù)棧 1.1.2 為什么學(xué)習(xí)...
    蔡華鵬閱讀 3,323評論 0 3
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,793評論 0 38
  • 孩子們今天就開始考試了酒请,考完明天就可以放假了骡技。但是學(xué)校這個學(xué)期還沒有說要開家長會,結(jié)合之前開過家長會的經(jīng)驗來看羞反,并...
    藤縣069黎獻(xiàn)清閱讀 1,908評論 7 8