국비교육(22-23)

38일차(2) : Vue.js 예제(1)

서리/Seori 2022. 12. 1. 00:02

38일차(2) : vue.js 예제

 

Vue.js : 자바스크립트 라이브러리. jQuery 보다 사용범위가 넓다.

 

- vue js 홈페이지 : 링크

 

- vue를 부분적으로 사용하는 법을 익힐 예정!

- 폼 검증, validation 하는 방법 등을 vue로 수정할 것

 

 


 

<hello>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/vue/hello.html</title>
</head>
<body>
	<h1>vue js 사용하기</h1>
	<div id="app">
		<p>오늘의 운세 : <strong>{{ fortune }}</strong></p>
		<p>내 이름은 : <strong>{{ myName }}</strong></p>
		<button v-on:click="clicked">눌러보셈</button>
		<button v-on:click="clicked2">이름 바꾸기</button>
		<br />
		<input type="text" v-model="msg"/>
		<p>{{msg}}</p>
		<ul>
			<li v-for="item in nums">{{item}}</li>
		</ul>
		
	</div>
	<div>
		<input type="text" id="inputMsg"/>
		<p id="result"></p>
	</div>
	<script>
		document.querySelector("#inputMsg").addEventListener("input", function(){
			document.querySelector("#result").innerText=this.value;
		});
	</script>
	<!-- vue js 로딩하기 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<script>
		// Vue 객체를 생성하면서 object 전달하기 
		new Vue({
			el:"#app",
			data:{
				fortune:"동쪽으로 가면 귀인을 만나요!",
				myName:"바나나",
				msg:"",
				nums:[10, 20, 30]
			},
			methods:{
				clicked:function(){
					//alert("오잉?");
					this.fortune="오후에도 vue 를 배우게 될거에요";
				},
				clicked2:function(){
					//this.myName="에이콘";
					this.nums=["바나나", "딸기", "복숭아"];
				}
			}
		});
	</script>
</body>
</html>

 

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

- vue와 관련된 외부 자바스크립트를 로딩해서 사용 (js 라이브러리)

 

- <script> 안에서 vue 객체를 생성하면서 오브젝트를 전달하면 어떤 동작을 해준다

 

- Vue({}) 객체 안에는 key : value 형태로 object 값이 들어가 있다.

 

 

- 오른쪽이 원본. 브라우저에서 로딩하면서 왼쪽과 같이 바뀐 것이다.

- vue 코드가 없으면 작동하지 않는다.

 

- data 라는 방에 있는 object들의 'fortune' 방에 들어있는 내용을 내보내고 싶다면,

  vue 객체를 생성하고, {{ }} 안에 키 값(fortune)을 넣어주면 값이 출력된다.

 

v-on: click=""

- vue에서 click 이벤트 발생시 함수 실행시키는 방법!

 

- Vue 객체의 methods: { } 라는 방 안에 함수가 들어있다. 

- 클릭시 this.fortune 의 값을 수정하는 함수이다.

 

 

- "clicked" 가 지정된 요소 클릭시, fortune 이라는 키를 가진 곳에 값을 넣어주는 함수가 실행된다.

 

 <input type="text" v-model="msg"/>

- msg가 수정되면 UI <p> 에 자동반영 

- 원래는 input요소에 읽어온 내용을 .value해서 읽어와야 하는데, 그냥 자동으로 읽어온다.

 

<li v-for="item in nums">{{item}}</li>

- 아래에서 nums 배열을 찾을 수 있다. nums:[10, 20, 30]

- 아래에서 this.nums 로 모델이 변경되면 반복문을 다시 돌아서 UI에 출력해낸다.

 

- 클라이언트 사이드에서도 출력되는 정보를 조작할 수 있다.

  데이터만 있으면 얼마든지 브라우저에 찍어낼 수 있다.

 

 

<div id="app">

el:"#app",

- Vue 함수의 작업을 어디에 적용시킬지 정하는 기준이 되는것이 #app이다.

- 저 div 안에서 일어나는 일을 vue 로 관리하겠다는 것이다.

- 바로 출력되는 코드도 있고 동작을 준비하는 코드도 있다.

 

- ajax처럼 주소 이동 없이 어떤 값을 읽어와서, 브라우저 안의 모델에 바로 덮어씌운다.(새로고침한 것처럼 보인다)

- 클라이언트 side에서도 작업할 수 있다. ( client side rendering <-> server side rendering ) 

- 과거에는 서버 side 가 비중이 높았으나, 최근 클라이언트 side 의 비중이 높아지는 중이다.

- json으로 데이터만 전달해주면 클라이언트 사이드에서 데이터를 받아서 html요소들을 만들어낼 수 있다.

 


 

<Step01_event>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step01_event.html</title>
</head>
<body>
    <h1>이벤트 테스트</h1>
    <div id="app">
        <!--
            v-on:이벤트명="methods object 에 있는 호출될 함수명"
        -->
        <button v-on:click="clicked">눌러보셈</button> 
        <p>{{msg}}</p>
    </div>
    <div>
    	<button onclick="clicked()">눌러보셈2</button>
    	<p id="one"></p>
    </div>
    <script>
    	//msg라는 변수를 만들고 초기값을 지정한다.
    	let msg="";
    	//msg 변수 안에 있는 값을 id가 one인 요소의 innerText로 출력한다(당연히 아무것도 출력되지 않음)
    	document.querySelector("#one").innerText=msg;
    	//버튼을 눌렀을 때 호출되는 함수
    	function clicked(){
    		//msg 변수 안에 있는 값을 바꾼다.(이걸 바꾼다해서 p요소의 innerText가 자동으로 바뀌지는 않는다.)
    		msg="버튼을 눌렀네여?"
    		//p요소의 innerText가 수정되기 우해서는 아래의 코드가 필요하다.
    		document.querySelector("#one").innerText=msg;
    	}
    </script>
    
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app=new Vue({
            el:"#app",
            data:{
                msg:""
            },
            methods:{
                clicked:function(){
                    console.log("버튼을 눌렀네요?");
                    //data object 안에있는 msg 참조 
                    this.msg="버튼을 눌렀네요?";
                }
            }
        });
    </script>
</body>
</html>

 

- div id="app" 안에서 사용되는 데이터는 여러가지 타입의 데이터(String, Object, Array, ...)

그 데이터는 object 형태로 data:{ } 안의 방에 넣어두면 된다.

 

- 이 'msg'를 모델명이라고 한다.

- 내용이 수정되면 {{msg}} 에 출력된다. (이 모델의 데이터가 바뀌면 바로 업데이트된다.)

 

- this.모델명 으로 함수 안에서 자신을 가리킬 수 있다.

- 함수 안에서 내용을 수정해주면 UI ( {{msg}}부분 ) 는 바로 업데이트된다.

 

<div>
    <button onclick="clicked()">눌러보셈2</button>
    <p id="one"></p>
</div>
<script>
    //msg라는 변수를 만들고 초기값을 지정한다.
    let msg="";
    //msg 변수 안에 있는 값을 id가 one인 요소의 innerText로 출력한다(당연히 아무것도 출력되지 않음)
    document.querySelector("#one").innerText=msg;
    //버튼을 눌렀을 때 호출되는 함수
    function clicked(){
        //msg 변수 안에 있는 값을 바꾼다.(이걸 바꾼다해서 p요소의 innerText가 자동으로 바뀌지는 않는다.)
        msg="버튼을 눌렀네여?"
    }
</script>

- 순수 javascript로 작성한 형태

- 페이지 로딩시점에는 아무 값도 없다.(let msg=""; 이므로)

- 변수 안에 있는 값을 바꾼것뿐, innertext를 바꾼게 아니므로 뭔가가 달라지지는 않는다.

 

document.querySelector("#one").innerText=msg;

- 값이 바뀐 이후에, 위 코드를 추가해서 값을 대입해주어야 한다.

- 이 대입하는 과정이 없고 바로 수정 내용이 적용되는 것이 vue의 특징!

 

- 그런데 vue를 사용하면, 자동으로 바뀌는 것을 볼 수 있다.

- 저 대입해주는 과정 없이도 업데이트된다!

 

- 버튼을 눌러서 모델의 데이터만 바뀌었는데도 {{ }} 안쪽의 UI가 자동으로 업데이트되었다는 느낌 (자동반영)

- 배열의 데이터가 바뀌면 반복문도 다시 돌아가며 UI가 바뀐다.

 

- 모델이 바뀌니까 모델을 사용하는 UI가 자동으로 업데이트되는 것이다.

- 지정된 모델의 값을 변경해버린다.

 

- 값 변경, 클래스 추가/제거 등등... 모델의 데이터를 바꾸는 일만 해도 UI가 바뀐다는 것은 매우 편리하다.

- 모델 변경이 일어나면 UI를 다시 만들어준다.

 

 

<button v-on:click="함수명">  

<button v-on:click="함수명()"> 

- vue 함수사용 작성법: 버튼 클릭시 발생하는 함수 - 위에서 " " 안에 함수명만 적어주면 된다.

- ()도 생략가능! 전달할 값이 있는 경우에만 ( ) 에 넣어주면 된다.

 


 

Step01_event2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step01_event2.html</title>
</head>
<body>
    <h1>이벤트 테스트2</h1>
    <div id="app">
        <button v-on:click="increase">+</button>
        <button v-on:click="decrease">-</button>
        <p>{{count}}</p>
    </div>
   
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
    
   
        let app=new Vue({
            el:"#app",
            data:{
               count:0
            },
            methods:{
                increase:function(){
                    this.count++;
                },
                decrease:function(){
                    this.count--;
                }
            }
        });
    </script>    
</body>
</html>

- UI를 업데이트하기 위한 코드가 별도로 없다.

- 내용이 바뀌면 그냥 자동으로 업데이트해준다!

 

- 또한 let app=new Vue({}) 로 작성하는데,

 꼭 객체를 담을 필요는 없다. new Vue({}) 만 해도된다.

 


 

Step01_event3

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step01_event3.html</title>
    <style>
        .box{
            width: 500px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>
    <h1>이벤트 테스트3</h1>
    <div id="app">
        <div class="box" v-on:mousemove="moved">
            x : <strong>{{x}}</strong>
            <br>
            y : <strong>{{y}}</strong>
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
    	
        let app=new Vue({
            el:"#app",
            data:{
               x:0,
               y:0
            },
            methods:{
                //함수에는 이벤트 객체가 전달된다. 
                moved:function(e){
                    console.log(e);
                    //이벤트가 일어난 곳의 좌표를 x, y 에 넣어준다.
                    this.x=e.offsetX;
                    this.y=e.offsetY;
                }
            }
        });
    </script>    
</body>
</html>

 

- x,y라는 모델을 사용

 

v-on: 이벤트명 = "함수명"

- event name이라는 이벤트가 일어났을 때 f라는 함수를 호출할 것이다.

 

 

- 매개변수(e)의 이름은 무엇이든 상관없다.

- 매개변수를 통해서 생겨난 값만 참조해서 읽어오고, 필요한 값을 추출한다. ui가 자동으로 업데이트되도록!

 


 

Step01_event4

- 동일한 함수를 호출하도록 했다.

 

- e.target : 이벤트가 발생한 바로 그 문서 객체의 참조값

- this가 아니라 매개변수 e 를 사용해서 타겟을 지정

 

- 콘솔창에서 이벤트 객체의 target 을 확인 가능하다.

- 이벤트가 일어난 바로 그 div에 변화를 주고싶다면 e.target 에 코드를 작성

 


 

Step01_event5

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step01_event5.html</title>
</head>
<body>
    <h1>이벤트 테스트5</h1>
    <div id="app">
        <form action="test.jsp" v-on:submit="onSubmit">
            <input type="text">
            <button type="submit">전송</button>
        </form>
        <br>
        <!-- .prevent 수식어를 이용해서 기본 이벤트 막기 -->
        <form action="test.jsp" v-on:submit.prevent="onSubmit2">
            <input type="text">
            <button type="submit">전송</button>
        </form>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app=new Vue({
            el:"#app",
            data:{

            },
            methods:{
               onSubmit:function(e){
                   //기본 이벤트를 막아서 폼이 제출되지 않도록 한다.
                   e.preventDefault();
               },
               onSubmit2:function(){

               }
            }
        });
    </script>    
</body>
</html>

 

- submit을 막는 방식이 두가지 있다.

- vue를 사용해서 폼 전송을 막아버린 상태이다.

 

<form action="test.jsp" v-on:submit="onSubmit">

1) 폼에 submit 이벤트가 일어났을 때, 특정 함수(onSubmit) 호출

  그 함수 안에서 e.preventDefault();

 

<form action="test.jsp" v-on:submit.prevent="onSubmit2">

2) <form> 안에서 기본 이벤트를 막는다.

 폼 전송을 막아둔 상태로, 원하는 작업은 함수 안에서 처리한다.

 

- submit 이벤트의 수식어 prevent를 이용한다 고 한다.

 

 

<xxx v-on:event name="method name">

- vue이벤트가 일어날때 어떤 함수를 실행하고 UI 적용하기

 


 

Step02_model.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step02_model.html</title>
</head>
<body>
    <h1>v-model 사용하기</h1>
    <div id="app">
        <!-- input 요소의 value 를 msg 라는 모델명으로 사용하겠다 -->
        <input type="text" v-model="msg" > 
        <p>{{msg}}</p>
        <!-- p 요소의 innerText 에 msg 라는 모델 안에 들어 있는 값을 넣기 -->
        <p v-text="msg"></p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app=new Vue({
            el:"#app",
            data:{
              msg:""
            },
            methods:{
              	
            }
        });
    </script>    
</body>
</html>

 

 읽어오는 코드가 없다. " "

- 하지만 모델명을 지정하는 것만으로도 자동으로 읽어오도록 한다. UI에 자동 업데이트도 된다.

 

- 클라이언트가 뭘 입력할지는 모르겠지만 모델명은 msg이다.

- 혹시 내용이 바뀌면 바로 적용한다. (출력하는 방법은 1){{msg}} 2)v-text 두가지이다.)

v-model : 클라이언트가 입력하거나, 선택하거나, 수정할 수 있는 모델에다가 모델명을 지정

 

- 회원가입 폼: 입력한 어떤 값을 읽어와서 변수에 담아서 사욯한다.

- Vue에서는 자동으로 반영해주므로 이렇게 읽어오는 코드 자체가 필요없다.

 

- vue만의 속성들!

v-on : 이벤트 출력(실행)

v-text : innerText 출력

v-model : 모델 출력

 


 

Stpe02_model2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Step02_model2.html</title>
</head>
<body>
    <h1>v-model 사용하기2</h1>
    <div id="app">
        <input type="text" v-model="msg">
        <br>
        <!-- 체크박스에 모델을 지정하면 체크 여부가 boolean 값으로 관리가 된다. -->
        <input type="checkbox" v-model="isChecked">
        <br>
        <!-- select 에 모델을 지정하면 선택한 option 의 vaule 가 모델의 값으로 관리가 된다. -->
        <select v-model="lunch">
            <option value="">선택</option>
            <option value="ramen">라면</option>
            <option value="kimbap">김밥</option>
            <option value="dduk">떡복기</option>
        </select>
        <br>
        <textarea v-model="comment"></textarea>
        <br>
        <!-- 
            boolean 값으로 관리 하지 않고 
            원하는 문자열 값으로 관리하기 
        -->
        <input type="checkbox" 
            v-model="isRun" 
            true-value="yes"
            false-value="no">
        <p>
            msg : <strong>{{msg}}</strong>
            <br>
            isChecked : <strong>{{isChecked}}</strong>
            <br>
            lunch : <strong>{{lunch}}</strong>
            <br>
            comment : <strong>{{comment}}</strong>
            <br>
            isRun : <strong>{{isRun}}</strong>
        </p>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        let app=new Vue({
            el:"#app",
            data:{
                msg:"",
                isChecked:true,
                lunch:"",
                comment:"",
                isRun:"no"
            },
            methods:{
              
            }
        });
    </script>    
</body>
</html>

- 모델에서 선택한 값을 아래에서 출력하기.

 

- v-model로 지정된 모델명들

- 선택옵션은 선택한 option의 value=" " 값을 가져온다.

 

- checkbox는 기본적으로 true/false값을 가져온다.

 

 

true-value="yes"
false-value="no" 

- value를 다르게 지정하면 다른 값을 가져오게도 할 수 있다.