Render Functions & JSX â
Vue āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻā§āώā§āϤā§āϰ⧠āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻā§āĻŽāĻĒā§āϞā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻā§āϝāĻŧāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻŽāύ āĻĒāϰāĻŋāϏā§āĻĨāĻŋāϤāĻŋ āϰāϝāĻŧā§āĻā§ āϝā§āĻāĻžāύ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϝāĻžāĻāĻŋāĻ āĻļāĻā§āϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āϏā§āĻāĻžāύā§āĻ āĻāĻŽāϰāĻž āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ DOM āĻāĻŦāĻ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύā§āϰ āϧāĻžāϰāĻŖāĻžāϝāĻŧ āύāϤā§āύ āĻšāύ, āϤāĻžāĻšāϞ⧠āĻĒā§āϰāĻĨāĻŽā§ āϰā§āύā§āĻĄāĻžāϰāĻŋāĻ āĻŽā§āĻāĻžāύāĻŋāĻāĻŽ āĻ āϧā§āϝāĻžāϝāĻŧāĻāĻŋ āĻĒāĻĄāĻŧāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻžāĨ¤
Basic Usage â
Creating Vnodes â
Vue vnodes āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ h()
āĻĢāĻžāĻāĻļāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§:
js
import { h } from 'vue'
const vnode = h(
'div', // type
{ id: 'foo', class: 'bar' }, // props
[
/* children */
]
)
h()
hyperscript-āĻāϰ āĻāύā§āϝ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ - āϝāĻžāϰ āĻŽāĻžāύ⧠"āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϝāĻž HTML (āĻšāĻžāĻāĻĒāĻžāϰāĻā§āĻā§āϏāĻ āĻŽāĻžāϰā§āĻāĻāĻĒ āĻāĻžāώāĻž) āϤā§āϰāĻŋ āĻāϰā§"āĨ¤ āĻāĻ āύāĻžāĻŽāĻāĻŋ āĻ
āύā§āĻ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ DOM āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻĻā§āĻŦāĻžāϰāĻž āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻāύāĻā§āύāĻļāύ āĻĨā§āĻā§ āĻāϤā§āϤāϰāĻžāϧāĻŋāĻāĻžāϰāϏā§āϤā§āϰ⧠āĻĒā§āϰāĻžāĻĒā§āϤāĨ¤ āĻāĻāĻāĻŋ āĻāϰāĻ āĻŦāϰā§āĻŖāύāĻžāĻŽā§āϞāĻ āύāĻžāĻŽ āĻšāϤ⧠āĻĒāĻžāϰ⧠createVNode()
, āĻāĻŋāύā§āϤ⧠āĻāĻāĻāĻŋ āĻā§āĻ āύāĻžāĻŽ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āϝāĻāύ āĻāĻĒāύāĻžāĻā§ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ⧠āĻ
āύā§āĻāĻŦāĻžāϰ āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāϞ āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤
h()
āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āĻŦ āύāĻŽāύā§āϝāĻŧ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§:
js
// all arguments except the type are optional
h('div')
h('div', { id: 'foo' })
// both attributes and properties can be used in props
// Vue automatically picks the right way to assign it
h('div', { class: 'bar', innerHTML: 'hello' })
// props modifiers such as `.prop` and `.attr` can be added
// with `.` and `^` prefixes respectively
h('div', { '.name': 'some-name', '^width': '100' })
// class and style have the same object / array
// value support that they have in templates
h('div', { class: [foo, { bar }], style: { color: 'red' } })
// event listeners should be passed as onXxx
h('div', { onClick: () => {} })
// children can be a string
h('div', { id: 'foo' }, 'hello')
// props can be omitted when there are no props
h('div', 'hello')
h('div', [h('span', 'hello')])
// children array can contain mixed vnodes and strings
h('div', ['hello', h('span', 'hello')])
āĻĢāϞāϏā§āĻŦāϰā§āĻĒ vnode āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻā§āϤāĻŋ āĻāĻā§:
js
const vnode = h('div', { id: 'foo' }, [])
vnode.type // 'div'
vnode.props // { id: 'foo' }
vnode.children // []
vnode.key // null
āĻŦāĻŋāĻāĻĻā§āϰāĻ
āϏāĻŽā§āĻĒā§āϰā§āĻŖ VNode
āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻ
āύā§āϝāĻžāύā§āϝ āĻ
āύā§āĻ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϰāϝāĻŧā§āĻā§, āϤāĻŦā§ āĻāĻāĻžāύ⧠āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻŦā§āϝāϤā§āϤ āĻ
āύā§āϝ āĻā§āύ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āύāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋ āĻĻā§āĻĸāĻŧāĻāĻžāĻŦā§ āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻšāϞ⧠āĻāĻāĻŋ āĻ
āύāĻŋāĻā§āĻāĻžāĻā§āϤ āĻāĻžāĻā§āĻāύ āĻāĻĄāĻŧāĻžāϝāĻŧāĨ¤
Declaring Render Functions â
Composition API āĻāϰ āϏāĻžāĻĨā§ āĻā§āĻŽāĻĒā§āϞā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, setup()
āĻšā§āĻā§āϰ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύ āĻā§āĻŽāĻĒā§āϞā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āϰāĻāĻžāĻļ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āϝāĻžāĻāĻšā§āĻ, āĻāĻŽāϰāĻž āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āϏāϰāĻžāϏāϰāĻŋ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰāĻŋ:
js
import { ref, h } from 'vue'
export default {
props: {
/* ... */
},
setup(props) {
const count = ref(1)
// return the render function
return () => h('div', props.msg + count.value)
}
}
āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύāĻāĻŋ āϏā§āĻāĻāĻĒ()
āĻāϰ āĻāĻŋāϤāϰ⧠āĻā§āώāĻŖāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϤāĻžāĻ āĻāĻāĻŋ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻāĻāĻžāĻŦā§āĻ āĻĒā§āϰāĻĒāϏ āĻāĻŦāĻ āĻāĻāĻ āϏā§āϝā§āĻā§ āĻā§āώāĻŋāϤ āϝā§āĻā§āύ⧠āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻžāĻļā§āϞ āĻ
āĻŦāϏā§āĻĨāĻžāϰ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āϰāϝāĻŧā§āĻā§āĨ¤
āĻāĻāĻāĻŋ āĻāĻāĻ āĻāύā§āĻĄ āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ, āĻāĻĒāύāĻŋ āϏā§āĻā§āϰāĻŋāĻ āĻŦāĻž āĻ ā§āϝāĻžāϰā§āĻ āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύ:
js
export default {
setup() {
return () => 'hello world!'
}
}
js
import { h } from 'vue'
export default {
setup() {
// use an array to return multiple root nodes
return () => [
h('div'),
h('div'),
h('div')
]
}
}
TIP
āϏāϰāĻžāϏāϰāĻŋ āĻŽāĻžāύ āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻĢā§āϰāϤ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ! setup()
āĻĢāĻžāĻāĻļāύ āĻĒā§āϰāϤāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŦāĻžāϰ āĻāϞ āĻāϰāĻž āĻšāϝāĻŧ, āϝāĻāύ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻž āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻāĻāĻžāϧāĻŋāĻāĻŦāĻžāϰ āĻāϞ āĻāϰāĻž āĻšāĻŦā§āĨ¤
āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻā§āύ⧠āĻāύāϏā§āĻā§āϝāĻžāύā§āϏ āϏā§āĻā§āĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύāĻž āĻšāϝāĻŧ, āϤāĻŦā§ āϏā§āĻā§āϞāĻŋāĻā§ āϏāĻāĻā§āώāĻŋāĻĒā§āϤāϤāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ āϏāϰāĻžāϏāϰāĻŋ āĻā§āώāĻŖāĻž āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
js
function Hello() {
return 'hello world!'
}
āĻāĻāĻž āĻ āĻŋāĻ, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦā§āϧ Vue āĻāĻŽā§āĻĒā§āύā§āύā§āĻ! āĻāĻ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻžāϰ āĻāύā§āϝ āĻāĻžāϰā§āϝāĻŽā§āϞāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĻā§āĻā§āύāĨ¤
Vnodes Must Be Unique â
āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻā§āϰāĻŋāϰ āϏāĻŽāϏā§āϤ āĻāύā§āĻĄ āĻ āĻŦāĻļā§āϝāĻ āĻ āύāύā§āϝ āĻšāϤ⧠āĻšāĻŦā§āĨ¤ āϤāĻžāϰ āĻŽāĻžāύ⧠āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻ āĻŦā§āϧ:
js
function render() {
const p = h('p', 'hi')
return h('div', [
// Yikes - duplicate vnodes!
p,
p
])
}
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāϤā§āϝāĻŋāĻ āĻāĻāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ/ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§ āĻ āύā§āĻāĻŦāĻžāϰ āύāĻāϞ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻĢā§āϝāĻžāĻā§āĻāϰāĻŋ āĻĢāĻžāĻāĻļāύ āĻĻāĻŋāϝāĻŧā§ āϤāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύāĻāĻŋ 20āĻāĻŋ āĻ āĻāĻŋāύā§āύ āĻ āύā§āĻā§āĻā§āĻĻ āϰā§āύā§āĻĄāĻžāϰ āĻāϰāĻžāϰ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻŦā§āϧ āĻāĻĒāĻžāϝāĻŧ:
js
function render() {
return h(
'div',
Array.from({ length: 20 }).map(() => {
return h('p', 'hi')
})
)
}
JSX / TSX â
JSX āĻšāϞ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻāĻāĻāĻŋ XML-āĻāϰ āĻŽāϤ⧠āĻāĻā§āϏāĻā§āύāĻļāύ āϝāĻž āĻāĻŽāĻžāĻĻā§āϰāĻā§ āĻāĻāϰāĻāĻŽ āĻā§āĻĄ āϞāĻŋāĻāϤ⧠āĻĻā§āϝāĻŧ:
jsx
const vnode = <div>hello</div>
JSX āĻāĻā§āϏāĻĒā§āϰā§āĻļāύā§āϰ āĻāĻŋāϤāϰā§, āĻāϤāĻŋāĻļā§āϞ āĻŽāĻžāύāĻā§āϞāĻŋ āĻāĻŽā§āĻŦā§āĻĄ āĻāϰāϤ⧠āĻā§āĻāĻāĻĄāĻŧāĻž āϧāύā§āϰā§āĻŦāύā§āϧāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ:
jsx
const vnode = <div id={dynamicId}>hello, {userName}</div>
create-vue
āĻāĻŦāĻ Vue CLI āĻāĻāϝāĻŧā§āϰāĻ āĻĒā§āϰāĻŋ-āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž JSX āϏāĻŽāϰā§āĻĨāύ āϏāĻš āϏā§āĻā§āϝāĻžāĻĢā§āϞā§āĻĄāĻŋāĻ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻŦāĻŋāĻāϞā§āĻĒ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ JSX āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞāĻŋ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻžāϰ āĻāύā§āϝ āĻ
āύā§āĻā§āϰāĻš āĻāϰ⧠@vue/babel-plugin-jsx
āĻāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻā§āύāĨ¤
āϝāĻĻāĻŋāĻ āĻĒā§āϰāĻĨāĻŽ āϰāĻŋāĻ ā§āϝāĻžāĻā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧ, JSX āĻāϰ āĻāϏāϞ⧠āĻā§āύ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āϰāĻžāύāĻāĻžāĻāĻŽ āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŦāĻŋāĻĻā§āϝāĻž āύā§āĻ āĻāĻŦāĻ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻāĻāĻĒā§āĻā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻā§ JSX-āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰ⧠āĻĨāĻžāĻā§āύ, āϤāĻžāĻšāϞ⧠āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ Vue JSX transform React-āĻāϰ JSX transform āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž, āϤāĻžāĻ āĻāĻĒāύāĻŋ Vue āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ⧠React-āĻāϰ JSX āϰā§āĻĒāĻžāύā§āϤāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āύāĻžāĨ¤ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž JSX āĻĨā§āĻā§ āĻāĻŋāĻā§ āĻāϞā§āϞā§āĻāϝā§āĻā§āϝ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ:
- āĻāĻĒāύāĻŋ āĻĒā§āϰāĻĒ āĻšāĻŋāϏāĻžāĻŦā§ HTML āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝā§āĻŽāύ
class
āĻāĻŦāĻfor
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ -className
āĻŦāĻžhtmlFor
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻāĨ¤ - āĻŦāĻžāĻā§āĻāĻžāĻĻā§āϰ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ (āϝā§āĻŽāύ āϏā§āϞāĻ) āĻĒāĻžāϏ āĻāϰāĻž works differentlyāĨ¤
Vue āĻāϰ āĻāĻžāĻāĻĒ āϏāĻāĻā§āĻāĻž āĻāĻŋāĻāϏāĻāĻā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻžāĻāĻĒ āĻāύāĻĢāĻžāϰā§āύā§āϏāĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤ TSX āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, tsconfig.json
-āĻ "jsx": "preserve"
āĻāϞā§āϞā§āĻ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻž āϝāĻžāϤ⧠TypeScript Vue JSX āϰā§āĻĒāĻžāύā§āϤāϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻāύā§āϝ JSX āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻ
āĻā§āώāϤ āϰāĻžāĻā§āĨ¤
JSX Type Inference â
āϰā§āĻĒāĻžāύā§āϤāϰā§āϰ āĻ āύā§āϰā§āĻĒ, Vue-āĻāϰ JSX-āĻāϰāĻ āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāύā§āϰ āϏāĻāĻā§āĻāĻž āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
Vue 3.4 āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰā§, Vue āĻāϰ āĻĒāϰā§āĻā§āώāĻāĻžāĻŦā§ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ JSX
āύāĻžāĻŽāϏā§āĻĨāĻžāύ āύāĻŋāĻŦāύā§āϧāύ āĻāϰ⧠āύāĻžāĨ¤ Vue-āĻāϰ JSX āĻāĻžāĻāĻĒ āϏāĻāĻā§āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ TypeScript-āĻā§ āύāĻŋāϰā§āĻĻā§āĻļ āĻĻāĻŋāϤā§, āĻāĻĒāύāĻžāϰ tsconfig.json
-āĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤāĻā§āϞāĻŋ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻž:
json
{
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "vue"
// ...
}
}
āĻāĻĒāύāĻŋ āĻĢāĻžāĻāϞā§āϰ āĻļā§āϰā§āώ⧠āĻāĻāĻāĻŋ /* @jsxImportSource vue */
āĻŽāύā§āϤāĻŦā§āϝ āϝā§āĻ āĻāϰ⧠āĻĢāĻžāĻāϞ āĻĒā§āϰāϤāĻŋ āĻ
āĻĒā§āĻ-āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āϝāĻĻāĻŋ āĻāĻŽāύ āĻā§āĻĄ āĻĨāĻžāĻā§ āϝāĻž āĻā§āϞā§āĻŦāĻžāϞ JSX
āύāĻžāĻŽāϏā§āĻĨāĻžāύā§āϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻā§āĻā§āĻā§ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ vue/jsx
āĻāĻŽāĻĻāĻžāύāĻŋ āĻŦāĻž āĻāϞā§āϞā§āĻ āĻāϰ⧠āϏāĻ āĻŋāĻ āĻĒā§āϰāĻžāĻ-3.4 āĻŦā§āĻļā§āĻŦāĻŋāĻ āĻāĻāϰāĻŖ āĻŦāĻāĻžāϝāĻŧ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ JSX
āύāĻžāĻŽāϏā§āĻĨāĻžāύ āύāĻŋāĻŦāύā§āϧāύ āĻāϰā§āĨ¤
Render Function Recipes â
āύā§āĻā§ āĻāĻŽāϰāĻž āĻā§āĻŽāĻĒā§āϞā§āĻ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāĻā§ āϤāĻžāĻĻā§āϰ āϏāĻŽāϤā§āϞā§āϝ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ / JSX āĻšāĻŋāϏāĻžāĻŦā§ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŋāĻā§ āϏāĻžāϧāĻžāϰāĻŖ āϰā§āϏāĻŋāĻĒāĻŋ āϏāϰāĻŦāϰāĻžāĻš āĻāϰāĻŦāĨ¤
v-if
â
Template:
template
<div>
<div v-if="ok">yes</div>
<span v-else>no</span>
</div>
āϏāĻŽāϤā§āϞā§āϝ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ / JSX:
js
h('div', [ok.value ? h('div', 'yes') : h('span', 'no')])
jsx
<div>{ok.value ? <div>yes</div> : <span>no</span>}</div>
v-for
â
Template:
template
<ul>
<li v-for="{ id, text } in items" :key="id">
{{ text }}
</li>
</ul>
āϏāĻŽāϤā§āϞā§āϝ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ / JSX:
js
h(
'ul',
// assuming `items` is a ref with array value
items.value.map(({ id, text }) => {
return h('li', { key: id }, text)
})
)
jsx
<ul>
{items.value.map(({ id, text }) => {
return <li key={id}>{text}</li>
})}
</ul>
v-on
â
āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ āĻšāĻžāϤā§āϰ āĻ
āĻā§āώāϰ āĻĻā§āĻŦāĻžāϰāĻž on
āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻšāĻāϝāĻŧāĻž āύāĻžāĻŽāĻā§āϞāĻŋāĻā§ āĻāĻā§āύā§āĻ āĻļā§āϰā§āϤāĻž āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āĻŽāĻĒā§āϞā§āĻā§ @click
āĻāϰ āϏāĻŽāϤā§āϞā§āϝ onClick
āĨ¤
js
h(
'button',
{
onClick(event) {
/* ... */
}
},
'Click Me'
)
jsx
<button
onClick={(event) => {
/* ... */
}}
>
Click Me
</button>
Event Modifiers â
.passive
, .capture
āĻāĻŦāĻ .once
āĻāĻā§āύā§āĻ āĻŽāĻĄāĻŋāĻĢāĻžāϝāĻŧāĻžāϰā§āϰ āĻāύā§āϝ, āĻā§āϝāĻžāĻŽā§āϞāĻā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻā§āύā§āĻā§āϰ āύāĻžāĻŽā§āϰ āĻĒāϰ⧠āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ āϏā§āĻŦāϰā§āĻĒ:
js
h('input', {
onClickCapture() {
/* listener in capture mode */
},
onKeyupOnce() {
/* triggers only once */
},
onMouseoverOnceCapture() {
/* once + capture */
}
})
jsx
<input
onClickCapture={() => {}}
onKeyupOnce={() => {}}
onMouseoverOnceCapture={() => {}}
/>
āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻā§āύā§āĻ āĻāĻŦāĻ āĻā§ āĻŽāĻĄāĻŋāĻĢāĻžāϝāĻŧāĻžāϰā§āϰ āĻāύā§āϝ, withModifiers
āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
js
import { withModifiers } from 'vue'
h('div', {
onClick: withModifiers(() => {}, ['self'])
})
jsx
<div onClick={withModifiers(() => {}, ['self'])} />
Components â
āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ vnode āϤā§āϰāĻŋ āĻāϰāϤā§, h()
āĻ āĻĒāĻžāϏ āĻāϰāĻž āĻĒā§āϰāĻĨāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϏāĻāĻā§āĻāĻž āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤāĨ¤ āĻāϰ āĻŽāĻžāύ⧠āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāĻž āĻ
āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ - āĻāĻĒāύāĻŋ āϏāϰāĻžāϏāϰāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāĻž āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
js
import Foo from './Foo.vue'
import Bar from './Bar.jsx'
function render() {
return h('div', [h(Foo), h(Bar)])
}
jsx
function render() {
return (
<div>
<Foo />
<Bar />
</div>
)
}
āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋ, h
āϝā§āĻā§āύ⧠āĻĢāĻžāĻāϞ āĻĢāϰāĻŽā§āϝāĻžāĻ āĻĨā§āĻā§ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāĻž āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϝāϤāĻā§āώāĻŖ āύāĻž āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦā§āϧ Vue āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĨ¤
āĻāϤāĻŋāĻļā§āϞ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻšāĻāĻŦā§āϧā§āϝ:
js
import Foo from './Foo.vue'
import Bar from './Bar.jsx'
function render() {
return ok.value ? h(Foo) : h(Bar)
}
jsx
function render() {
return ok.value ? <Foo /> : <Bar />
}
āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āύāĻžāĻŽ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻŦāύā§āϧāĻŋāϤ āĻšāϝāĻŧ āĻāĻŦāĻ āϏāϰāĻžāϏāϰāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāĻž āύāĻž āϝāĻžāϝāĻŧ (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āύāĻŋāĻŦāύā§āϧāĻŋāϤ), āĻāĻāĻŋ resolveComponent()
āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
Rendering Slots â
āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύā§, āϏā§āϞāĻāĻā§āϞāĻŋ setup()
āĻĒā§āϰāϏāĻā§āĻ āĻĨā§āĻā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ slots
āĻ
āĻŦāĻā§āĻā§āĻā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āϏā§āϞāĻ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϝāĻž āĻāύā§āĻĄā§āϰ āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāϰ⧠āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§:
js
export default {
props: ['message'],
setup(props, { slots }) {
return () => [
// default slot:
// <div><slot /></div>
h('div', slots.default()),
// named slot:
// <div><slot name="footer" :text="message" /></div>
h(
'div',
slots.footer({
text: props.message
})
)
]
}
}
JSX āϏāĻŽāϤā§āϞā§āϝ:
jsx
// default
<div>{slots.default()}</div>
// named
<div>{slots.footer({ text: props.message })}</div>
Passing Slots â
Passing children to components āĻāĻŋāĻā§āĻāĻž āĻāĻŋāύā§āύāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϤā§, āĻāĻŽāĻžāĻĻā§āϰ āĻšāϝāĻŧ āĻāĻāĻāĻŋ āϏā§āϞāĻ āĻĢāĻžāĻāĻļāύ āĻŦāĻž āϏā§āϞāĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻāĻāĻŋ āĻ āĻŦāĻā§āĻā§āĻ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϏā§āϞāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ āϝāĻž āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰ⧠āϤāĻž āĻĢāĻŋāϰāĻŋāϝāĻŧā§ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰ⧠- āϝāĻž āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāϰā§āĻŦāĻĻāĻž āĻāύā§āĻĄā§āϰ āĻ ā§āϝāĻžāϰā§āϤ⧠āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻāϰāĻž āĻšāĻŦā§āĨ¤
js
// single default slot
h(MyComponent, () => 'hello')
// named slots
// notice the `null` is required to avoid
// the slots object being treated as props
h(MyComponent, null, {
default: () => 'default slot',
foo: () => h('div', 'foo'),
bar: () => [h('span', 'one'), h('span', 'two')]
})
JSX equivalent:
jsx
// default
<MyComponent>{() => 'hello'}</MyComponent>
// named
<MyComponent>{{
default: () => 'default slot',
foo: () => <div>foo</div>,
bar: () => [<span>one</span>, <span>two</span>]
}}</MyComponent>
āĻĢāĻžāĻāĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ āϏā§āϞāĻ āĻĒāĻžāϏ āĻāϰāĻž āϤāĻžāĻĻā§āϰ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻ āϞāϏāĻāĻžāĻŦā§ āĻāĻŽāύā§āϤā§āϰāĻŖ āĻāĻžāύāĻžāύā§āϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āĻāĻāĻŋ āĻĒāĻŋāϤāĻžāĻŽāĻžāϤāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āϏāύā§āϤāĻžāύā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āϏā§āϞāĻā§āϰ āύāĻŋāϰā§āĻāϰāϤāĻž āĻā§āϰā§āϝāĻžāĻ āĻāϰāĻžāϰ āĻĻāĻŋāĻā§ āĻĒāϰāĻŋāĻāĻžāϞāĻŋāϤ āĻāϰā§, āϝāĻžāϰ āĻĢāϞ⧠āĻāϰāĻ āϏāĻ āĻŋāĻ āĻāĻŦāĻ āĻĻāĻā§āώ āĻāĻĒāĻĄā§āĻ āĻšāϝāĻŧāĨ¤
Scoped Slots â
āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻāĻāĻāĻŋ āϏā§āĻā§āĻĒāĻĄ āϏā§āϞāĻ āϰā§āύā§āĻĄāĻžāϰ āĻāϰāϤā§, āĻāĻāĻāĻŋ āϏā§āϞāĻ āĻāĻžāĻāϞā§āĻĄāĻā§ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āϞāĻā§āώā§āϝ āĻāϰā§āύ āĻāĻŋāĻāĻžāĻŦā§ āϏā§āϞāĻā§ āĻāĻāύ āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ text
āĻāĻā§āĨ¤ āϏā§āϞāĻāĻāĻŋ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻāϞ āĻāϰāĻž āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻžāĻāϞā§āĻĄ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĨā§āĻā§ āĻĄā§āĻāĻž āĻĒā§āϝāĻžāϰā§āύā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§ āĻĒāĻžāĻ āĻžāύ⧠āĻšāĻŦā§āĨ¤
js
// parent component
export default {
setup() {
return () => h(MyComp, null, {
default: ({ text }) => h('p', text)
})
}
}
null
āĻĒāĻžāϏ āĻāϰāϤ⧠āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝāĻžāϤ⧠āϏā§āϞāĻāĻā§āϞāĻŋāĻā§ āĻĒā§āϰāĻĒāϏ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŖā§āϝ āĻāϰāĻž āĻšāĻŦā§ āύāĻžāĨ¤
js
// child component
export default {
setup(props, { slots }) {
const text = ref('hi')
return () => h('div', null, slots.default({ text: text.value }))
}
}
JSX āϏāĻŽāϤā§āϞā§āϝ:
jsx
<MyComponent>{{
default: ({ text }) => <p>{ text }</p>
}}</MyComponent>
Built-in Components â
āĻŦāĻŋāϞā§āĻ-āĻāύ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϝā§āĻŽāύ <KeepAlive>
, <Transition>
, <TransitionGroup>
, <Teleport>
āĻāĻŦāĻ <Suspense>
āĻ
āĻŦāĻļā§āϝāĻ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ āϰā§āύā§āĻĄāĻžāϰ āĻĢāĻžāĻāĻļāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ:
js
import { h, KeepAlive, Teleport, Transition, TransitionGroup } from 'vue'
export default {
setup () {
return () => h(Transition, { mode: 'out-in' }, /* ... */)
}
}
v-model
â
āĻā§āĻŽāĻĒā§āϞā§āĻ āϏāĻāĻāϞāύā§āϰ āϏāĻŽāϝāĻŧ v-model
āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāĻā§ modelValue
āĻāĻŦāĻ onUpdate:modelValue
āĻĒā§āϰāĻĒāϏ⧠āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§âāĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻā§āĻĻā§āϰāĻā§ āĻāĻ āĻĒā§āϰāĻĒāĻā§āϞāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻāϰāϤ⧠āĻšāĻŦā§:
js
export default {
props: ['modelValue'],
emits: ['update:modelValue'],
setup(props, { emit }) {
return () =>
h(SomeComponent, {
modelValue: props.modelValue,
'onUpdate:modelValue': (value) => emit('update:modelValue', value)
})
}
}
Custom Directives â
āĻāĻžāϏā§āĻāĻŽ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠withDirectives
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ vnode-āĻ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
js
import { h, withDirectives } from 'vue'
// a custom directive
const pin = {
mounted() { /* ... */ },
updated() { /* ... */ }
}
// <div v-pin:top.animate="200"></div>
const vnode = withDirectives(h('div'), [
[pin, 200, 'top', { animate: true }]
])
āϝāĻĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļāύāĻžāĻāĻŋ āύāĻžāĻŽ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻŦāύā§āϧāĻŋāϤ āĻšāϝāĻŧ āĻāĻŦāĻ āϏāϰāĻžāϏāϰāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāĻž āύāĻž āϝāĻžāϝāĻŧ āϤāĻŦā§ āĻāĻāĻŋ resolveDirective
āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
Template Refs â
āĻāĻŽā§āĻĒā§āĻāĻŋāĻļāύ āĻāĻĒāĻŋāĻāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, useTemplateRef()
āĻā§āĻŽāĻĒā§āϞā§āĻ āϰā§āĻĢ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ vnode-āĻ prop āĻšāĻŋāϏā§āĻŦā§ āϏā§āĻā§āϰāĻŋāĻ āĻŽāĻžāύ āĻĒāĻžāϏ āĻāϰā§:
js
import { h, useTemplateRef } from 'vue'
export default {
setup() {
const divEl = useTemplateRef('my-div')
// <div ref="my-div">
return () => h('div', { ref: 'my-div' })
}
}
Usage before 3.5
In versions before 3.5 where useTemplateRef() was not introduced, template refs are created by passing the ref() itself as a prop to the vnode:
js
import { h, ref } from 'vue'
export default {
setup() {
const divEl = ref()
// <div ref="divEl">
return () => h('div', { ref: divEl })
}
}
Functional Components â
āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻšāϞ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻāĻāĻāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ āϰā§āĻĒ āϝāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻā§āύ⧠āĻ
āĻŦāϏā§āĻĨāĻž āύā§āĻāĨ¤ āϤāĻžāϰāĻž āĻŦāĻŋāĻļā§āĻĻā§āϧ āĻĢāĻžāĻāĻļāύ āĻŽāϤ āĻāĻžāĻ āĻāϰā§: āĻĒā§āϰāĻĒ āĻāύ, vnodes āĻāĻāĻ. āĻāĻā§āϞāĻŋ āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āύāĻž āĻāϰā§āĻ āϰā§āύā§āĻĄāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ (āĻ
āϰā§āĻĨāĻžā§ this
āύāϝāĻŧ), āĻāĻŦāĻ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϞāĻžāĻāĻĢāϏāĻžāĻāĻā§āϞ āĻšā§āĻ āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤
āĻāĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻŽāϰāĻž āĻŦāĻŋāĻāϞā§āĻĒ āĻ
āĻŦāĻā§āĻā§āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻĒā§āϞā§āĻāύ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋāĨ¤ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰāĻāĻžāĻŦā§ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻāĻŋāϰ āĻāύā§āϝ render
āĻĢāĻžāĻāĻļāύāĨ¤
āĻāĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āϏā§āĻŦāĻžāĻā§āώāϰ setup()
āĻšā§āĻā§āϰ āĻŽāϤā§āĻ:
js
function MyComponent(props, { slots, emit, attrs }) {
// ...
}
āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϏāĻžāϧāĻžāϰāĻŖ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻāĻĒāϞāĻŦā§āϧ āύāϝāĻŧāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻšāĻŋāϏāĻžāĻŦā§ āϝā§āĻ āĻāϰ⧠props
āĻāĻŦāĻ emits
āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āϏāĻŽā§āĻāĻŦ:
js
MyComponent.props = ['value']
MyComponent.emits = ['click']
āϝāĻĻāĻŋ props
āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻž āύāĻž āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āĻĢāĻžāĻāĻļāύ⧠āĻĒāĻžāϏ āĻāϰāĻž props
āĻ
āĻŦāĻā§āĻā§āĻā§ attrs
āĻāϰ āĻŽāϤā§āĻ āϏāĻŽāϏā§āϤ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻĨāĻžāĻāĻŦā§āĨ¤ props
āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āύāĻž āĻāϰāĻž āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāĻĒ āύāĻžāĻŽāĻā§āϞāĻŋ āĻā§āϝāĻžāĻŽā§āϞāĻā§āϏ⧠āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻāϰāĻž āĻšāĻŦā§ āύāĻžāĨ¤
āϏā§āĻĒāώā§āĻ props
āϏāĻš āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ, āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻĢāϞāĻĨā§āϰ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻŽāϤā§āĻ āĻāĻžāĻ āĻāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϝā§āĻā§āϞāĻŋ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āϤāĻžāĻĻā§āϰ props
āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰ⧠āύāĻž, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ class
, style
āĻāĻŦāĻ onXxx
āĻāĻā§āύā§āĻ āĻļā§āϰā§āϤāĻžāϰāĻž āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§ attrs
āĻĨā§āĻā§ āĻāϤā§āϤāϰāĻžāϧāĻŋāĻāĻžāϰ āϏā§āϤā§āϰ⧠āĻĒā§āϰāĻžāĻĒā§āϤ āĻšāĻŦā§āĨ¤ āĻāĻāϝāĻŧ āĻā§āώā§āϤā§āϰā§āĻ, āĻ
ā§āϝāĻžāĻā§āϰāĻŋāĻŦāĻŋāĻāĻ āĻāϤā§āϤāϰāĻžāϧāĻŋāĻāĻžāϰ āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻāϰāϤ⧠inheritAttrs
āĻā§ false
āĻ āϏā§āĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§:
js
MyComponent.inheritAttrs = false
āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋāϰ āĻŽāϤā§āĻ āύāĻŋāĻŦāύā§āϧāĻŋāϤ āĻāĻŦāĻ āĻāĻžāĻāϝāĻŧāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ āĻĒā§āϰāĻĨāĻŽ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ h()
-āĻ āĻĒāĻžāϏ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻŦāĻŋāĻŦā§āĻāĻŋāϤ āĻšāĻŦā§āĨ¤
Typing Functional Components â
āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§āϞāĻŋ āύāĻžāĻŽ āĻŦāĻž āĻŦā§āύāĻžāĻŽā§ āĻāĻŋāύāĻž āϤāĻžāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻžāĻāĻĒ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ Vue - āĻ āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āĻāĻā§āϏāĻā§āύāĻļāύ SFC āĻā§āĻŽāĻĒā§āϞā§āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻžāĻāĻĒ āĻāϰāĻž āĻāĻžāϰā§āϝāĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻžāĻāĻĒ āĻā§āĻ āĻāϰāĻž āϏāĻŽāϰā§āĻĨāύ āĻāϰā§āĨ¤
Named Functional Component
tsx
import type { SetupContext } from 'vue'
type FComponentProps = {
message: string
}
type Events = {
sendMessage(message: string): void
}
function FComponent(
props: FComponentProps,
context: SetupContext<Events>
) {
return (
<button onClick={() => context.emit('sendMessage', props.message)}>
{props.message} {' '}
</button>
)
}
FComponent.props = {
message: {
type: String,
required: true
}
}
FComponent.emits = {
sendMessage: (value: unknown) => typeof value === 'string'
}
Anonymous Functional Component
tsx
import type { FunctionalComponent } from 'vue'
type FComponentProps = {
message: string
}
type Events = {
sendMessage(message: string): void
}
const FComponent: FunctionalComponent<FComponentProps, Events> = (
props,
context
) => {
return (
<button onClick={() => context.emit('sendMessage', props.message)}>
{props.message} {' '}
</button>
)
}
FComponent.props = {
message: {
type: String,
required: true
}
}
FComponent.emits = {
sendMessage: (value) => typeof value === 'string'
}
GitHub-āĻ āĻāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ