πŸ’‘λ·° ν…œν”Œλ¦Ώ

sujinΒ·2021λ…„ 11μ›” 9일
0

λ·°

λͺ©λ‘ 보기
3/6
post-thumbnail

01. λ·° ν…œν”Œλ¦Ώ

01-1. λ·° ν…œν”Œλ¦Ώμ΄λž€?

  • 뷰의 ν…œν”Œλ¦Ώμ€ HTML,CSS λ“±μ˜ λ§ˆν¬μ—… 속성과 λ·° μΈμŠ€ν„΄μŠ€μ—μ„œ μ •μ˜ν•œ 데이터 및 λ‘œμ§λ“€μ„ μ—°κ²°ν•˜μ—¬ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €μ—μ„œ λ³Ό 수 μžˆλŠ” ν˜•νƒœμ˜ HTML둜 λ³€ν™˜ν•΄ μ£ΌλŠ” 속성이닀.

template 속성을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우

<div id="app">
         <h3>{{message}}}}</h3> 
</div>
<script>
	 new Vue({
	 	el:'#app', 
	 	data:{
	 		message: 'Hello Vue.js!'
	 	}
	 });
</script> 

template 속성을 μ‚¬μš©ν•œ 경우

<div id="app"></div>
<script>
	new Vue({
		el:'#app',
		data: {
		  message: 'Hello Vue.js!'	
		},
		template: '<h3>{{ message }}</h3>'
	});
</script>

01-2. 데이터 바인딩

  • 데이터 바인딩은 HTMLν™”λ©΄ μš”μ†Œλ₯Ό λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터와 μ—°κ²°ν•˜λŠ” 것을 의미
	<div id="app" v-once>
		{{ message }}
	</div>
	<script>
		new Vue({
			el: '#app',
			data:{
			 	message:'Hello vue.js!'
			}
		})
	</script>

{{ }} - μ½§μˆ˜μ—Ό κ΄„ν˜Έ

  • λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터λ₯Ό HTML νƒœκ·Έμ— μ—°κ²°ν•˜λŠ” κ°€μž₯ 기본적인 ν…μŠ€νŠΈ μ‚½μž… 방식이닀.
  • data μ†μ„±μ˜ message 값이 λ°”λ€Œλ©΄ λ·° λ°˜μ‘μ„±μ— μ˜ν•΄ 화면이 μžλ™μœΌλ‘œ κ°±μ‹ λœλ‹€.
  • λ·° 데이터가 λ³€κ²½λ˜μ–΄λ„ 값을 λ°”κΎΈκ³  싢지 μ•Šμ„ λ•Œ, v-once 속성을 μ‚¬μš©ν•œλ‹€.
<div id="app">
	<p v-bind:id="idA">아이디 바인딩</p>
	<p v-bind:class="classA">클래슀 바인딩</p>
	<p v-bind:style="styleA">μŠ€νƒ€μΌ 바인딩</p>
</div>
<script>
	new Vue({
		el:'#app',
		data:{
			   idA: 10, 
			   classA: 'container', 
			   styleA: 'color:blue'
		}
	});
</script>

v-bind

  • 아이디, 클래슀, μŠ€νƒ€μΌ λ“±μ˜ HTML속성 값에 λ·° 데이터 값을 μ—°κ²°ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 데이터 μ—°κ²° 방식이닀.
  • 'v-bind:' 문법을 ':'둜 κ°„μ†Œν™”ν•  수 μžˆλ‹€.

01-3. μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹

  • 데이터 바인딩 방법 쀑 ν•˜λ‚˜μΈ {{ }} μ•ˆμ— μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ„ λ„£μœΌλ©΄ λœλ‹€.
<div id="app">
    <p>{{message}}</p>
    <p>{{message + '!!!'}}</p>
    <p>{{message.split('').reverse().join('')}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data: {
            message: 'Hello Vue!'
        }
    });
</script>


πŸ“’ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ—μ„œ μ£Όμ˜ν•  점

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ„ μ–Έλ¬Έκ³Ό λΆ„κΈ° ꡬ문은 μ‚¬μš©ν•  수 μ—†λ‹€.
  • λ³΅μž‘ν•œ 연산은 μΈμŠ€ν„΄μŠ€ μ•ˆμ—μ„œ μ²˜λ¦¬ν•˜κ³  ν™”λ©΄μ—λŠ” κ°„λ‹¨ν•œ μ—°μ‚° 결과만 ν‘œμ‹œν•΄μ•Όν•œλ‹€.
<div id="app">
    {{ var a = 10; }} <!-- X, 선언문은 μ‚¬μš© λΆˆκ°€λŠ₯  -->
    {{ if (true) {return 100} }} <!-- X, λΆ„κΈ° ꡬ문은 μ‚¬μš© λΆˆκ°€λŠ₯ -->
    {{ true ? 100 : 0 }} <!-- O, μ‚Όν•­ μ—°μ‚°μžλ‘œ ν‘œν˜„ κ°€λŠ₯ -->

    {{ message.split('').reverse().join('') }} <!-- X, λ³΅μž‘ν•œ 연산은 μΈμŠ€ν„΄μŠ€ μ•ˆμ—μ„œ μˆ˜ν–‰ -->
    {{ reversedMessage }} <!-- O, μŠ€ν¬λ¦½νŠΈμ—μ„œ computed μ†μ„±μœΌλ‘œ κ³„μ‚°ν•œ ν›„ μ΅œμ’… κ°’λ§Œ ν‘œν˜„ -->
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({ 
        el:'#app',
        data: {
            message: 'Hello Vue!'
        },
        computed : { //데이터 속성을 μžλ™μœΌλ‘œ 계산해 μ£ΌλŠ” 속성
            reversedMessage :  function() { // {{ reversedMessage }}에 ν‘œν˜„λ˜μ§€ 전에 연산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
                return this.message.split('').reverse().join('');
            }
        }
    });
</script>

01-4. λ””λ ‰ν‹°λΈŒ

  • λ·° λ””λ ‰ν‹°λΈŒ(Directive)λž€ HTMLνƒœκ·Έ μ•ˆμ— v- 접두사λ₯Ό κ°€μ§€λŠ” λͺ¨λ“  속성을 μ˜λ―Έν•œλ‹€
  • ν™”λ©΄μ˜ μš”μ†Œλ₯Ό 더 μ‰½κ²Œ μ‘°μž‘ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯이닀
  • λ·° 데이터 값이 λ³€κ²½λ˜μ—ˆμ„ λ•Œ ν™”λ©΄μ˜ μš”μ†Œλ“€μ΄ λ°˜μ‘ν•˜μ—¬ λ³€κ²½λœ 데이터 값에 따라 κ°±μ‹ λœλ‹€.
  • ν™”λ©΄ μš”μ†Œλ₯Ό 직접 μ œμ–΄ν•  ν•„μš” 없이 뷰의 λ””λ ‰ν‹°λΈŒλ₯Ό ν™œμš©ν•˜μ—¬ μš”μ†Œλ“€μ„ μ‘°μž‘ν•  수 μžˆλ‹€.
λ””λ ‰ν‹°λΈŒ 이름 μ—­ν• 
v-if μ§€μ •ν•œ λ·° 데이터 값에 μ°Έ, 거짓 여뢀에 따라 ν•΄λ‹Ή html νƒœκ·Έλ₯Ό 화면에 ν‘œμ‹œν•˜κ±°λ‚˜ ν‘œμ‹œν•˜μ§€ μ•ŠλŠ”λ‹€.
v-for μ§€μ •ν•œ λ·° λ°μ΄ν„°μ˜ 개수만큼 ν•΄λ‹Ή htmlνƒœκ·Έλ₯Ό 반볡 좜λ ₯ν•œλ‹€.
v-show v-if와 μœ μ‚¬ν•˜κ²Œ λ°μ΄ν„°μ˜ μ§„μœ„ 여뢀에 따라 ν•΄λ‹Ή html νƒœκ·Έλ₯Ό 화면에 ν‘œμ‹œν•˜κ±°λ‚˜ ν‘œμ‹œν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€λ§Œ, v-ifλŠ” ν•΄λ‹Ή νƒœκ·Έλ₯Ό μ™„μ „νžˆ μ‚­μ œ ν•˜μ§€λ§Œ v-showλŠ” display:none 처리λ₯Ό ν•˜μ—¬ νƒœκ·ΈλŠ” λ‚¨μ•„μžˆκ³  ν™”λ©΄ μƒμ—λ§Œ 보이지 μ•Šκ²Œ λœλ‹€.
v-bind html νƒœκ·Έμ˜ κΈ°λ³Έ 속성과 λ·° 데이터 속성을 μ—°κ²°ν•œλ‹€.
v-on ν™”λ©΄ μš”μ†Œμ˜ 이벀트λ₯Ό κ°μ§€ν•˜μ—¬ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄ v-on:click은 ν•΄λ‹Ή νƒœκ·Έμ˜ 클릭 이벀트λ₯Ό κ°μ§€ν•˜μ—¬ νŠΉμ • λ§€μ„œλ“œλ₯Ό μ‹€ν–‰ ν•  수 μžˆλ‹€.
v-model 폼(form)μ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” 속성이닀. 폼에 μž…λ ₯ν•œ 값을 λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터와 μ¦‰μ‹œ 동기화 ν•œλ‹€. 화면에 μž…λ ₯된 값을 μ €μž₯ν•˜μ—¬ μ„œλ²„μ— λ³΄λ‚΄κ±°λ‚˜ μΆ”κ°€ λ‘œμ§μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. input, selsect, textarea νƒœκ·Έμ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

<div id="app">
    <a v-if="flag">λ‘μž‡ vue</a>
    <ul>
        <li v-for="system in systems">{{ system }}</li>
        <!-- v-for = "μ•„μ΄ν…œλͺ… in array" -->
    </ul>
    <p v-show="flag">λ‘μž‡ vue</p>
    <h5 v-bind:id = "uid">λ·° μž…λ¬Έμ„œ</h5>
    <!-- v-bind:속성 = "속성이름" -->
    <button v-on:click = "popupAlert">κ²½κ³  μ°½ λ²„νŠΌ</button>
    <!-- v-on:μ΄λ²€νŠΈμ΄λ¦„ = "λ©”μ†Œλ“œμ΄λ¦„" -->
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({ 
        el:'#app',
        data: {
            flag:true,
            systems : ['andoroid', 'ios', 'window'],
            uid: 10
        },
        methods : {
            popupAlert : function() {
                return alert('κ²½κ³  μ°½ ν‘œμ‹œ');
            }
        }
    });
</script>


01-5. κ³ κΈ‰ ν…œν”Œλ¦Ώ 기법

  • computed 속성
    • λ³΅μž‘ν•œ 데이터 연산듀을 μ •μ˜ν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • computed μ†μ„±μ˜ μž₯점

    • data속성 κ°’μ˜ 변화에 따라 μžλ™μœΌλ‘œ λ‹€μ‹œ μ—°μ‚°ν•œλ‹€.
    • 캐싱 : λ™μΌν•œ 연신을 λ°˜λ³΅ν•΄μ„œ ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ μ—°μ‚°μ˜ κ²°κ³Ό 값을 미리 μ €μž₯ν•˜κ³  μžˆλ‹€κ°€ ν•„μš”ν•  λ•Œ λΆˆλŸ¬μ˜€λŠ” λ™μž‘
  • computed 속성과 methods μ†μ„±μ˜ 차이점

    • methods 속성은 ν˜ΈμΆœν•  λ•Œλ§Œ ν•΄λ‹Ή 둜직이 μˆ˜ν–‰λ˜κ³ , computed 속성은 λŒ€μƒ λ°μ΄ν„°μ˜ 값이 λ³€κ²½λ˜λ©° μžλ™μ μœΌλ‘œ μˆ˜ν–‰λœλ‹€.
    • βœ” methods: μˆ˜λ™μ  데이터 κ°±μ‹ 
    • βœ” computed: λŠ₯동적 데이터 κ°±μ‹ 
    • methods 속성은 μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ 연산을 ν•˜κΈ° λ•Œλ¬Έμ— λ³„λ„λ‘œ 캐싱을 ν•˜μ§€ μ•Šμ§€λ§Œ, computed 속성은 데이터가 λ³€κ²½λ˜μ§€ μ•ŠλŠ” ν•œ μ΄μ „μ˜ 계산 값을 가지고 μžˆλ‹€κ°€ ν•„μš”ν•  λ•Œ λ°”λ‘œ λ°˜ν™˜ν•΄ μ€€λ‹€.
    • λ³΅μž‘ν•œ 연산을 λ°˜λ³΅ν•΄μ„œ μˆ˜ν–‰ν•΄ 화면에 λ‚˜νƒ€λ‚΄μ•Όν•œλ‹€λ©΄, computed 속성을 μ΄μš©ν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€.
<div id="app">
    <p>{{ message }}</p>
    <button v-on:click="reverseMsg">λ¬Έμžμ—΄ μ—­μˆœ</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({ 
        el:'#app',
        data: {
            message:'Hello Vue!'
        },
        // methods 속성
        methods: {
            reverseMsg: function(){
                this.message =  this.message.split('').reverse().join('');
                return this.message;
            }
        }
    });
</script>

  • watch속성
    • 데이터 λ³€ν™”λ₯Ό κ°μ§€ν•˜μ—¬ μžλ™μœΌλ‘œ νŠΉμ • λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€.
    • computed 속성과 μœ μ‚¬ν•˜μ§€λ§Œ, watch 속성은 데이터 호좜과 같이 μ‹œκ°„μ΄ μƒλŒ€μ μœΌλ‘œ 더 많이 μ†Œλͺ¨λ˜λŠ” 비동기 μ²˜λ¦¬μ— μ ν•©ν•˜λ‹€.

πŸ“’ 비동기 μ²˜λ¦¬λž€?
μ›Ήμ—μ„œ 데이터λ₯Ό ν˜ΈμΆœν• λ•Œ, μ„œλ²„μ— 보낸 μš”μ²­μ΄ μ–Έμ œ 응닡이 μ˜¬μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ—, μžλ°”μŠ€ν¬λ¦½νŠΈ 연산에 영ν–₯을 주지 λͺ»ν•˜λ„둝 λ³„λ„μ˜ μ˜μ—­μ—μ„œ ν•΄λ‹Ή 데이터λ₯Ό μš”μ²­ν•˜κ³  응닡을 κΈ°λ‹€λ¦¬λŠ” 것을 λ§ν•œλ‹€.

<div id="app">
    <input v-model="message">
    <!-- v-model λ·° μΈμŠ€ν„΄μŠ€μ˜ 데이터와 μ¦‰μ‹œ λ™κΈ°ν™”ν•œλ‹€. 화면에 μž…λ ₯된 값을 μ €μž₯ν•˜μ—¬ μ„œλ²„μ— λ³΄λ‚΄κ±°λ‚˜ watch와 같은 κ³ κΈ‰ 속성을 μ΄μš©ν•˜μ—¬ μΆ”κ°€ λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€ -->
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    new Vue({ 
        el:'#app',
        data: {
            message: 'Hello Vue!'
        },
        watch: {
            message: function(data){
                console.log("message의 값이 λ°”λ€λ‹ˆλ‹€ :", data);
            }
        }
    });
</script>



μ°Έκ³  do it vue.js

profile
κ°œλ°œλŒ•λ°œ

0개의 λŒ“κΈ€