Vue 시작하기 + 기초 디렉티브(text, bind, model, if, for, on)

 

Vue 카테고리 추가! 앞으로 Vue 공부한 내용을 정리해서 올려야지

 

 

Vue 는 무엇인가?

MVVM 패턴의 뷰 모델(ViewModel) 레이어에 해당되는 화면(View)단 라이브러리

 

특징 1 : DOM Listeners - 사용자의 입력 이벤트를 Listener가 받고 자바스크립트 특정 로직을 실행

특징 2 : Data Bindings - 데이터가 바뀌면 데이터 바인딩으로 화면에 반영

특징 3 : Reactivity (반응성) - 데이터의 변화를 라이브러리에서 감지해서 바로 화면에 그려짐

 


 

0. Vue 시작하기

일단 스크립트로 vue 불러오기

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

 


1. Vue 인스턴스 생성해보기

<script>
    new Vue({
        el : "#main",
        data : {
            title : "Hello, Vue~!! 벌써어렵네",
            myName : "김태태태",
            sample_text : "이곳은 sample_text 영역~~~~!"
        }
    })
</script>

 

el : "#main" → 엘리먼트는 #main
즉, 아이디 선택자가 #main인 문서 객체를 지정 + 거기에 vue 인스턴스 생성

data : { 어쩌구 }문서 내부에 전달할 데이터 값들은 data에 넣기

 

이렇게 vue 인스턴스 생성을 했으면

아이디 선택자인 #main 문서를 구성해보자

 

 

2. mustache {{ }} 아니면 v-text

<div id="main">
    <p>{{title}}</p>
    <h3>나의 이름은 {{myName}}</h3>
    <hr>
    <h3 v-text="sample_text"></h3>
</div>

 

{{title}} → Vue라는 인스턴스의 title의 value 값태그 내부 텍스트 영역에 넣을 때 사용
{{ }} 이게 콧수염 같다고 해서 mustache 라고 함 ㅋㅋ

v-text="sample_text" → 콧수염({{ }}) 말고도 v-text 라는 디렉티브 활용하여

속성이 참조하는 문자열 표현이 가능!

 

페이지에 이렇게 출력이 된다



3. v-bind

v-bind 디렉티브
Vue 인스턴스 내부에서 선언된 data의 속성값들을
변수처럼 사용하여 HTML 문서상에 문자열로 표현한다. 그리고 지정된 자리에 넣는다.

바인드로 사진을 첨부해보자!

const app = new Vue({
    el : "#app",
    data : {
        imgSrc : "kakao.jpg",
        altText : "카카오 이미지",
    }
});

 

데이터로 사진 파일명과 alt정보를 담음

 

<div id="app">
	<!-- bind 활용 X -->
    <img src="./img/kakao.jpg" style="height:100px" alt="카카오 이미지">
</div>

 

원래는 이렇게 해야하지만 ....

 

<div id="app">
	<!-- bind 활용 O -->
    <img v-bind:src="'./img/'+imgSrc" style="height:100px" :alt="altText">
</div>

 

bind를 활용하여 이렇게 표현이 가능하다

자세히 보면 ... 

v-bind:src="'./img/'+imgSrc" → imgSrc를 변수명처럼 활용하였다!
문자열에 ' ' 붙히는 것 주의!

 

<div id="app">
	<!-- bind 활용 O + 생략 -->
    <img :src="'./img/'+imgSrc" style="height:100px" :alt="altText">
</div>

 

또한 v-bind를 생략하여 이렇게도 사용할 수 있다!

 


4. v-model

v-model 디렉티브
어떤 입력값에 대한 내용을 실시간으로 표시하는 양방향 데이터 전달이 가능

 

양방향인게 뭐냐면 ...

const vue1 = new Vue({
    el : "#main",
    data : {
        message : "아래 입력상자에 구문을 작성해 보세요!"
    }
});
<div id="main">
    <p>{{message}}</p>
    <input type="text" v-model:value="message">
</div>

 

vue의 message가 p태그에 출력이 되는 방식인데
input태그의 value가 v-model로 되어 잇어서
해당 value를 수정하면 vue의 data가 연동

 

그래서 원래는 이런식으로 작성되어 있었는데

입력 상자 내용을 바꾸면 

 

바로바로 연동이 되서 p태그 속 내용도 바뀐다!

 

v-bind와 비교
v-bind : 단방향 데이터 바인드 (한번 던지면 끝)
v-model : 양방향 데이터 바인드

 

<input type="text" v-bind:valuer = "sData"> → sData 값을 문서의 input 영역의 속성값 전달하고 종료

<input type="text" v-model:valuer = "sMG"> → sMsg  값을 지정된 위치와의 연동이 가능

 

 

5. v-if 디렉티브

v-if 디렉티브
태그 내부에서 선언하고 그 값의 true 또는 false의 결과에 따라서
화면에 보여줄지 말지를 결정

 

const app = new Vue({
    el : "#app",
    data : {
        bool : true
    }
});

data bool이 true인 상황

 

<div id="app">
    <button v-if="bool">true</button>
    <button v-else>false</button>
</div>

<button v-if="bool"> → bool 이 트루면 이 버튼
<button v-else> → 아니면 이 버튼으로 출력

지금은 true 이기 때문에

true 버튼이 출력 되었다.

 


6. v-for 디렉티브

v-for 디렉티브
넣을 데이터를
하나씩 꺼내어 지정된 장소에 위치시킬 때 사용

 

const main = new Vue({
    el : "#main",
    data : {
        Fruits : [
            {fruitItem : "사과", fruitPrice : "2,000원"},
            {fruitItem : "바나나", fruitPrice : "1,500원"},
            {fruitItem : "수박", fruitPrice : "800원"},
            {fruitItem : "오렌지", fruitPrice : "3,000원"},
            {fruitItem : "자몽", fruitPrice : "200원"},
        ]
    }
});

과일명과 가격

 

<div id="main">
    <h2>좋아하는 과일을 순서대로 나열하기</h2>
    <ol>
        <li v-for="i in Fruits">
            {{i.fruitItem}} ({{i.fruitPrice}})
        </li>
    </ol>
</div>

<li v-for="i in Fruits"> for in 활용하여

 

모든 데이터를 하나씩 출력하였다.

 

 

for in 은 객체 내부 프로퍼티 값 하나씩 다루기 때문에

const app = new Vue({
    el : "#app",
    data : {
        cities : [
            "서울", "제주", "부산", "벤쿠버", "도쿄"
        ]
    }
});

 

이러한 데이터를 다루려면

 

<ul>
    <li v-for="i in cities">
        {{i}}
    </li>
</ul>

 

이렇게 그냥 i 만 출력하면 된다

 

 

또한

const app = new Vue({
    el : "#app",
    data : {
        kakao : [
            {image : "img1.png", title : "첫눈"},
            {image : "img2.png", title : "휴가"},
        ]
    }
});
<div class="kakao_case">
    <div v-for="v of kakao">
        <img :src="'./img/'+v.image" alt="">
        <h4>{{v.title}}</h4>
    </div>
</div>

<div v-for="v of kakao"> → 이렇게 for of를 활용할 수도 있따

 


7. v-on 디렉티브

v-on 디렉티브
 Vue 인스턴스 내부에서 발생하는 사용자의 액션에 의한 이벤트를 제어하는 형식

v-on:이벤트명 = "함수호출명" 
이건 마치 onclick="함수호출명()" 과 비슷하다 

 

<div id="app">
    <h3>{{resultMsg}}</h3>
    <button v-on:click="funcChange1">클릭 이벤트 발생</button>
    <button v-on:mouseover="funcChange2" v-on:mouseout="funcChange3">마우스 이벤트 발생</button>
</div>

 

<button v-on:click="funcChange1">클릭이벤트일때

<button v-on:mouseover="funcChange2"> → 마우스오버일때

<button v-on:mouseout="funcChange3"> → 마우스아웃일때

각각 funcChange1, 2, 3 메소드를 호출한다.

 

이에 대한 함수는 method 속성에 작성한다!

const app = new Vue({
    el : "#app",
    data : {
        resultMsg : "아래의 이벤트를 적용하세요"
    },

    // 함수 구문을 작성한다.
    methods : {
        // 클릭 이벤트
        funcChange1(){
            this.resultMsg = "☆☆☆클릭했네요☆☆☆";
        },
        funcChange2(){
            this.resultMsg = "○○○마우스가 왔네요○○○";
        },
        funcChange3(){
            this.resultMsg = "●●●마우스가 갔네요●●●";
        }
    }
});

 

data 부분에서의 resultMsg를

this를 활용해서 지정했기에
이제 클릭하거나 마우스 이벤트마다 h3 텍스트 부분이 바뀐다.

 

이 상태에서 ...

 

클릭 마우스오버 마우스아웃


또한

 

<div id="main">
    <img @mouseover="overImg" @mouseout="outImg" :src="'./img/'+ kakaoImg" alt="">
</div>

 

v-on: 문구 대신에  @ 으로 축약할 수 있음

'🧠 저장 > Vue' 카테고리의 다른 글

axios 간단 정리  (0) 2023.12.13
router 간단 정리  (0) 2023.12.10
컴포넌트끼리 통신 방법 (props, event emit)  (0) 2023.12.07
전역 컴포넌트, 지역 컴포넌트  (0) 2022.09.29
method 속성, computed 속성  (0) 2022.09.22