render函數(shù)

render 函數(shù)的作用

  • 簡(jiǎn)單的說,在vue中使用模板HTML語(yǔ)法組建頁(yè)面,使用render函數(shù)可以用js語(yǔ)言來構(gòu)建DOM

  • 因?yàn)関ue是虛擬DOM,所以在拿到template模板時(shí)也要轉(zhuǎn)譯成VNode的函數(shù),而用render函數(shù)構(gòu)建DOM,vue就免去了轉(zhuǎn)譯的過程。

  • 當(dāng)使用render函數(shù)描述虛擬DOM時(shí),vue提供一個(gè)函數(shù),這個(gè)函數(shù)是就構(gòu)建虛擬DOM所需要的工具。官網(wǎng)上給他起了個(gè)名字叫createElement。還有約定的簡(jiǎn)寫叫h,

栗子:根據(jù) data 中 level 的值,用不同標(biāo)題標(biāo)簽顯示文本:

<div id="app">
    <child-component :level="level">
      哆啦A夢(mèng)
    </child-component>
</div>

Vue.component('child-component', {
  props: ['level'],
  template: `<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>`
})

var app = new Vue({
  el: '#app',
  data: {
    level: 1
  }
})

將 level 的值改成 1,會(huì)渲染 template 中的 h1 標(biāo)簽。

實(shí)際開發(fā)中可能會(huì)把 template 寫得巨長(zhǎng);使用 render 函數(shù)來實(shí)現(xiàn)上面的 demo:

<div id="app">
    <child :level="level">
        哆啦A夢(mèng)
    </child>
</div>


<script>
    // 使用render函數(shù)進(jìn)行定義組件
    Vue.component('child', {
        render: function (createElement) {
            return createElement('h' + this.level,
                this.$slots.default);
        },
        props: ['level']
    })

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

渲染效果與上面使用 template 一致。
使用 render函數(shù) 比 template 要簡(jiǎn)潔很多。

render函數(shù)用法

  • render函數(shù)可以接收 createElement 作為參數(shù),并且必須是 createElement;
  • createElement 也是一個(gè)函數(shù);
  • createElement 可以傳三個(gè)參數(shù)(上面只傳了兩個(gè));
    第一個(gè)參數(shù)必需,可以是 String / Object / Function 類型;
    第二個(gè)參數(shù)可選,只能是 Object 類型;
    第三個(gè)參數(shù)可選,可以是 String / Array 類型。

createElement 的第一個(gè)參數(shù)

  • 第一個(gè)參數(shù)必選
  • 可以是string - html標(biāo)簽
  • 可以是object -- 一個(gè)含有數(shù)據(jù)選項(xiàng)的對(duì)象
  • 可以是function ---方法返回含有數(shù)據(jù)選項(xiàng)的對(duì)象
<body>
    <div id="app">
        <child></child>
    </div>


<script>
    Vue.component('child', {
        render: function (createElement) {
            // 1. 傳 String
            return createElement('h1') // 創(chuàng)建一個(gè) HTML 標(biāo)簽

            // 2. 傳 Object
            return createElement({ // 創(chuàng)建一個(gè)含有數(shù)據(jù)選項(xiàng)的對(duì)象
                template: '<h1>你好</h1>'
            })

            // 3. 傳 Function(函數(shù)最終要 return 對(duì)象,所以本質(zhì)上還是傳的對(duì)象)
            return createElement(function () {
                return {
                    template: '<h1>你好</h1>'
                }
            }()) // 函數(shù)要調(diào)用一下,否則不起效果
        }
    })

var app = new Vue({
    el: '#app',
    data: {

    }
})
</script>

createElement 的第二個(gè)參數(shù)

  • 第二個(gè)參數(shù)可選,只能是 Object 類型,Object 中可以設(shè)置元素的一些屬性。
    <div id="app">
        <child></child>
    </div>

    <script>
        Vue.component('child', {
            //第二個(gè)參數(shù)可選,第二個(gè)參數(shù)是數(shù)據(jù)對(duì)象
            render: function (createElement) {
                return createElement({
                    template: '<div>花間提壺方大廚</div>'
                }, {
                    class: {
                        foo: true,
                        baz: false
                    },
                    style: {
                        color: 'red',
                        fontSize: '16px'
                    },
                    //正常的 html 特性
                    attrs: {
                        id: "foo",
                        src: 'http://www.baidu.com'
                    }
                })
            }
        })
        var app = new Vue({
            el: '#app',

        })
    </script>

createElement 的第三個(gè)參數(shù)

  • 第三個(gè)參數(shù)可選, 可以是 String | Array ---代表子節(jié)點(diǎn)
    <div id="app">
        <child></child>
    </div>

    <script>
        Vue.component('child', {
            //第三個(gè)參數(shù)可選, 可以是 String | Array ---代表子節(jié)點(diǎn)
            render: function (createElement) {
                return createElement('div', [
                    createElement('h2', '我是h2標(biāo)題'),
                    createElement('h5', '我是h5標(biāo)題')
                ])
            }
        })
        var app = new Vue({
            el: '#app',
        })
    </script>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容