hx-indicator
hx-indicator
์์ฑ์ ์์ฒญ์ด ์งํ๋๋ ๋์ htmx-request
ํด๋์ค๊ฐ ์ถ๊ฐ๋ ์์๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ์์ฒญ์ด ์งํ ์ค์ผ ๋ ์คํผ๋๋ ์งํ ํ์๊ธฐ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์์ฑ์ ๊ฐ์ ํด๋์ค๋ฅผ ์ ์ฉํ ์์ ๋๋ ์์๋ค์ CSS ์ฟผ๋ฆฌ ์ ํ์์
๋๋ค. ๋๋ ํค์๋ closest
๋ค์ CSS ์ ํ์๋ฅผ ์ถ๊ฐํ์ฌ, ์ฃผ์ด์ง CSS ์ ํ์์ ์ผ์นํ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์์ ์์๋ ์๊ธฐ ์์ ์ ์ฐพ์ ์ ์์ต๋๋ค (์: closest tr
).
๋ค์์ ๋ฒํผ ์์ ์คํผ๋๊ฐ ์๋ ์์ ์ ๋๋ค:
<div>
<button hx-post="/example" hx-indicator="#spinner">
Post It!
</button>
<img id="spinner" class="htmx-indicator" src="/img/bars.svg"/>
</div>
์์ฒญ์ด ์งํ ์ค์ผ ๋, ์ด๋ #spinner
์ด๋ฏธ์ง์ htmx-request
ํด๋์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฏธ์ง์๋ ๋ํ htmx-indicator
ํด๋์ค๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์คํผ๋๋ฅผ ํ์ํ๋ ๋ถํฌ๋ช
๋ ์ ํ์ ์ ์ํฉ๋๋ค:
.htmx-indicator{
opacity:0;
transition: opacity 500ms ease-in;
}
.htmx-request .htmx-indicator{
opacity:1
}
.htmx-request.htmx-indicator{
opacity:1
}
์คํผ๋๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ค๋ฅธ ํจ๊ณผ๋ฅผ ์ ํธํ๋ค๋ฉด, ์์ฒด indicator CSS๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ถํฌ๋ช
๋ ๋์ display
๋ฅผ ์ฌ์ฉํ๋ ์์ ์
๋๋ค (์ฐธ๊ณ ๋ก htmx-indicator
๋์ my-indicator
๋ฅผ ์ฌ์ฉํฉ๋๋ค):
.my-indicator{
display:none;
}
.htmx-request .my-indicator{
display:inline;
}
.htmx-request.my-indicator{
display:inline;
}
hx-indicator
์ ํ์์ ๋์์ ํ์ํ๋ ค๋ ์ ํํ ์์์ผ ํ์๊ฐ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. indicator์ ์์ ๊ณ์ธต์ ์ด๋ค ์์๋ผ๋ ๋ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก htmx-request
ํด๋์ค๋ ์์ฒญ์ ๋ฐ์์ํค๋ ์์์ ์ถ๊ฐ๋๋ฏ๋ก, ๊ทธ ์์ ์์ ์ธ๋์ผ์ดํฐ๋ฅผ ๋ฐฐ์นํ๋ฉด hx-indicator
์์ฑ์ ๋ช
์์ ์ผ๋ก ํธ์ถํ ํ์๊ฐ ์์ต๋๋ค:
<button hx-post="/example">
Post It!
<img class="htmx-indicator" src="/img/bars.svg"/>
</button>
๋ค์์ ์ ์ํฉ์์ ์คํผ๋๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ์ง๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ๊ฒ์ ๋๋ค:
hx-indicator
๋ ์์๋๋ฉฐ ๋ถ๋ชจ ์์์ ๋ฐฐ์นํ ์ ์์ต๋๋ค.htmx-request
ํด๋์ค๋ ์์ฒญ์ ํธ๋ฆฌ๊ฑฐํ๋ ์์์ ์ถ๊ฐ๋ฉ๋๋ค.htmx-indicator
๋ฅผ ํด๋์ค ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ฉด์ ์์ฒด CSS๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด, includeIndicatorStyles
๋ฅผ ๋นํ์ฑํํด์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ Configuring htmx์ ์ฐธ์กฐํ์ญ์์ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ HTML์ <head>
์ ๋ค์์ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค:<meta name="htmx-config" content='{"includeIndicatorStyles": false}'>