본문 바로가기
front/vue

[Vue] h()

by juniKang 2022. 7. 30.

h()

가상 돔 노드를 만드는 함수이다.

 

타입

// full signature
function h(
  type: string | Component,
  props?: object | null,
  children?: Children | Slot | Slots
): VNode

// omitting props
function h(type: string | Component, children?: Children | Slot): VNode

type Children = string | number | boolean | VNode | null | Children[]

type Slot = () => Children

type Slots = { [name: string]: Slot }

Types are simplified for readability

 

Details

첫번째 아규먼트는 string ('div'같은 native element) 나 뷰 컴포넌트가 될 수 있다. 두 번째 아규먼트는 넘겨지게될 props이며, 세 번째는 children이다.

 

컴포넌트 vnode를 만들 때, children은 slot 함수로서 넘겨지게 된다. 하나의 slot 함수는 오직 default slot만 사용할 때 넘겨질 수 있는 반면, 여러개의 slots들은 slot 함수의 객체로서 넘겨져야만 한다.

 

편리함을 위해, props 아규먼트는 children이 slots가 아닐 때는 생략될 수 있다.

 

Example

native element 예제:

import { h } from 'vue'

// 타입을 제외한 모든 아규먼트들은 생략가능하다.
h('div')
h('div', { id: 'foo' })

// 애트리뷰트와 프로퍼티들 모두 props로 사용할 수 있는데,
// 뷰는 자동적으로 올바르게 할당시킨다.
h('div', {class: 'bar', innerHTML: 'hello' })

// class와 style은 템플릿에서 사용할 때처럼,
// 객체/ 배열을 지원한다.
h('div', {class: [foo, {bar}], style: { color: 'ref' } })

// 이벤트 리스너들은 'onXxx' 형식으로 넘긴다.
h('div', { onClick: () => {} })

// children으로 문자열도 가능하다.
h('div', { id: 'foo' }, 'hello')

// props가 없을때는 생략할 수 있다.
h('div', 'hello')
h('div', [h('span', 'hello')])

// children 배열은 vnodes와 문자열을 섞어서 사용할 수 있다.
h('div', ['hello', h('span', 'hello')])

컴포넌트 예제:

import Foo from './Foo.vue'

// props 넘기기
h(Foo, {
  // some-prop="hello" 와 동일
  someProp: 'hello',
  // @update="() => {}" 와 동일
  onUpdate: () => {}
})

// single default slot 을 넘길 때
h(Foo, () => 'default slot')

// named slot을 넘길 때
// slots 오브젝트가 props로 간주되는 것을 피하기 위해
// 두 번째 아규먼트로 null이 필요하다.
h(MyComponent, null, {
  default: () => 'default slot',
  foo: () => h('div', 'foo'),
  bar: () => [h('span', 'one'), h('span', 'two')]
})

'front > vue' 카테고리의 다른 글

[vue] cloneVNode()  (0) 2022.07.30
[vue]mergeProps()  (0) 2022.07.30
[Vue] defineComponent()  (0) 2022.07.30
[Vue] Custom Directives  (0) 2022.07.29
[vue3] checkbox specification  (2) 2022.07.25

댓글