data: function(){}
객체의 메서드를 축약할 수 있음 => data(){}
, methods 객체형 프로퍼티 추가 -> html에서 등록한 함수를 사용할 수 있다!v-model=""
로 연결, v-on:click=""
v-for=""
: 요소를 여러번 복제할 수 있다. wow~! ex) <li v-for="goal in goals">{{ goal }}</li>
Vue.createApp({
data() {
return {
goals: [],
enteredValue: "",
};
},
methods: {
addGoal() {
this.goals.push(this.enteredValue);
},
},
}).mount("#app");
// .mount() : DOM의 요소를 선택해 Vue앱이 페이지 어느 부분을 조정할지 Vue에 알려줘야 한다.
<body>
<div id="app">
<div>
<label for="goal">Goal</label>
<input type="text" id="goal" v-model="enteredValue" />
<button v-on:click="addGoal">Add Goal</button>
</div>
<ul>
<li v-for="goal in goals">{{ goal }}</li>
</ul>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="app.js"></script>
</body>
const app = Vue.createApp({
data() {
return {
courseGoals: ["vue 기본 배우기!"],
htmlGoal: "<h2>html로 인식해주세요!</h2>",
vueLink: "https://vuejs.org/",
};
},
methods: {
outputGoal() {
const randomNum = Math.random();
if (randomNum > 0.5) return "vue 더 배워!";
else if (randomNum === 0.5) return this.courseGoals;
else return "잘 하구 있구만~~";
},
},
});
app.mount("#user-goal");
...
<section id="user-goal">
<h2>My Course Goal</h2>
<p>{{ courseGoals[0] }}</p>
<p>{{ outputGoal() }}</p>
<p v-html="htmlGoal"></p>
<p><a v-bind:href="vueLink">Vue</a>의 공식 문서</p>
</section>
...
const app = Vue.createApp({
data() {
return {
counter: 0,
firstName: "",
lastName: "",
};
},
methods: {
incerement() {
this.counter += 1;
},
decerement() {
this.counter -= 1;
},
setFirstName(event, defaultValue) {
this.firstName = defaultValue + " " + event.target.value;
},
setLastName(event) {
this.lastName = event.target.value;
},
},
});
app.mount("#events");
<section id="events">
<h2>Events in Action</h2>
<!-- HTML코드는 출력에 집중해야하기 때문에 js파일에서 수행하는것이 좋음! -->
<button v-on:click="counter++">Add</button>
<button v-on:click="counter--">Remove</button>
<button v-on:click="incerement">Add(fn)</button>
<button v-on:click="decerement">Remove(fn)</button>
<p>Result: {{ counter }}</p>
<p v-once>Starting Count: {{ counter }}</p>
<!-- event중에 input이란 이벤트가 있음!-->
<input type="text" v-on:input="setFirstName($event, '저의 이름은')" />
<input type="text" v-on:input="setLastName" />
<!-- $event : vue에서 제공하는 예약된 이름이며, 브라우저를 통해 자동으로 얻는 기본 내장 이벤트 객체에 대한 엑세스를 제공합니다. -->
<p>Your name: {{ firstName }} {{ lastName }}</p>
</section>
v-on:input, v-bind:vlaue의 축약어이다!
👾 예시
<!-- <input :value="enteredGoalValue" @input="setGoal" type="text" /> -->
<input v-model="enteredGoalValue" type="text" />
<button @click="addGoal">Add Goal</button>
const app = Vue.createApp({
data() {
return {
enteredGoalValue: "",
goals: [],
};
},
methods: {
// setGoal(event) {
// this.enteredGoalValue = event.target.value;
// },
addGoal() {
this.goals.push(this.enteredGoalValue);
},
},
});
데이터 프러퍼티
처럼 사용하기 때문에 함수명을 명사로 지어야함.watch(newValue, oldValue){...}
🔥결론
=> 이벤트 바인딩에는 메서드(methods)를, 다른 데이터의 의존하는 데이터 출력엔 연산(computed) 프러퍼티, HTTP나 타이머 설정, 로컬스토리지에 데이터를 저장하는 작업은 감시자(watch) 프로퍼티를 사용한다!!
@ === v-on ex) v-on:click="..." === @click="..."
: === v-bind ex) v-bind:value="..." === :value="..."
app.js
const app = Vue.createApp({
data() {
return {
counter: 0,
name: "",
fullName2: "",
};
},
watch: {
name(value) {
// ⭐️ name값이 변경 될 경우 이 함수는 재실행 됨.
console.log("watch 메서드가 재실행 됩니다!");
if (this.name === "") this.fullName2 = "";
else this.fullName2 = value + " " + "watch default value";
},
counter(value) {
// counter와 같은 기능에 더 적합함
if (value > 5) this.counter = 0;
if (value > 3)
setTimeout(() => {
this.counter = 0;
}, 2000);
},
},
computed: {
fullName() {
// 데이터 프러퍼티처럼 사용하기 때문에 함수명을 명사로 지어야함.
console.log("computed 메서드가 재실행 됩니다!");
if (this.name === "") return "";
else return this.name + " " + "computed default value";
},
},
methods: {
incerement() {
this.counter += 1;
},
decerement() {
this.counter -= 1;
},
setName(event, defaultValue) {
this.name = defaultValue + " " + event.target.value;
},
resetName() {
this.name = "";
},
outputFullName() {
console.log("재실행 됩니다!"); // count가 변경 될 때도 해당 함수가 재실행 됨!
if (this.name === "") return "";
else return this.name + "default value";
},
},
});
app.mount("#events");
<section id="events">
<h2>Events in Action</h2>
<button v-on:click="incerement">Add(fn)</button>
<button v-on:click="decerement">Remove(fn)</button>
<p>Result: {{ counter }}</p>
<p v-once>Starting Count: {{ counter }}</p>
<!-- reset input 버튼을 클릭하면 name, input모두 reset된다.-->
<!-- <input
type="text"
v-bind:value="name"
v-on:input="setName($event, '저의 이름은')"
/> -->
<input type="text" v-model="name" />
<button v-on:click="resetName">Reset input</button>
<!-- <p>{{ outputFullName() }}</p> -->
<p>{{ fullName }}</p>
<p>{{ fullName2 }}</p>
<p>Your name: {{ name + ' ' + 'default value'}}</p>
</section>
v-bind:style="{}"
을 사용하여 동적스타일링을 할 수 있다.v-bind:class=""
v-bind:class={}
: 가독성에 좋다, 배열로 클래스를 여러개 설정할 수 있다.
⭐️ 하드코딩된 class속성과 동적 클래스 바인딩을 같이 사용할 수 있다, vue가 동적 클래스 바인딩 결과를 먼저 평가한 다음에 하드코딩된 클래스와 병합하게 된다.
app.js
const app = Vue.createApp({
data() {
return {
boxASelexted: false,
boxBSelexted: false,
boxCSelexted: false,
boxDSelexted: false,
};
},
methods: {
boxSelected(box) {
if (box === "A") this.boxASelexted = true;
else if (box === "B") this.boxBSelexted = true;
else if (box === "C") this.boxCSelexted = true;
else if (box === "D") this.boxDSelexted = true;
},
},
});
app.mount("#styling");
<section id="styling">
<div
class="demo"
:style="{borderColor: boxASelected ? 'red' : '#ccc'}"
@click="boxSelected('A')"
></div>
<div
:class="boxBSelected ? 'demo active' : 'demo'"
@click="boxSelected('B')"
></div>
<div
:class="{demo: true, active: boxCSeleted}"
@click="boxSelected('C')"
></div>
<!-- 동적 클래스 바인딩을 같이 사용할 수 있다, vue가 동적 클래스 바인딩 결과를 먼저 평가한 다음에 하드코딩된 클래스와 병합하게 된다. -->
<div
class="demo"
:class="{active: boxDSeleted}"
@click="boxSelected('D')"
></div>
<div :class="['demo',{active: boxESeleted}]" @click="boxSelected('E')"></div>
</section>
v-if, v-else, v-else-if
디렉티브로 js와 비슷하게 if문을 사용할 수 있다.v-show
를 사용할 수 있지만 v-else, v-else-if를 같이 사용할 수 없다. v-if와의 차이점으로는 조건부렌더링을 할때, v-if는 dom에서 완전 제거하고, v-show는 dom에 제거하지않고 display:none으로 변경되어 보이지 않게 된다. v-show는 성능에 영향을 주지 않는다. 하지만 평소에는 v-if를 사용하는 것이 좋고, 가시성 상태가 자주 바뀌는 요소(토글)가 있을 경우 v-show를 사용하는 것이 좋다.v-for="item in arr"
로 데이터 프로퍼티를 출력할 수 있다. index 출력을 위해 (item, idx) in arr
로 작성하면 된다. 객체 또한 출력이 가능한데 value만 출력된다. (value, key, index) in obj
로 key 또한 출력 가능하다.v-for="num in 3"
으로 하면 1-3까지 출력이 가능하다.<li v-for="(item, idx) in arr">{{ item }} - {{ idx }}</li>
<li v-for="(value, key) in {name: 'Mark', age: 25}">{{ value }} - {{ key }}</li>
// Mark - name \n 25 - age 출력
:key=""
를 추가해야 하는데, key
는 출력하는 모든 항목에 대해 고유 식별 기준으로 작용하게 한다. key를 사용해야 dom을 재사용하는 vue가 각각의 요소들을 식별하여 업데이트를 수행할 수 있다.