Vue3函數式編程與Vue3 h函數

一、Vue3 h函數通信

Vue3 h函數是Vue3提供的一個函數式編程方式,可以使用它來創建Vue組件的虛擬節點(vnode),還可以在組件中更新數據。與Vue2的createElement函數相比,Vue3 h函數是一個更輕量,更易用的函數。h函數通常與Vue3的渲染函數(render)一起使用,在函數式編程中具有非常重要的作用。

h函數是一種虛擬節點的創建方式,在Vue3中,組件之間通信可以使用props和$emit方法,其他組件的數據可以通過props傳遞進來,當前組件的數據可以通過$emit方法向外發送。虛擬節點和h函數允許我們在組件之間直接通信,而不是通過props和$emit方法進行傳遞,提高了組件之間通信的效率。

我們來看一個簡單的例子:

  
    const App = {
      data() {
        return {
          count: 0
        }
      },
      render() {
        return h('div', {}, [
          h('h1', {}, '當前的計數器值是:' + this.count),
          h('button', {
            onClick: () => {
              this.count++
            }
          }, '加一')
        ])
      }
    }

    createApp(App).mount('#app')
  

在上述代碼中,我們通過Vue3 h函數創建了一個div元素,h函數的第一個參數是元素名稱,第二個參數是一個對象,其中可以傳遞元素的屬性,第三個參數是數組,其中可以傳遞虛擬節點。在數組中,我們傳遞了一個h函數創建的h1元素和一個button元素,button元素上可以通過onClick方法進行綁定事件,用來觸發count值的自增。

二、Vue3 h函數和createVNode

可以使用createVNode函數來創建單個的虛擬節點,也可以使用h函數創建一個虛擬節點的樹形結構。createVNode一個的參數可以是一個標籤字元串,或是一個組件對象。它的第二個參數是一個對象,可以傳遞元素的屬性,第三個參數是一個數組,用於傳遞子元素。createVNode和h函數的最大區別在於createVNode使用對象的方式來創建虛擬節點,而h函數使用函數的方式來進行創建。

接下來,我們通過一個展示列表的例子,來比對createVNode函數和h函數的不同:

  
    const App = {
      data() {
        return {
          list: [
            {
              name: '張三',
              age: 20
            },
            {
              name: '李四',
              age: 22
            },
            {
              name: '王五',
              age: 24
            }
          ]
        }
      },
      render() {
        const listItems = this.list.map(item => {
          return createVNode('li', {
            key: item.name
          }, [
            createVNode('span', {}, item.name),
            createVNode('span', {}, item.age)
          ])
        })
        return createVNode('ul', {}, listItems)
      }
    }
    
    createApp(App).mount('#app')
  

上述代碼中,我們首先通過createVNode函數創建li元素,並傳遞了元素的屬性和子元素,然後通過map函數遍歷了name和age,得到一個li元素的數組,最後再通過createVNode函數創建ul元素,並傳遞了子元素為li數組。createVNode函數的使用方式和createElement函數類似,但是我們可以看到使用方式更為簡潔。

接下來,我們使用h函數來創建同樣的列表:

  
    const App = {
      data() {
        return {
          list: [
            {
              name: '張三',
              age: 20
            },
            {
              name: '李四',
              age: 22
            },
            {
              name: '王五',
              age: 24
            }
          ]
        }
      },
      render() {
        const listItems = this.list.map(item => {
          return h('li', {
            key: item.name
          }, [
            h('span', {}, item.name),
            h('span', {}, item.age)
          ])
        })
        return h('ul', {}, listItems)
      }
    }
    
    createApp(App).mount('#app')
  

通過對比可以看到,createVNode函數和h函數都可以用來創建虛擬節點,但是它們的使用方式是不同的。createVNode函數的使用方式更加簡潔明了,h函數的使用方式則更加函數式,區別在於我們對於節點的描述方式有所不同。我們需要根據實際情況來選擇使用哪種方式。

三、Vue3 h函數源碼

Vue3的源碼是通過TypeScript編寫的,h函數的定義方式如下:

  
    import { createVNode } from './vnode'

    export function h(type, propsOrChildren, children) {
      const l = arguments.length
      if (l === 2) {
        if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
          if (isVNode(propsOrChildren)) {
            return createVNode(type, null, [propsOrChildren])
          }
          return createVNode(type, propsOrChildren)
        }
        return createVNode(type, null, propsOrChildren)
      } else {
        if (l === 3 && isVNode(children)) {
          if (isArray(children)) {
            children.unshift(propsOrChildren)
          } else {
            children = [propsOrChildren, children]
          }
        } else if (isNumber(children) || isString(children)) {
          children = [children]
        }
        return createVNode(type, propsOrChildren, children)
      }
    }
  

從源碼中我們可以看到,h函數的參數是不固定的,可以接受1到3個參數。如果只傳遞了兩個參數,那麼第二個參數如果是一個對象,則代表元素的屬性信息,如果是一個數組,則代表元素的子節點信息。第三個參數則代表元素的子節點信息。由於在h函數中,我們將props和children參數都傳遞給了createVNode函數,因此在使用h函數創建虛擬節點時,createVNode函數會提供更多參數的選項。

四、Vuex函數和Vue3函數式

Vue3的函數式編程提供了新的方式來共享組件狀態和邏輯。Vue3中的一個設計重心是讓狀態管理更加流暢和自然,因此在引入Vuex之後,Vue3也提供了一個函數式API,用於管理共享狀態。

下面是使用Vue3函數式API的代碼示例:


import { provide, reactive, computed, inject } from 'vue'

const storeSymbol = Symbol()

function useProvideStore() {
const state = reactive({
count: 0
})

const getters = computed(() => {
return {
doubleCount: state.count * 2
}
})

const mutations = {
increment(state) {
state.count++
}
}

provide(storeSymbol, {
state,
getters,
mutations
})
}

function useInjectStore() {
const store = inject(storeSymbol)

function increment() {
store.mutations.increment(store.state)
}

return {
state: store.state,
getters: store.getters,
increment
}
}

// 使用useProvideStore和useInjectStore方法,在父組件中共享狀態
const parentComponent = {
setup() {
useProvideStore()
return {}
},
template: `

`,
components: {
ChildComponent
}
}

const ChildComponent = {
setup() {
const { state, getters, increment } = useInjectStore()
return {
count: state.count,
doubleCount: getters.doubleCount,
increment
}
},
template: `

當前計數器值:{{count}}

當前計數器的雙倍值:{{doubleCount}}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/180079.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:10
下一篇 2024-11-22 05:10

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29

發表回復

登錄後才能評論