Vue中渲染函數的使用

Vue中渲染函數的使用

      • 1. render函數
      • 2. h()的使用
      • 3. render函數和h函數的區分

  • vue中的渲染函數:
    • 1.template
    • 2.render函數
    • 3.jsx -> js extension(jsx也是編譯成render函數可編程能力更強)

1. render函數

  • 1.1. 認識h函數

    • 1.1.1. Vue推薦在絕大多數情況下使用模板來創建HTML,一些特殊的場景,真的需要javaScript的完全編程的能力,
      這個時候可以使用渲染函數,它比模板更接近編譯器。
    • 1.1.2. VNodeVDom的概念
      • Vue在生成真實DOM之前,會將我們的節點轉換成VNode, 而VNode組合在一起形成一棵樹結構,就是虛擬DOM(VDOM);

      • 事實上,之前編寫的template中的HTML最終也是使用渲染函數生成對應的VNode;

      • 如果想重復利用JavaScript的編程能力,可以編寫createVNode函數,生成對應的VNode;

      • Vue底層渲染流程如下圖:

        <!-- HTML模板 -->            <!--  h函數 -->           <!--  虛擬節點VNode -->         <!--  真實DOM -->
        <template> <div>                      createVNode()                     VNode                          真實DOM<h2></h2>                createVNode()                   ↙      ↘                    ↙          ↘  <p></p>                  createVNode()                 VNode     VNode               h2             p  </div>
        </template>
        

        在這里插入圖片描述

  • 1.2. 使用h函數

    • h() 函數是一個用于創建vnode的一個函數;
    • 其實更準確的命名是createVNode()函數,但是為了簡便在Vue將之簡化為h()函數(本質上是createVNode()函數)

2. h()的使用

  • h()函數接收三個參數:tag, props, children
      { String | Object | Function } tag                             {  Object } props                                    { String | Array | Object } children一個HTML標簽、一個組件、一個異步組件、或                          與attribute、prop 和事件相對應的對象                    子 VNodes, 使用`h()` 構建一個函數式組件                                                  會在模板中使用                                         使用字符串獲取 `文本 VNode``有插槽的對象`必需的                                                         可選的                                                 可選的例如:'div'                                                    { }                                                    [ 'some text comes first',h('h1', null, '哈哈哈哈'),h(myComponent, {someProp: 'fooBar'})]
  • 注意事項:
    • 如果沒有props, 通常可以將children作為第二個參數傳入;
    • 如果會產生歧義,可以將null作為第二個參數傳入,將children作為第三個參數傳入;
  • HTML轉成VNode的調用案例:
      <div class="abc" title='內容'>h2p</div>// 轉成VNode:createVNode('div', { class: 'abc', title: '內容' }[createVNode('h2', null, '我是標題'),createVNode('p', { }, '我是內容')])
  • createVNode函數的調用如下圖;
    在這里插入圖片描述

3. render函數和h函數的區分

  • 流程:render函數是放在對應的組件選項里面的,當渲染組件的時候,會調用render函數,一旦調用就會返回的VNode,為了去創建一系列的VNode, 所以會調用h函數并渲染成HTML

  • 區分:render函數是寫到組件里面的,而h函數(createVNode函數)才是真正去創建VNode的

    1. render函數使用
      1. Options API的用法,使用render函數選項
      • 代碼如下:
          <script>import { h } from 'vue'import Home from './Home.vue'export default {data () {return {counter: 0}},render () {console.log('this===', this);return h('div', { class: 'app' } , [h('h2', { class: 'title' }, `當前計數:${ this.counter }`),h('button', { onClick: this.increment }, '+1'),h('button', { onClick: this.decrement }, '-1'),// 在render函數中,引入其他組件不需要注冊(components), 在template模板中需要注冊h(Home)])},methods: {increment () {this.counter++},decrement() {this.counter--}}}</script>
        
      1. Composition API的用法
      • 2.1. setup函數的使用,
        • 關鍵點:setup()中返回一個函數,函數中返回VNode
        • setup函數默認返回一個對象 => return { counter, increment, decrement }
        • setup函數中使用render函數,不要返回對象,setup本身需要是返回一個函數類型, 箭頭函數中再去返回VNode
        • 代碼如如下:
          <script>import { h, ref } from 'vue'import Home from './Home.vue'export default {setup () {const counter = ref(0)const increment = () => {counter.value++}const decrement = () => {counter.value--}// setup函數默認返回一個對象 => return { counter, increment, decrement }// setup函數中使用render函數,不要返回對象,返回一個函數, 箭頭函數中再去返回VNodereturn () => {return h('div', {className: 'app' }, [h('h2', { className: 'title' }, `當前計數: ${ counter.value }`),h('button', { onClick: increment }, '+1'),h('button', { onClick: decrement} , '-1'),h(Home)])}// return () => h('div', {className: 'app' }, [//   h('h2', { className: 'title' }, `當前計數: ${ counter.value }`),//   h('button', { onClick: increment }, '+1'),//   h('button', { onClick: decrement} , '-1'),//   h(Home)// ])}}</script>
        
      • 2.2. setup語法糖的使用
        • 在setup中義render函數
        • 在template模板中使用render標簽
        • 代碼如下;
            <template><render/></template><script setup>import { ref, h } from 'vue'import Home from './Home.vue'const counter = ref(0)const increment = () => {counter.value++}const decrement = () => {counter.value--}// 使用render函數,是為了使用js的方式去編寫代碼,基本上很少使用// 如果依然想使用JS的方式編寫,可以使用JSX語法,JSX本質會轉化成render函數// JSX的優點:1. 快速的編寫元素的結構  2. 完全可以利用JS編程能力const render = () => h('div', {className: 'app' }, [h('h2', { className: 'title' }, `當前計數: ${ counter.value }`),h('button', { onClick: increment }, '+1'),h('button', { onClick: decrement} , '-1'),h(Home)])</script>
      1. render函數的使用推薦
      • 使用render函數,是為了使用js的方式去編寫代碼,基本上很少使用
      • 如果依然想使用JS的方式編寫,可以使用JSX語法,JSX本質會轉化成render函數
        • JSX的優點
            1. 快速的編寫元素的結構
            1. 完全可以利用JS編程能力

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86340.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86340.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86340.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【氮化鎵】GaN HMETs器件物理失效分析進展

2021 年 5 月,南京大學的蔡曉龍等人在《Journal of Semiconductors》期刊發表了題為《Recent progress of physical failure analysis of GaN HEMTs》的文章,基于多種物理表征技術及大量研究成果,對 GaN HEMTs 的常見失效機制進行了系統分析。文中先介紹失效分析流程,包括使…

每日Prompt:治愈動漫插畫

提示詞 現代都市治愈動漫插畫風格&#xff0c;現代女子&#xff0c;漂亮&#xff0c;長直發&#xff0c;20歲&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;氣質&#xff0c;清純現代都市背景下&#xff0c;夕陽西下&#xff0c;一位穿著白色露臍短袖&#xff0c;粉色工裝褲…

2025年牛客網秋招/社招高質量 Java 面試八股文整理

Java 面試 不論是校招還是社招都避免不了各種面試。筆試&#xff0c;如何去準備這些東西就顯得格外重要。不論是筆試還是面試都是有章可循的。關鍵在于理解企業的需求&#xff0c;明確自己的定位&#xff0c;以及掌握一定的應試技巧。 筆試部分&#xff0c;通常是對基礎知識、…

在UI界面內修改了對象名,在#include “ui_mainwindow.h“沒更新

?原因?&#xff1a;未重新編譯UI文件?? Qt的UI文件&#xff08;.ui&#xff09;需要通過??uic工具&#xff08;Qt的UI編譯器&#xff09;??生成對應的ui_*.h頭文件。如果你在Qt Designer中修改了對象名&#xff0c;但沒有??重新構建&#xff08;Rebuild&#xff09;…

前端獲取接口數據流程

一、Free-Table組件分析 <free-table v-show"showTable" v-model:page"params.pageNum" 雙向綁定當前頁大小&#xff0c;支持動態更新 v-model:limit"params.pageSize" 雙向綁定每頁大小&#xff0c;支持動態更新 v-loading&…

Linux系統防火墻之iptables

防火墻在一個系統中就好像是一個國家的軍隊&#xff0c;所謂國無軍不安&#xff0c;在系統中也是這樣&#xff0c;防火墻可以保護系統被別人攻擊&#xff0c;過濾垃圾流量等&#xff0c;那么今天我們就來了解一下Linux系統中的一種防火墻iptables。 目錄 iptables概述 規則 …

vue項目使用svg圖標

下面是在 Vue 3 項目中完整引入和使用 vite-plugin-svg-icons 的步驟 1、安裝插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…

元器件基礎學習筆記——結型場效應晶體管 (JFET)

場效應晶體管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;簡稱場效應管&#xff0c;是一種三端子半導體器件&#xff0c;它根據施加到其其中一個端子的電場來控制電流的流動。與雙極結型晶體管 &#xff08;BJT&#xff09; 不同&#xff0c;場效應晶體管 …

拆解實戰案例:電商ERP管理系統從需求到原型全流程設計

ERP即企業資源計劃系統&#xff0c;全稱為Enterprise Resource Planning&#xff0c;其核心在于運用系統化管理思想&#xff0c;為企業員工及管理層構建一個提供決策支持的管理系統平臺。它匯聚貫通企業各個業務模塊產生的數據流&#xff0c;實現資源配置與業務流程高效協同。尤…

【面試題】如何保證MQ的消息不丟失、不重復

文章目錄 一、消息丟失問題的解決方案&#xff08;一&#xff09;發送端丟失&#xff08;二&#xff09;存儲端丟失1. 同步刷盤2. Broker 集群 &#xff08;三&#xff09;消費端丟失 二、消息重復問題的解決方案&#xff08;一&#xff09;唯一鍵約束&#xff08;二&#xff0…

ArcGIS Maps SDK for JavaScript:使用圖層過濾器只顯示FeatureLayer的部分要素

文章目錄 引言1 需求場景分析2精確過濾實現方案2.1 基礎過濾語法2.2 動態過濾實現 3 模糊查詢進階技巧3.1 LIKE操作符使用3.2 特殊字段處理 4. 性能優化與注意事項4.1 服務端vs客戶端過濾4.2 最佳實踐建議 5 常見問題解答 引言 在地圖應用開發中&#xff0c;圖層過濾是常見的需…

day25-計算機網絡-3

1. DNS解析流程 windows host文件是否配置域名對應的ip查詢本地DNS緩存是否有這個域名對應的ip詢問本地DNS&#xff08;網卡配置的&#xff09;是否知曉域名對應的ip本地DNS訪問根域名解析服務器&#xff0c;但是根DNS只有頂級域名的記錄&#xff0c;根告訴我們.cn頂級域名的D…

中達瑞和SHIS高光譜相機在黑色水彩筆墨跡鑒定中的應用

在文件檢驗與物證溯源領域&#xff0c;對書寫材料&#xff08;如墨水&#xff09;進行快速、準確、無損的鑒別至關重要。由陳維娜等人撰寫的《高光譜技術結合化學計量法鑒別黑色水彩筆墨跡》&#xff08;發表于《光譜學與光譜分析》2023年第7期&#xff09;利用中達瑞和SHIS凝采…

華為OD機考 - 水仙花數 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存儲每位數的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

Go 標準庫 encoding/gob 快速上手

文章目錄 1.簡介2.基礎3.類型和值4.編碼細節5.安全6.主要函數6.1 注冊1. 接口的底層類型在運行時才能確定2.類型標識的唯一性3.安全性與顯式意圖4.與結構體的自動處理對比5.示例分析為什么不能像 JSON 那樣自動處理&#xff1f;總結 6.2 編碼6.3 解碼 7.示例7.1 編解碼結構體7.…

Ubuntu ifconfig 查不到ens33網卡

BUG&#xff1a;ifconfig查看網絡配置信息&#xff1a; 終端輸入以下命令&#xff1a; sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start - service network - manager stop &#xff1a;停止…

算法-數論

C-小紅的數組查詢&#xff08;二&#xff09;_牛客周賽 Round 95 思路&#xff1a;不難看出a數組是有循環的 d3,p4時&#xff0c;a數組&#xff1a;1、0、3、2、1、0、3、2....... 最小循環節為4&#xff0c;即最多4種不同的數 d4,p6時&#xff0c;a數組&#xff1a;1、5、3、…

CSS中text-align: justify文本兩端對齊

text-align: justify; 是 CSS 中用于控制文本對齊方式的屬性值&#xff0c;它的核心作用是讓文本兩端對齊&#xff08;分散對齊&#xff09;&#xff0c;使段落左右邊緣整齊排列。以下是詳細解析&#xff1a; 作用效果 均勻分布間距 瀏覽器會自動調整單詞/字符之間的間距&#…

WebFuture:啟動數據庫提示: error while loading shared libraries: libaio.so.1問題處理

問題分析 當出現./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory這個錯誤時&#xff0c;這意味著 MySQL 服務器&#xff08;mysqld&#xff09;在啟動過程中無法找到libaio.so.1這個共享庫文件。li…

74常用控件_QSpacerItem的使用

目錄 代碼?例: 創建?組左右排列的按鈕. Spacer 使?布局管理器的時候, 可能需要在控件之間, 添加?段空?. 就可以使? QSpacerItem 來表?. 核?屬性 屬性說明width寬度height高度hData水平方向的 sizePolicy - QSizePolicy::Ignored&#xff1a;忽略控件的尺寸&#xf…