v-if /v-for/ v-on event
2024. 3. 13. 18:00ㆍDaily Codig Reminder
<template>
<div>
dummy
<p v-if="3<1">hello1</p>
<!--렌더링안됨-->
dummy
<hr>
dummy
<p v-show="num>=num2">hello2</p>
dummy
<hr>
<p v-if="num>num2&& 3==3">hello3</p>
<p v-show="num<num2&& 3==3">hello4</p>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
//mesg:String
},
data: function(){
return{
num:10,
num2:5
}
}
}
</script>
<style>
</style>
<template>
<div>
<h1>{{ amount }}</h1>
<input type="text" v-model="amount">
<span v-if="amount<100">100보다 큰 값만 입력 가능</span>
<span v-if="amount>=100">정상적으로 입력</span>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
//mesg:String
},
data: function(){
return{
amount:0
}
}
}
</script>
<style>
</style>
directive05_exam5
<template>
<div>
<h1>exam</h1>
이름: <input type="text" v-model="username">
<span v-if="username.length>4">이름은 4글자</span>
<span v-if="amount>=100">정상적으로 입력</span><br>
나이: <input type="text" v-model="age">
<span v-if="age>10&&age<=120">10살보다 크거나 120살보다 작은 값만 입력가능</span>
<hr>
이름길이 :{{ username.length }}, 나이: {{ age }}
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
//mesg:String
},
data: function(){
return{
username:"",
age:""
}
}
}
</script>
<style>
</style>
elseif
<template>
<div class="hello">
점수:<input type="text" v-model.number="grade"/><br>
점수는: {{ grade }}<br>
<p v-if="grade>90">A학점</p>
<p v-if="grade>80">B학점</p>
<p v-if="grade>70">C학점</p>
<p v-else>F학점</p>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
msg:String
},
data:function(){
return{
grade:50
}
}
}
</script>
<style>
</style>
<template>
<div>
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld';
export default {
components:{
HelloWorld
}
}
</script>
<style>
</style>
<template>
<div>
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld';
export default {
components:{
HelloWorld
}
}
</script>
<style>
</style>
v-for array
<template>
<div class="hello">
{{ names }}
<!--v-for 의 배열의 경우 사용-->
<!--v-for ="context in contexts" v-bind:key="유일값"-->
<!--v-for="(contect, index ) in 객체 " :key="유일값"-->
<h1>index 없이</h1>
<ul>
<li v-for="name in names" :key="name">-
<!--<li v-for="name in names">-->
<!--key 값 바인드 없이 출력가능-->
{{ name }}
</li>
</ul>
<h1>index 지정</h1>
<ul>
<li v-for="(name, index) in names" v-bind:key="index">
{{ index }}: {{ name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
},
data:function(){
return{
names:["홍길동","이순신","유관순"]
}
}
}
</script>
<style>
</style>
v-for (img, select,div 그룹핑
img-bind
<template>
<div id="app">
<BookList v-bind:bookList="list"/>
</div>
</template>
<script>
import BookList from './components/BookList';
export default {
name: 'App',
components: {
BookList
},
data:function(){
return{
list:[
{
id:"p01",name:"위험한 식탁",price:1000, date:"20170401", img:"a"
},
{
id:"p02",name:"공부의 비결",price:3000, date:"20170402", img:"b"
},
{
id:"p03",name:"오메르타",price:4000, date:"20170403", img:"c"
},
{
id:"p04", name:"행복한 여행", price:5000, date:"20170404", img:"d"
},
{
id:"p05", name:"해커스 토익", price:6000, date:"20170405", img:"e"
},
{
id:"p06", name:"도로 안내서", price:7000, date:"20170406", img:"f"
}
]
}
}
}
</script>
<style>
</style>
./components/BookList.vue
<template>
<div>
BookList
<h1>도서목록 {{bookList.length}}</h1>
<ul>
<li v-for="book in bookList" v-bind:key="book.id">
<!--v-ind:key="유일값"-->
<img v-bind:src="require(`@/assets/image/${book.img}.jpg`)" width="100">
<!--이미지 경로가 src/assets/images/IMG1.png 일때
vue 에서는 @/assets/images/IMG1.png 로 src를 절대경로로 사용할 수 있다.-->
{{ book.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
bookList:Array
}
}
</script>
<style>
</style>
<li v-for="(value,key) in person " v-bind:key="key">
<template>
<div>
HelloWorld
<!--v-for 객체의 경우 사용-->
<!-- v-for ="(value. key) in 객체" v-bind:key="유일값"-->
<!-- v-for ="(value, key, index) in 객체 ":key= "유일값"-->
<h1>객체의 사용</h1>
<ul>
<li v-for="(value,key) in person " v-bind:key="key">
{{ key }}:{{ value }}
</li>
</ul>
<h1>객체의 사용2</h1>
<ul>
<li v-for="(value,key,idx) in person " v-bind:key="idx">
{{ idx+1 }} :{{ key }}:{{ value }}
</li>
</ul>
<table border="1">
<tr v-for="(value,key,idx) in person" v-bind:key="idx">
<td>{{idx+1}}</td>
<td>{{ key }}</td>
<td>{{ value }}</td>
</tr>
</table>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
},
data:function(){
return{
person:{
name:"홍길동",
age:10,
address:"서울"
}
}
}
}
</script>
<style>
</style>
v-for select
<template>
<div>
<!--v-for 객체의 경우 사용-->
<h1>과일 선택</h1>
<select v-model="result">
<option v-for="(value, key) in fruits" v-bind:key="key">{{ value }}</option>
</select>
<br>
선택한 과일은 :{{ result }}
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
},
data:function(){
return{
fruits:{
apple:"사과",
banana:"바나나",
melone:"멜론"
},
result:""
}
}
}
</script>
<style>
</style>
<template>
<div>
<h1>1. 기본</h1>
<div v-for="(name, idx) in names" v-bind:key="idx">
{{ name }}님
</div>
<hr>
<h1>2.div 태그로 그룹핑: div 태그가 흔적으로 남음</h1>
<div v-for="(name, idx) in names " v-bind:key="idx+10">
<span>{{ name }} 님</span>
</div>
<h1>3. template태그 그룹핑: template 태그가 흔적으로 안남음</h1>
<div class="hello">
<template v-for="(v, i) in names">
<span :key="i+100">{{ v }}님</span>
</template>
</div>
<h1>4. </h1>
<div>
<span v-for="(v, i) in names" :key="i+1">{{ v }}</span>
</div>
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
},
data:function(){
return{
names:["홍길동","이순신","유관순"]
}
}
}
</script>
<style>
h1{
color: red;
}
</style>
v-on event
<template>
<div>
<h1>v-on이벤트명="처리함수" 또는 @이벤트명="처리함수"</h1>
<button v-on:click="handleEvent">v-on:click</button>
<button @click="handleEvent">@click</button>
<button v-on:click="xxx('홍길동')">v-on:click="xxx('홍길동')"</button>
<button @click="xxx('홍길동')">@click="xxx('홍길동')"</button>
<button @click="xxx2('홍길동',$event)">@click="xxx2('홍길동',event)"</button>
<!--$event 사용 주의
속성을 이용한 데이터 전달시 속성이름에 data-를 시용
함수에서는 data- 를 제외한 부븐을 사용하게 됨 dataset 으로 확인
-->
<button v-on:click="handleEvent2"
data-my="aaa"
data-my2='{"name":"홍길동", "age":"20"}'
>속성을 이용한 데이터 전송
</button>
<button v-on:click="handleEvent3"
data-my="bbb"
data-my2='{"name":"유관순", "age":"30"}'>
handleEvent3
</button>
<!--문자열로 만들기 위해 '{"name":"홍길동", "age":"20"}' 주의-->
</div>
</template>
<script>
export default {
name:'HelloWorld',
props:{
},
data:function(){
return{
num:10
}
},
methods:{
handleEvent:function(e){
console.log("handleEvent=====",e);
},
xxx:function(e){
console.log("xxx====",e)
},
xxx2:function(data,e){
console.log("xxx2====",data,e)
},
handleEvent2:function(e){
console.log("handleEvent2=====",e);
console.log(e.target);
//this.data-my는 안됨
console.log(this);
console.log(e.target.dataset);
console.log(e.target.dataset.my);
console.log(e.target.dataset.my2);
console.log(e.target.dataset.my2.name); //문자열이므로 undefined
var data=JSON.parse(e.target.dataset.my2);
console.log(data.name, data.age);
},
handleEvent3:function(e){
var data=JSON.parse(e.target.dataset.my2);
console.log(data.name, data.age);
}
}
}
</script>
<style>
</style>
directive07_v_for3_template2_v_once
<template>
<div>
기본 : <span>{{ username }}</span><br>
v-once1 : <span>{{ username }}</span><br>
v-once2 : <span v-once>{{ username }}</span><br>
{{ changeName() }}
<!-- changName() 주석으로 막으면 다 홍길동으로 나옴 -->
</div>
</template>
<script>
export default {
props:{},
data:function(){
return{
username:"홍길동"
}
},
methods:{
changeName:function(){
this.username="이순신";
}
}
}
</script>
<style>
</style>
v_model_v_for
map 쓰는 방법
<template>
<div>
<h1>도서목록{{ msg }}</h1>
<div v-for="(book, idx) in booklist" :key="idx">
<input type="checkbox" v-model="books" v-bind:value="book">
{{ book.name }}
<span>{{ book.price }}</span>
</div>
<hr>
선택교재:
<div v-for="(book, i) in books" :key="i+100">
<span>{{ book.name }}</span>
</div>
<hr>
전가격:{{ getTotal() }}
</div>
</template>
<script>
export default {
props:{
msg:String
},
data:function(){
return{
booklist:[
{name:"자바의 정석",price:3000
},
{name:"jsp 정석",price:4000
},
{name:"spring 정석",price:5000
},
{name:"jquery 정석", price:5000
},
{name:"angular 정석", price:7000 }
],
books:[], //선택된 책 목록 저장
total:0 //총액
}
},
methods:{
getTotal:function(){
var sum=0;
var totalbook =this.books;
totalbook.map(
function(ele,idx){
console.log(idx, ele,name, ele.price);
sum= sum+ele.price;
}
);
this.total=sum;
console.log(this.data);
return this.total;
}
}
}
</script>
<style>
</style>
for 로 쓰기
<template>
<div>
<h1>도서목록{{ msg }}</h1>
<div v-for="(book, idx) in booklist" :key="idx">
<input type="checkbox" v-model="books" v-bind:value="book">
{{ book.name }}
<span>{{ book.price }}</span>
</div>
<hr>
선택교재:
<div v-for="(book, i) in books" :key="i+100">
<span>{{ book.name }}</span>
</div>
<hr>
전가격:{{ getTotal() }} /{{ total }}
</div>
</template>
<script>
export default {
props:{
msg:String
},
data:function(){
return{
booklist:[
{name:"자바의 정석",price:3000
},
{name:"jsp 정석",price:4000
},
{name:"spring 정석",price:5000
},
{name:"jquery 정석", price:5000
},
{name:"angular 정석", price:7000 }
],
books:[], //선택된 책 목록 저장
total:0 //총액
}
},
methods:{
getTotal:function(){
var sum=0;
// var totalbook =this.books;
// totalbook.map(
// function(ele,idx){
// console.log(idx, ele,name, ele.price);
// sum= sum+ele.price;
// }
// );
for (let index = 0; index < this.books.length; index++) {
let b = this.books[index];
console.log(b.price);
sum+= b.price;
}
this.total=sum;
console.log(this.total);
return this.total;
}
}
}
</script>
<style>
</style>
<template>
<div id="app">
<bookList msg="BookList view<"/>
</div>
</template>
<script>
import bookList from './components/BookList'
export default {
name: 'App',
components: {
bookList
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
watch
<template>
<div class="hello">
<h1>watch 속성</h1>
값:<input type="text" v-model="num"><br>
변경된 값: {{ num }}
</div>
</template>
<script>
export default {
props:{
},
data:function(){
return{
num:10 //watch 사용시 변수명과 함수명은 동일해야함
}
},
//1. watch 함수명과 속성변수명이 동일해야함
//2. method 와 computed는 명시적으로 호출해야 하지만
//3. watch는 자동으로 호출됨
watch:{
num:function(changeValue){
console.log("watch 함수 실행",this.num,'\t',changeValue);
}
}
}
</script>
<style>
</style>
watch-2
<template>
<div>
<h1>도서목록{{ msg }}</h1>
<div v-for="(book, idx) in booklist" :key="idx">
<input type="checkbox" v-model="books" v-bind:value="book">
{{ book.name }}
<span>{{ book.price }}</span>
</div>
<hr>
선택교재:
<div v-for="(book, i) in books" :key="i+100">
<span>{{ book.name }}</span>
</div>
<hr>
<!-- //전가격:{{ getTotal() }} /{{ total }} -->
전가격: {{ total }}
</div>
</template>
<script>
export default {
props:{
msg:String
},
data:function(){
return{
booklist:[
{name:"자바의 정석",price:3000
},
{name:"jsp 정석",price:4000
},
{name:"spring 정석",price:5000
},
{name:"jquery 정석", price:5000
},
{name:"angular 정석", price:7000 }
],
books:[], //선택된 책 목록 저장
total:0 //총액
}
},
watch:{
books:function(){
// methods:{
// getTotal:function(){
var sum=0;
var totalbook =this.books;
totalbook.map(
function(ele,idx){
console.log(idx, ele,name, ele.price);
sum= sum+ele.price;
}
);
// for (let index = 0; index < this.books.length; index++) {
// let b = this.books[index];
// console.log(b.price);
// sum+= b.price;
// }
this.total=sum;
console.log(this.total);
return this.total;
}
}
}
</script>
<style>
</style>
<template>
<div>
<button v-on:[aaa]="handleEvent">v-on:[aaa]</button>
<button @[bbb]="handleEvent">@[bbb]</button>
<!--mouseover-->
<button @[ccc]="handleEvent">@[ccc]</button>
<button @[aaa]="handleEvent2" data-my="홍길동"
data-my2='{"name":"이순신","age":20}'>@[aaa]</button>
</div>
</template>
<script>
export default {
props:{
msg:String
},
data:function(){
return {
//data 의 이름을 이벤트ㅡ의 속성으로 지정하고 값을 이벤트 이름으로 사용함
aaa:"click",
bbb:"mouseover",
ccc:"mouseleave"
}
},
////////////////이벤트 처리 함수 등록
methods:{
handleEvent:function(e){
console.log("handleEvent===",e)
},
handleEvent2:function(e){
console.log("handleEvent===",e);
var data=JSON.parse(e.target.dataset.my2);
console.log(data.name, data.age);
},
}
}
</script>
<style>
</style>
'Daily Codig Reminder' 카테고리의 다른 글
eventBus, slot, sts 연결 (0) | 2024.03.14 |
---|---|
click, event, preventDefault, eventBus (0) | 2024.03.14 |
vue (0) | 2024.03.13 |
ECMA (0) | 2024.03.13 |
ECMA (1) | 2024.03.12 |