1. 程式人生 > 其它 >淺談vue中render函式

淺談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/