2022. 3. 8. 16:20ใFront-End ์์ ์ค/Vue.js
๐ ๋ชฉ์ฐจ
[Vue.js] ๊ธฐ์ด ๊ฐ๋
์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue LifeCycle Hook
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Watch, Array, for๋ฌธ(๋ฐ๋ณต๋ฌธ), if๋ฌธ
๐ฑ Git Hub ์ฃผ์ : https://github.com/junyharang-FrontEnd-coding-study/vue.js-study
๐ ์ฐธ๊ณ ์๋ฃ : https://www.youtube.com/watch?v=sqH0u8wN4Rs
๐ watch ๋?
๊ฐ๋ฐ์๊ฐ ์ ์ํ Data์ ๋ํด ํด๋น Data๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋์ง๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋ ์น๊ตฌ์ธ ๊ฒ์ด์์.
์์ ๊ฐ์ด data Object์ Key ๊ฐ์ ํจ์ ํ์์ผ๋ก ๋ง๋ ๋ค ํด๋น Data Value๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด Catch๋ฅผ ํ ์ ์๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด watch์์ input1()์ Inpu1 Data์ ๋ด์ฉ์ ์ถ๋ ฅ ํ๋๋ก ํ๊ฒ ๋๋ฉด ๊ธฐ์กด์ button ๋ฑ์ผ๋ก Event๋ฅผ ๊ฑธ์ด Click์ด ์ผ์ด๋๋ฉด ํจ์๋ฅผ ํธ์ถํด์ Data๋ฅผ ๋ฐ์ ์๋๋ฐ, ํ๋ก๊ทธ๋จ ์์์ ์ด๋ค Data์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋์ง ๋ชจ๋ํฐ๋ง ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ `abcde`๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ๋ด์ฉ์ด ์ถ๋ ฅ ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์.
watch๋ฅผ ๊ฐ์ง๊ณ Data๊ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ์ด๋ค ์์ ์ ํ ์ ์๊ฒ ์ฝ๋ฉํ ์ ์๋ ๊ฒ์ด์์.
๐ Vue.js์ ๋ฐฐ์ด(Array)
์น ๊ฐ๋ฐ์ ํ ๋, ๋ชฉ๋ก(List) ์กฐํ๋, ์์ธ ์กฐํ ์์ ์ฌ๋ฌ Tag, ๋๊ธ๋ค์ ๊ฐ์ ธ์์ผ ํ ๊ฒ์ด์์.
์ด๋ ๊ฒ ์ฌ๋ฌ Data๋ฅผ ๋ฐ์์ฌ ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐฐ์ด์ธ ๊ฒ์ด์์.
๋จผ์ data()์ options๋ผ๊ณ ์ ์ธํ๊ณ , Object๊ฐ ์ฌ๋ฌ๊ฐ ๋ค์ด ์๋ ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
๐ฝ Vue.js์ ๋ฐฐ์ด๊ณผ ๋ฐ๋ณต(for)๋ฌธ
์์ ๊ฐ์ด select Tag๋ฅผ ํตํด option Tag๋ฅผ ๋ง๋ค์ด v-for๋ฅผ ๋ง๋ค์๋๋ฐ, ์ด๊ฑด for๋ฌธ์ธ ๊ฒ์ด์์.
v-for ํ์ : `v-for="({Data}, {Index})"
์ฆ ์์ d๋ options๋ผ๋ ๋ฐฐ์ด์์ ๊ฐ์ ธ์ค๊ฒ ๋ Data๋ฅผ ์๋ฏธํ๊ณ , I๋ Index, ์ฆ, ๋ฐฐ์ด์ด 3๊ฐ๋๊น 0~2๊ฐ ๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค ๋ค์ in์ ์จ์ฃผ๊ณ , ๋ณ์๋ช ์ ์จ์ฃผ๊ฒ ๋๋ฉด ๋ฐฐ์ด ๋ณ์ ์์ ์๋ ๊ฐ์ ํ๋์ฉ ๊ฐ์ ธ์ค๋ฉด์ ๋ฐ๋ณต์ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, ๋๋ฉด์ Index ๋ฒํธ๊น์ง ๊ฐ์ ธ์ค๋ ํ์์ด ๋ ๊ฒ์ด์์. Java๋ก ์น๋ฉด For-each๋ฌธ๊ณผ ๋น์ทํ๋ค์!
for ๋ฌธ์ ๊ฒฝ์ฐ key ๊ฐ์ ๋ฌด์กฐ๊ฑด ๋ฃ์ด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์. ์ด key๊ฐ์ ํด๋น ๋ฐ๋ณต๋ฌธ์ ์ ์ผํ๊ฒ ์๋ณํ ์ ์๋ ์ด๋ฆ์ ๋ฃ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋ ๊ฑฐ ๊ฐ์์.
๊ทธ๋ฆฌ๊ณ {{d.v}}๋ ๊ฐ์ ธ์จ Data์ ์์ ๋ฐฐ์ด์์ ์ ์ธํ Value ๊ฐ์ ๊ฐ์ ธ์ค๋ผ๋ ์๋ฏธ์ธ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด๋ ๊ฒ Select Box๊ฐ ๋ง๋ค์ด ์ง ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ฐ ๋ค `:value="d.k"`๋ฅผ ์ ์ธํด ์ฃผ๊ฒ ๋๋ฉด ์ด์ฉ์๊ฐ ๋ณด์ด๋ ํ๋ฉด์์๋ Data ์์ Value ์ฆ, ๋์ ์ด๋ฆ์ด ๋ณด์ด๊ฒ ์ง๋ง, ์ค์ Server ๋ด๋ถ์์๋ k๋ก ์ ์ํ S, B, J ๋ฑ์ ์ด์ฉํ๊ฒ ๋๋ ๊ฒ์ด์์.
Vue.js์์๋ `:` ์ด๋ ๊ฒ ์ฝ๋ก ์ ์ฐ๊ฒ ๋๋ฉด Data Value์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ ๊ฒ์ด์์.
์ด๋ฒ์๋ region ์ด๋ผ๋ ๋ณ์์ "J"๋ผ๋ Key๋ฅผ ์ ๋ ฅ ํด ์ฃผ๊ณ , select Box ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ณด์ฌ์ค v-model์ "region"์ ์ ์ธํ๊ฒ ๋๋ฉด Two-Way ๋ฐฉ์์ผ๋ก Bindding์ด ๋์ด ์๋ ๊ฒ์ด๊ณ ,
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ๊ฐ์ด 'Jeju'๋ก ๋์ด ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์.
์ด๋ฒ์๋ table Tag๋ฅผ ํตํด์ ๋ฐฐ์ด๊ณผ for๋ฌธ์ ์ด์ฉํด ๋ณด๋ ค๊ณ ํ๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ Table์ด ๋ง๋ค์ด ์ง๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์!
์ด๋ฒ์๋ select Tag์ Even๋ฅผ ๊ฑธ์ด์ Select Box๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด `changeRegion()`์ด ํธ์ถ๋๋๋ก ํ ๊ฒ์ด์์.
์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด select Box๊ฐ ๋ณ๊ฒฝ์ด ๋๋ฉด changeRegion()์ด ํธ์ถ์ด ๋๊ณ , ๊ทธ ์์ ๊ฒฝ๊ณ ์ฐฝ์ ์ด๊ณ this.region (Region ๋ณ์์ ๊ฐ)์ ๊ฐ์ ธ์ค๊ฒ ๋๋ ๊ฒ์ด์์.
๐ Vue.js์ ์กฐ๊ฑด(if)๋ฌธ
์ด๋ฒ์๋ ์๋์ ๊ฐ์ด tableShow๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ , ๊ธฐ๋ณธ๊ฐ์ false๋ก ๋ง๋ค์ด ์ค ๊ฒ์ด์์.
table์ ์กฐ๊ฑด์ ๋ง์ถ์ด์ ๋ณด์ฌ์คฌ๋ค๊ฐ ์ ๋ณด์ฌ์คฌ๋ค๊ฐ๋ฅผ ํด๋ณด๊ธฐ ์ํด์์์.
๊ทธ๋ฐ ๋ค table Tag์ v-if๋ฅผ ๋ฃ์ด์ฃผ๊ณ ํด๋น ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๊ฒ ํด์ค๊ฒ์ด์์.
v-if๋ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ํด๋น Element์ ๋ํด Rendering ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋ค๋ ๊ฒ์ด์์.
๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ด `false`์ด๋๊น ํด๋น table์ด ๋ณด์ด์ง ์๋ ๊ฒ์ด์์.
์ด๋ฒ์๋ ํด๋น ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ `true`๋ก ๋ฐ๊ฟ๋ณผ ๊ฒ์ด์์.
๊ทธ๋ฌ๋ฉด ์์ ๊ฐ์ด table์ด ๋ค์ ๋ณด์ด๊ฒ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
๐ฝ v-show๋?
v-show๋ ๋๊ฐ์ด ํ๋ฉด์ ๋ณด์ฌ์ค์ง ๋ง์ง(rendering์ ํ ์ง ๋ง์ง)๋ฅผ ์ ํ ์ ์๋ ๊ฒ์ธ๋ฐ, v-if๋์ ์ข ๋ค๋ฅธ ๊ฒ์ด์์.
์์ ๊ฐ์ด ํด๋น ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ด `false`์ด๋ค ๋ณด๋ ํ๋ฉด์ ๋ณด์ด์ง ์๋ ๊ฒ์ด์์.
๐ฝ v-show์ v-if์ ์ฐจ์ด์
v-if๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ์์ Rendering ์์ฒด๋ฅผ ํ์ง ์์ง๋ง, v-show ๊ฐ์ ๊ฒฝ์ฐ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๊ณ , ์ ํ๊ณ ๋ฅผ ๋ ๋์ ๋ฌด์กฐ๊ฑด Rendering์ ํ๋ ๊ฒ์ด์์.
๊ทผ๋ฐ display option์์ hidden๊ณผ ๊ฐ์ ๊ฒ๊ณผ ๊ฐ์ด ์ค์ html Element๋ Rendering์ ๋์์ผ๋, ํ๋ฉด์๋ง ๋ณด์ฌ์ฃผ์ง ์๋ ๊ฒ์ด ๋ฐ๋ก v-show์ธ ๊ฒ์ด์์.
๊ทธ๋ผ ์ด ๋๊ฐ์ง๋ ์ด๋จ ๋ ์ ์ ํ๊ฒ ์ฌ์ฉํ ์ ์์๊น์?
๊ฐ๋ฐ์ ํ ๋ ํ๋ฉด์์ ๋ณด์ฌ์ก๋ค๊ฐ ์ ๋ณด์ฌ์ก๋ค๊ฐ๋ฅผ ์์ฃผ ์ฒ๋ฆฌ๋ฅผ ํ ๋, v-if๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Rendering์ ํ๋ค๊ฐ ์ ํ๋ค๊ฐ๊ฐ ๋ฐ๋ณต์ด ๋๋๋ฐ, Rendering์ ํ๋ ๊ฒ๊ณผ destroy๋ฅผ ํ ๋ Resource๊ฐ ๋ง์ด ๋ค๊ฒ ๋๋๋ฐ, v-show ๊ฐ์ ๊ฒฝ์ฐ์ Rendering์ ํ์ง๋ง, ํ๋ฉด์ ๋ณด์ด์ง๋ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ด ๊ฒฝ์ฐ๋ v-show๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ํ๋จ์ด ๋ ์ ์๋ ๊ฒ์ด์์.
๋ฐ๋๋ก ํน์ ์กฐ๊ฑด์ ์ด๋ฃจ์ด์ก์ ๋๋ง, ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋ ๊ฑด๋ฐ, ์ง์์ ์ผ๋ก ๋ณด์๋ค ์ ๋ณด์๋ค๊ฐ ์๋๋ผ๋ฉด ์๋ฅผ ๋ค์ด ๊ด๋ฆฌ์๋ง ๋ณผ ์ ์๋ ํ์ด์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ๊ด๋ฆฌ์๊ฐ ์๋ ํ์์ ์ ๊ทผ์ ๋ง์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ด ๋๋ v-if๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ํ๋จ์ด ๋ ์ ์๋ ๊ฒ์ด์์.
์ด๋ ๊ฒ ๋๋ฉด ๊ด๋ฆฌ์๊ฐ ์๋ ์ด์ ํด๋น Page๋ Rendering ์์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Resource๋ ์๋ ์ ์๊ณ , ๋ณด์๋ ์งํฌ ์ ์๊ฒ ๋ค์!
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] axios ์ค์น (0) | 2022.03.18 |
---|---|
[Vue.js] vue-router.esm-bundler.js?ec2d:72 [Vue Router warn]: No match found for location with path "/support/devInquryList" (0) | 2022.03.15 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - data(), Data ์ฒ๋ฆฌ (0) | 2022.03.08 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue LifeCycle Hook (0) | 2022.03.08 |
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router (0) | 2022.03.07 |