淺談vue中render函式
官網內容:https://cn.vuejs.org/v2/guide/render-function.html
vue 推薦在絕大多數情況下使模板來建立 HTML 。就是我們都會吧頁面的結構寫在 template 中,然後再通過 vue 將我們的程式碼轉換成虛擬DOM ,相比對真實DOM ,虛擬 DOM 是通過 js 程式碼處理的,所以消耗的效能相對較小,當然大部分情況下使用 template 建立我們的 HTML 是可以的;但是在有些場景下,我們真的需要通過 js 的完全程式設計的能力來完成時,就可以用到 render 函式。
render 函式的作用就是返回一個 虛擬 DOM ,將該虛擬 DOM 渲染成真實的 DOM
基礎用法
render: function(createElement){ return createElement() }
// createElement 引數
// 在 createElement 函式中使用模板中的那些功能。這裡是 createElement 接受的引數:
createElement(
// {String | Object | Function}
// 一個 HTML 標籤名、元件選項物件,或者resolve 了上述任何一種的一個 async 函式。
// 必填項。
'div',
// {Object} 參考 官網文件深入資料物件
// 一個與模板中 attribute 對應的資料物件。可選。
{
attrs: { title: this.title },
// 接受一個字串、物件,或物件組成的陣列
style: { color: 'red', fontSize: '14px' },
},
// {String | Array}
// 子級虛擬節點 (VNodes),由 `createElement()` 構建而成,
// 也可以使用字串來生成“文字虛擬節點”。可選。
[
'先寫一些文字',
createElement('h1', '一則頭條'),
createElement(MyComponent, {
props: {
someProp: 'foobar'
}
})
]
)
render 函式有兩個引數
export default { name: "yjyRender", props: { row: Object, index: Number, render: Function, }, // render作用:會return一個虛擬dom,return什麼該元件就渲染什麼 render: (h, ctx) => { // 第二個引數context儲存了一些其他元件傳過來的資料 // console.log('context', context) const params = { row: ctx.props.row, index: ctx.props.index, }; return ctx.props.render(h, params); // h(標籤名/元件,{虛擬dom配置},子集:子虛擬dom,也是虛擬dom節點資訊,支援字串與陣列) // return h('h3', { class: 'abc' }, [h('h4', { class: 'abc2' }, '我是h4')]) }, };
第一個引數 h 是 createElement 的縮寫,其中有三個引數,在上面已介紹。
第二個引數 context 可以拿到外部元件傳進來的資料,如 prop、slots等
render方法的實質就是生成template模板;
render函式生成的內容相當於template的內容,所以使用render函式時,在.vue檔案中需要先把template標籤去掉。只保留邏輯層。
意思很明白,在腳手架生成的專案中,.vue檔案是通過template渲染的虛擬dom,template底層也是使用的render函式。一個元件最終的模板只能有一個,所以如果在專案中(.vue檔案)使用render函式,就要去掉template標籤;並且你只能作為元件來使用,不可能整個頁面都用render函式js手寫頁面吧~
如此,便解決了我莫大的疑問。
案例參考
https://blog.csdn.net/weixin_45844049/article/details/114277643?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-114277643-blog-121456284.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.2&utm_relevant_index=4
https://www.shuzhiduo.com/A/kjdwaQMAJN/