hx-swap
hx-swap
μμ±μ μ¬μ©νλ©΄ AJAX μμ²μ targetμ κΈ°μ€μΌλ‘
μλ΅μ΄ μ΄λ»κ² κ΅μ²΄λ μ§ μ§μ ν μ μμ΅λλ€.
μ΅μ
μ μ§μ νμ§ μμΌλ©΄ κΈ°λ³Έκ°μ htmx.config.defaultSwapStyle
(innerHTML
)μ
λλ€.
μ΄ μμ±μ κ°λ₯ν κ°μ λ€μκ³Ό κ°μ΅λλ€:
innerHTML
- λμ μμμ λ΄λΆ HTMLμ κ΅μ²΄ν©λλ€.outerHTML
- λμ μμ μ 체λ₯Ό μλ΅μΌλ‘ λ체ν©λλ€.textContent
- μλ΅μ HTMLλ‘ κ΅¬λ¬Έ λΆμνμ§ μκ³ λμ μμμ ν
μ€νΈ μ½ν
μΈ λ₯Ό λ°κΏλλ€.beforebegin
- λμ μμ μμ μλ΅μ μ½μ
ν©λλ€.afterbegin
- λμ μμμ 첫 λ²μ§Έ μμ μμ μλ΅μ μ½μ
ν©λλ€.beforeend
- λμ μμμ λ§μ§λ§ μμ λ€μ μλ΅μ μ½μ
ν©λλ€.afterend
- λμ μμ λ€μ μλ΅μ μ½μ
ν©λλ€.delete
- μλ΅μ κ΄κ³μμ΄ λμ μμλ₯Ό μμ ν©λλ€.none
- μλ΅μ μ½ν
μΈ λ₯Ό μΆκ°νμ§ μμ΅λλ€(out of bandλ κ³μ μ²λ¦¬λ©λλ€).μ΄λ¬ν μ΅μ
μ νμ€ DOM μ΄λ¦ μ§μ κ³Ό
Element.insertAdjacentHTML
μ¬μμ κΈ°λ°μΌλ‘ ν©λλ€.
μ΄ μ½λμμλ λ§μ°¬κ°μ§μ λλ€:
<div hx-get="/example" hx-swap="afterend">Get Some HTML & Append It</div>
div
λ /example
μ μμ²μ 보λ΄κ³ λ°νλ μ½ν
μΈ λ₯Ό div
λ€μ μΆκ°ν©λλ€.
hx-swap
μμ±μ κ΅μ²΄ λμμ λ³κ²½νκΈ° μν μμ μλ₯Ό μ§μν©λλ€. μλμ μ€λͺ
λμ΄ μμ΅λλ€.
transition
κ΅μ²΄κ° λ°μν λ μλ‘μ΄ View Transitions APIλ₯Ό μ¬μ©νλ €λ©΄
κ΅μ²΄μ transition:true
μ΅μ
μ μ¬μ©νλ©΄ λ©λλ€. htmx.config.globalViewTransitions
κ΅¬μ± μ€μ μ
true
λ‘ μ€μ νμ¬ μ΄ κΈ°λ₯μ μ μμ μΌλ‘ νμ±νν μλ μμ΅λλ€.
swap
& settle
swap
μμ μλ₯Ό ν¬ν¨νμ¬ μ½ν
μΈ κ΅μ²΄λ₯Ό μν΄ μλ΅μ λ°μ ν
htmxκ° λκΈ°νλ μκ°μ μμ ν μ μμ΅λλ€:
<!-- this will wait 1s before doing the swap after it is received -->
<div hx-get="/example" hx-swap="innerHTML swap:1s">Get Some HTML & Append It</div>
λ§μ°¬κ°μ§λ‘ settle
μμ μλ₯Ό ν¬ν¨νμ¬ κ΅μ²΄μ μ 리 λ‘μ§ μ¬μ΄μ μκ°μ μμ ν μ μμ΅λλ€:
<!-- this will wait 1s before doing the swap after it is received -->
<div hx-get="/example" hx-swap="innerHTML settle:1s">Get Some HTML & Append It</div>
μ΄λ¬ν μμ±μ μ¬μ©νμ¬ htmxλ₯Ό CSS μ ν ν¨κ³Όμ νμ΄λ°κ³Ό λκΈ°νν μ μμ΅λλ€.
ignoreTitle
κΈ°λ³Έμ μΌλ‘ htmxλ μλ΅ μ½ν
μΈ μμ <title>
νκ·Έλ₯Ό μ°ΎμΌλ©΄ νμ΄μ§μ μ λͺ©μ μ
λ°μ΄νΈν©λλ€.
ignoreTitle
μ΅μ
μ trueλ‘ μ€μ νμ¬ μ΄ λμμ ν΄μ ν μ μμ΅λλ€.
scroll
& show
scroll
κ³Ό show
μμ μλ₯Ό μ¬μ©νμ¬ λμ μμμ μ€ν¬λ‘€ λμμ λ³κ²½ν μ μμ΅λλ€.
μ΄ μμ μλ€μ κ°κ° top
κ³Ό bottom
κ°μ κ°μ§λλ€:
<!-- μ΄ κ³ μ λμ΄ divλ μ½ν
μΈ κ° μΆκ°λ ν divμ νλ¨μΌλ‘ μ€ν¬λ‘€λ©λλ€ -->
<div style="height:200px; overflow: scroll"
hx-get="/example"
hx-swap="beforeend scroll:bottom">
Get Some HTML & Append It & Scroll To Bottom
</div>
<!-- μ΄λ μΌλΆ μ½ν
μΈ λ₯Ό κ°μ Έμ #another-divμ μΆκ°ν ν,
#another-divμ μλ¨μ΄ λ·°ν¬νΈμ 보μ΄λλ‘ ν©λλ€ -->
<div hx-get="/example"
hx-swap="innerHTML show:top"
hx-target="#another-div">
Get Some Content
</div>
μ€ν¬λ‘€λ§ λλ νμλ₯Ό μν΄ λ€λ₯Έ μμλ₯Ό λμμΌλ‘ μ§μ νλ €λ©΄ scroll:
λλ show:
λ€μμ
CSS μ νμλ₯Ό λ°°μΉνκ³ :top
λλ :bottom
μ μΆκ°νλ©΄ λ©λλ€:
<!-- μ΄λ μΌλΆ μ½ν
μΈ λ₯Ό κ°μ Έμ νμ¬ divμ κ΅μ²΄ν ν,
#another-divμ μλ¨μ΄ λ·°ν¬νΈμ 보μ΄λλ‘ ν©λλ€ -->
<div hx-get="/example"
hx-swap="innerHTML show:#another-div:top">
Get Some Content
</div>
νμ¬ μ°½μ μλ¨ λ° νλ¨μΌλ‘ μ€ν¬λ‘€νλ €λ©΄ window:top
λ° window:bottom
μ μ¬μ©ν μλ μμ΅λλ€.
<!-- μ΄λ μΌλΆ μ½ν
μΈ λ₯Ό κ°μ Έμ νμ¬ divμ κ΅μ²΄ν ν,
λ·°ν¬νΈκ° 맨 μλ‘ μ€ν¬λ‘€λλλ‘ ν©λλ€ -->
<div hx-get="/example"
hx-swap="innerHTML show:window:top">
Get Some Content
</div>
Boostλ λ§ν¬μ νΌμ κΈ°λ³Έ λμμ show:top
μ
λλ€. μ΄λ₯Ό μ μμ μΌλ‘ λΉνμ±ννλ €λ©΄
htmx.config.scrollIntoViewOnBoostλ₯Ό μ¬μ©νκ±°λ μμλ³λ‘ hx-swap="show:none"
μ μ¬μ©ν μ μμ΅λλ€.
<form action="/example" hx-swap="show:none">
...
</form>
htmxλ μ μλ ID μμ±μ΄ μλ μ
λ ₯μ λν μμ² κ°μ focusλ₯Ό μ μ§ν©λλ€. κΈ°λ³Έμ μΌλ‘ htmxλ μ¬μ©μκ° μ΄λ―Έ νμ λ κΈ΄ μμ²μμ μμΉ μλ λμμ΄ λ μ μλ, μμ² κ° focus μ
λ ₯μ λν μλ μ€ν¬λ‘€μ λ°©μ§ν©λλ€. focus μ€ν¬λ‘€μ νμ±ννλ €λ©΄ focus-scroll:true
λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
<input id="name" hx-get="/validation"
hx-swap="outerHTML focus-scroll:true"/>
λλ κ° μμ² ν νμ΄μ§κ° focusκ° λ§μΆ°μ§ μμλ‘ μλ μ€ν¬λ‘€λλλ‘ νλ €λ©΄ htmx μ μ κ΅¬μ± κ° htmx.config.defaultFocusScroll
μ trueλ‘ λ³κ²½νλ©΄ λ©λλ€. κ·Έλ° λ€μ focus-scroll:false
λ₯Ό μ¬μ©νλ©΄ νΉμ μμ²μ λν΄ μ΄ κΈ°λ₯μ λΉνμ±νν©λλ€.
<input id="name" hx-get="/validation"
hx-swap="outerHTML focus-scroll:false"/>
hx-swap
μ μμλλ©° λΆλͺ¨ μμμ λ°°μΉν μ μμ΅λλ€.innerHTML
μ
λλ€.<body>
μμμμ outerHTML
λ©μλλ₯Ό μ¬μ©ν μ μμ΅λλ€.
htmxλ <body>
μ outerHTML
μ innerHTML
μ μ¬μ©νλλ‘ λ³κ²½ν©λλ€.