Vue.js ์ ์ฉ ๋ฐฉ๋ฒ
๐CDN ๋ฐฉ์์ผ๋ก Vue ์์ํ๊ธฐ
- ๊ฐ๋ฐ์ฉ
// ์ต์ ๋ฒ์ ๋ถ๋ฌ์ค๊ธฐ
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
// ํน์ ๋ฒ์ ๋ถ๋ฌ์ค๊ธฐ
<script src="https://cdn.jsdelivr.net/npm/vue@2.3.0"></script>
- ์์ฉ
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
โ๏ธWebpack ๋ฐฉ์์ผ๋ก Vue ์์ํ๊ธฐ
npm์ผ๋ก cli๋ฅผ ์ค์นํด vue ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ด๋ค.
npm install -g @vue/cli
# OR
yarn global add @vue/cli
๐ npm(Node Package Manager)
node.js์์ ์ฌ์ฉํ๋ ๋ชจ๋๋ค์ ํจํค์ง๋ก ๋ง๋ค์ด npm์ ํตํด์ ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๋ค. ์ง์ ๊ฐ๋ฐํ ๋ชจ๋์ด๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์ด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ๋ชจ๋์ ๊ฐํธํ๊ฒ ๋ค์ด๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
๐ Node.js
๋คํธ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์ํํธ์จ์ด ํ๋ซํผ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๊ณ ๋ด์ฅ http ์๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ด ์น ์๋ฒ์์ ๋ณ๋ ์ํํธ์จ์ด ์์ด ๋์ ๊ฐ๋ฅํ๋ค.
Chrome์ V8์์ง์ ์ด์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ฒ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋๋๋๋ก ํด์ฃผ๋ ๋ฐํ์ ํ๊ฒฝ์ด๋ค.
Vue ๊ธฐ๋ณธ ํ์
- Vue ์ธ์คํด์ค ์์ฑํ๊ธฐ
new Vue({
el: "#app",
data: {
text: 'hello world'
},
})
- vue๋ก ํ๋ฉด์ ๊ฐ๋ฐํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ ๋จ์์ธ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
- new Vue ๋ผ๋ ์์ฑ์๋ฅผ ํธ์ถํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
- ์์ฑ์์ ์์ฑ์๋ ์๋ ์์ ์ el, data ์ธ์๋ template, methods ๋ฑ์ ์ต์ ์ด ์๋ค.
- ์ธ์คํด์ค์ ์ ํจ๋ฒ์๋ el ์์ฑ์ ์ํด ์ ํด์ง๋ค.
- ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ํน์ element์ ์ธ์คํด์ค๋ฅผ ์ฐ๊ฒฐํ๊ณ , ์ธ์คํด์ค์ ์์ฑ์ด element์ ์ ์ฉ๋์ด ํ๋ฉด์ ๋ ธ์ถ๋๋ค.
- Vue ์ธ์คํด์ค ์ต์ ์์ฑ
new Vue({
// instance option properties
template: "",
data: "",
el: "", # ์ฌ๋ฌ ๊ฐ์ ์์์ ์ง์ ๋ถ๊ฐ, ๋์ el ์ฐ๊ฒฐ ๊ฐ๋ฅ(๊ถ์ฅ X)
methods: {},
computed: {},
watch: {} # ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ํ ์๋ต, ๋น๋๊ธฐ ๋๋ ์๊ฐ์ด ๋ง์ด ์์๋๋ ์์
์ ์ฌ์ฉ
// ...
});
์ธ์คํด์ค ์์ฑ ์ ์์ฃผ ์ฌ์ฉํ๋ ์ต์ ๋ชฉ๋ก์ด๋ค.
์ต์ | ์ค๋ช | ์์ |
el | html DOM ์์์ Vue ์ธ์คํด์ค ์ฐ๊ฒฐ #: id ์ง์ , .: ํด๋์ค ์ง์ |
el: '#app' |
data | Vue๊ฐ ๋ฐ๋ผ๋ณด๋ data ๊ฐ์ฒด ์ง์ | data: {name: '๊น๊ฐ์'} |
computed | data ๊ฐ์ฒด ๋ฑ์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์ ์ ์บ์ฑ์ ์์ผ๋๊ณ ๋์ผํ ์์ฒญ์๋ ๊ฐ๋ง ๋ฆฌํด |
|
methods | data ๊ฐ์ฒด ๋ฑ์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์ ์ ์บ์ฑ์ด ๋์ง ์๊ณ ํธ์ถ๋ ๋๋ง๋ค ๊ณ์ ํจ์ ์คํ |
|
watch | ์ง์ ๋ ๋ณ์๋ฅผ ๊ณ์ ์ง์ผ๋ณด๋ค๊ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ ์ ์๋ ํจ์ ์คํ | |
filter | ํ ์คํธ ํ์ํ๋ฅผ ์ํด ํํ์ ๋ง์ง๋ง์ ํ์ดํ ์ฌ๋ณผ(|)๊ณผ ํจ๊ป ์ฌ์ฉ |
Vue ๋ฐ์ดํฐ ํ์
- ์ฝง์์ผ ๋ฌธ๋ฒ {{ํ๋กํผํฐ๋ช }}
์ด์ค ์ค๊ดํธ {{ }} ๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ ์ธ์คํด์ค์ ๊ด๋ฆฌํ๋ data, computed, props ์์ฑ์ ํ๋ฉด์ ํ์ํ ์ ์๋ค.
ํ์ํ ๋ฐ์ดํฐ ๋ณ์๋ช ์ ์ด์ค ์ค๊ดํธ ์์ ์ ๊ฑฐ๋ JS ํํ์๋ ์ฌ์ฉํ ์ ์๋ค. ex) {{ํ๋กํผํฐ๋ช .replace('a', 'b')}}
<div>{{ str }}</div>
<div>{{ number + 1 }}</div>
<div>{{ message.split('').reverse().join('') }}</div>
Vue ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ ์ฒด ํํ์ด๋ค.
<!DOCTYPE html>
<html>
<head><title>Vue.js Sample</title></head>
<body>
<div id="app">
{{ message }} #Hello Vue.js!
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> # cdn
<script>
new Vue({
el: "#app",
data: {
message: "Hello Vue.js!"
}
});
</script>
</body>
</html>
- ๋๋ ํฐ๋ธ
Vue์์ html ์์์ ๋ํด ์คํํ๋ ๋ช ๋ น์ผ๋ก 'v-' ์ ๋์ฌ๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๋ค.
๋ด๋ถ์ ์ผ๋ก ์ฝง์์ผ ๋ฌธ๋ฒ์ด v-text๋ก ์ปดํ์ผ๋๊ธฐ ๋๋ฌธ์ ์์ ์์ ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค.
<div id="app">
<p v-text="message"></p>
</div>
โ๏ธ v-text
innerText ์ ๋์ผํ ๊ธฐ๋ฅ ์ํ
ํ๊ทธ๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ๋ฌธ์ ๊ทธ๋๋ก ๋ณด์ฌ์ค
์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด๋ผ {{}} ์ ๊ฐ์ ๊ฐ๋จํ ์์์ ์ถ๊ฐํด์ค ๊ฒ
โ๏ธ v-html
innerHtml ๊ณผ ๋์ผํ ๊ธฐ๋ฅ ์ํ
ํ๊ทธ๋ฅผ ํ์ฑํ์ฌ ํ๋ฉด์ ๊ตฌํ
XSS(Cross Site Scripting) ๊ณต๊ฒฉ์ ์ฃผ์ํ์ฌ ์ฌ์ฉ
<body>
<div id="app">
<p>{{ myMessage }}</p>
<p v-text="myMessage"></p>
<p v-html="myMessage"></p>
</div>
<script>
new Vue({
el: '#app',
data: {
myMessage:'<h1>Hello :)</h1>'
}
})
</script>
</body>
- {{}}: <h1>Hello :)</h1>
- v-text: <h1>Hello :)</h1>
- v-html: h1 ํ๊ทธ๊ฐ ํ์ฑ๋์ด ํ๋ฉด์ ๊ตฌํ๋จ
โ๏ธ v-show
css์ display์ ๋์ผํ ๊ธฐ๋ฅ์ผ๋ก ์๋ฆฌ๋จผํธ๋ ๋ ๋๋ง๋์ด DOM์ ๋จ์์์
โ๏ธ v-if, v-else-if, v-else
if, else if, else ์กฐ๊ฑด๋ฌธ์ ๊ตฌํ
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ธ๋ก์ ๋ ๋๋ง, ๋๋ ํฐ๋ธ ํํ์ ๊ฐ์ด true ์ผ ๋๋ง ๋ ๋๋ง
โ๏ธ v-for
for ๋ฐ๋ณต๋ฌธ์ ๊ตฌํ, ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ฆฌ๋จผํธ ๋๋ ํ ํ๋ฆฟ ๋ธ๋ก์ ์ฌ๋ฌ ๋ฒ ๋ ๋๋ง
item in items ๊ตฌ๋ฌธ ์ฌ์ฉ
ํด๋น ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ 0์ด๋ฉด ๊ทธ๋ ค์ง์ง ์์ ๊ตณ์ด v-if๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์
๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ์ฆ๊ฐํ๋ฉด ๊ธฐ์กด์ DOM ์์ฒด๋ฅผ ํ๊ธฐํ์ง๋ ์๊ณ ์ ๋ถ ๋ ๋๋ง์ ๋ค์ ํ์ง ์์ ์ฑ๋ฅ์ด ์ข์๋ฐ, ์ด๋ฅผ ์ํด์๋ ์ ๋ํฌํ key๋ฅผ ์ฌ์ฉํด์ผ ํจ
v-if ์ ํจ๊ป ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๊ณ , ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ v-for ์ฐ์ ์์๊ฐ ๋์
- ๋ฆฌ์คํธ ๋ชฉ๋ก์ ํํฐ๋ง ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
v-for="user in users" v-if="user.isActive" ์ ๊ฐ์ด ์ฌ์ฉํ์ง ๋ง๊ณ ํํฐ๋ง๋ ๋ชฉ๋ก์ ์๋ก์ด computed ์์ฑ์ผ๋ก ์ ์
- ๋ฆฌ์คํธ๋ฅผ ์จ๊ธฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
v-for="user in users" v-if="shouldShowUsers" ์ ๊ฐ์ด ์ฌ์ฉํ์ง ๋ง๊ณ v-if๋ ์ปจํ ์ด๋ ์๋ฆฌ๋จผํธ๋ก ์ฎ๊ธฐ๊ธฐ
โ๏ธ v-on
์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฐ๊ฒฐํ์ฌ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ฝ๋ ์คํ
์ด๋ฒคํธ ์ ํ์ ์ ๋ฌ์ธ์๋ก ํ์
v-on:click ์ @click ๊ณผ ๊ฐ์ ์ฝ์ด๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โ๏ธ v-bind
ํ๊ทธ์ ์์ฑ์ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉ, html ์์์ ์์ฑ์ vue ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ผ๋ก ํ ๋น
v-bind:href ๋ :href ์ ๊ฐ์ ์ฝ์ด๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โ๏ธ v-model
html form ์์ ๊ฐ๊ณผ data ๋ฅผ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ
lazy, number, trim ๋ฑ์ ์์ฑ์ด ์์
- lazy
input ๋์ change ์ด๋ฒคํธ ํ์ ๋๊ธฐํ
- number
๋ฌธ์์ด์ ์ซ์๋ก ๋ณ๊ฒฝ
- trim
์ ๋ ฅ์ ๋ํ ๊ณต๋ฐฑ ์ ๊ฑฐ
โ๏ธ v-pre
์ปดํ์ผํ์ง ์๊ณ ์ฝ๋๊ฐ ๊ทธ๋๋ก ๋ณด์ฌ์ง
โ๏ธ v-once
์ฒ์ ํ ๋ฒ๋ง ๋ ๋๋ง์ ์ํํ๊ณ ์ดํ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ทธ๋๋ก ์ฒ์ ๊ฐ์ ๋ณด์ฌ์ค
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://velog.io/@swhan9404/vue%EC%9D%98-%EB%AC%B8%EB%B2%95
https://cjw-awdsd.tistory.com/33
'๊ฐ๋ฐ > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue3 Composition API (0) | 2022.04.06 |
---|---|
Vuex / ์ํ๊ด๋ฆฌ / Vuex ํจํด ๋ฐ ์์ (0) | 2022.04.05 |
Vue ๋ผ์ฐํฐ / SPA / Router ๊ฐ ์ ๋ฌ (0) | 2022.04.04 |
Vue ์ปดํฌ๋ํธ / ์ปดํฌ๋ํธ ๊ฐ ํต์ (0) | 2022.04.04 |
Vue.js ๊ธฐ๋ณธ ๊ฐ๋ / ์ฌ์ฉํ๋ ์ด์ / ๊ฐ์ ๋ (0) | 2022.03.17 |
๋๊ธ