본문 바로가기

코딩공부/vue

3/30

실행은 src로 해야 하는데 매번 만들기 귀찮으니깐 프로젝트 마다 src를 백업 한뒤에 복사 해서 src로 만들어서 실행 할 꺼임

 

* 중첩 컴포넌트

 

-컴포넌트들을 조합하여 하나의 애플리케이션을 개발.

-이때 각 컴포넌트들간의 계층구조(부모/자식)가 생성.

 

 

속성 값을 이용해서 부모의 값을 자식에게 전달

자식은 props를 이용해서 뽑음

 

 

import 받아서 component로 등록 이름으로 태그로 해서 msg 등록

props에서 msg과 타입을 선언함

 

자식에서 msg로 부를 수 있음

 

src_01_basic2

 

App.vue

<template>
  <div>
    부모 컴포넌트 값
    <HelloWorld msg = "부모에서 전달 되는 값"/>
    <!-- 3. 자식 컴포넌트에 속성으로 데이터 전달 -->
  </div>
</template>

<script>
  import HelloWorld from './components/HelloWorld'; //1. import
  export default {
    name: 'App',
    components:{
      HelloWorld  //2. 컴포넌트 등록 => <HelloWorld> 로 사용
    }
  }
</script>

<style>

</style>

 

HelloWorld.vue

<template>
  <div>
    자식 컴포넌트<br>
    받은 데이터 {{ msg }}
    <!-- 5. props 데이터 사용 -->
  </div>
</template>

<script>
export default {
  name: 'HelloWorld', //컴포넌트 이름
  props:{ //4. 부모로 받는 속성 데이터
    msg:String
  }
  
}
</script>

<style scoped>

</style>

 

순서대로 진행됨

 

* data 속성

 

-컴포넌트내의 로컬 상태 정보를 저장하기 위하여 data 옵션 사용 가능.

-주의할 점은 반드시 함수 형태로 작성해야 된다.

 

data라는 키를 써서 function 만들고 리턴을 json 오브젝트로 함

리턴된 값을 template에서 사용가능

 

App.vue

<template>
  <div>
    부모 컴포넌트의 로컬값 : {{ x }}, {{ y }}
  </div>
</template>
<script>
  import HelloWorld from './components/HelloWorld'; //1. import
    //로컬 상태를 저장하는 data옵션은 반드시 함수로 지정함(arrow 함수도 가능)
    data: function(){
      return{ //json 오브젝트 리턴
        x:"홍길동",
        y:"100",
      }
    }//data end
  }
</script>

App.vue

<template>
  <div>
    {{ z[0] }}
    {{ k.aa }}
  </div>
</template>
<script>
  import HelloWorld from './components/HelloWorld'; //1. import
    //로컬 상태를 저장하는 data옵션은 반드시 함수로 지정함(arrow 함수도 가능)
    data: function(){
      return{ //json 오브젝트 리턴
        z:[10,20,30],
        k:{aa:'hong', bb:30},
      }
    }//data end
  }
</script>

 

components/Person.js

export class Person{ //import 하는 곳에서 {} 사용
   
    constructor(u, a){
        this.username = u;
        this.age = a;
    }
    getUserName(){
        return this.username;
    }
    getAge(){
        return this.age;
    }
}

 

App.vue

<template>
  <div>
    {{ p.getUserName() }}
  </div>
</template>
<script>
  import {Person} from './components/Person'; 
    //로컬 상태를 저장하는 data옵션은 반드시 함수로 지정함(arrow 함수도 가능)
    data: function(){
      return{ //json 오브젝트 리턴
        p:new Person("aaa",20) //component/Person.js import
      }
    }//data end
  }
</script>

 

src_01_basic2_multiComponent

 

vue.config.js 수정

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false
})

 

vue이름이 단일 단어면 안되기 때문에 그것을 허용하기 위해 수정한 것

 

App.vue

<template>
  <div id="app">
    부모컴포넌트 <br>
    <HelloWorld msg="aaa"/>
    <Happy msg="이순신"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld'
import Happy from './components/Happy'

export default {
  name: 'App',
  components: {
    HelloWorld,
    Happy
  }
}
</script>

 

HelloWorld.vue

<template>
  <div>
    자식 컴포넌트 hello{{ msg }}
  </div>
</template>

<script>
export default {
  name:'HelloWorld',
  props:{
    msg:String
  }
}
</script>

 

Happy.vue

<template>
  <div>
    {{ msg }}
  </div>
</template>

<script>
export default {
  name:'Happy',
  props:{
    msg:String
  }
}
</script>

 

App.vue

<template>
  <div id="app">
    <!-- 숫자, boolean, 객체, 배열 등은 v-bind:속성명 또는 :속성명을 사용하여 전달함 -->
    <HelloWorld 
    v-bind:test=10
    />
  </div>
</template>

 

HelloWorld.vue

<template>
  <div>
    {{ test }}
  </div>
</template>

<script>
export default {
  name:'HelloWorld',
  props:{
    test:String
  }
}
</script>

 

props에서 String으로 받든 Number로 받든 자동 형변환이 되서 상관 없음

 

src_02_exam1

 

src/assets/image에 이미지 들 넣음

 

App.vue

<template>
  <div id="app">
    BookList <br>
    <BookList/>
  </div>
</template>

<script>
import BookList from './components/BookList.vue'

export default {
  name: 'App',
  components: {
    BookList
  }
}
</script>

 

BookList.vue

<template>
  <div>
    
    <img src='../assets/image/a.jpg'/>
    
  </div>
</template>

<script>
export default {

}
</script>

 

BookList.vue

<template>
  <div>
    <h1>도서 목록</h1>
    <ul>
        <li>
            <img src='../assets/image/a.jpg' width="100" height="100"/>위험한식탁
        </li>
        <li>
            <img src='../assets/image/b.jpg' width="100" height="100"/>공부의 비결
        </li>
        <li>
            <img src='../assets/image/c.jpg' width="100" height="100"/>오메르타
        </li>
        <li>
            <img src='../assets/image/d.jpg' width="100" height="100"/>행복한 여행
        </li>
        <li>
            <img src='../assets/image/e.jpg' width="100" height="100"/>해커스 토익
        </li>
        <li>
            <img src='../assets/image/f.jpg' width="100" height="100"/>도로 안내서
        </li>

    </ul>
    
  </div>
</template>

 

src_03_props1_arrayOfStrings

 

App.vue

<template>
  <div id="app">
    <HelloWorld username="홍길동" age="20" my-address="서울"/>
    <!-- 자식 컴포넌트에 속성을 이용한 데이터 전달 
        my-address같은 케밥 표기법으로 넘기면 반드시 받는 쪽은 myAddress같은 카멜 표기법을 사용받아서 사용함
    -->
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

<style>

</style>

 

HelloWorld.vue

<template>
  <div>
    {{ username }}
  </div>
</template>

<script>
export default {
  name:'HelloWorld',
  props:{
    username:String
  }
}
</script>
  

<style>

</style>

 

HelloWorld.vue

<template>
  <div>
    {{ username }}
    {{ age }}
    {{ myAddress }}
  </div>
</template>

<script>
export default {
  name:'HelloWorld',
  props:{
    username:String,
    age:String,
    myAddress:String
  }
}
</script>

 

my-address:String 이렇게 하면 에러남

 

src_03_props1_arrayOfStrings2

 

props:['username', 'age', 'myAddress']  //속성명 나열

props를 이렇게 해도 됨

 

src_03_props1_arrayOfStrings3

 

App.vue

<template>
  <div id="app">
    부모컴포넌트 <br>
    <HelloWorld 
      username="홍길동"
      v-bind:age="20"
      my-address="서울"
      v-bind:isMarried="false"
      v-bind:phones="[100,200,300]"
      v-bind:author="{
        name:'aaa',
        company:'google.com'
      }"
    />
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

<style>

</style>

 

 

HelloWorld.vue

<template>
  <div>
    {{ username }}<br>
    {{ age }}<br>
    {{ myAddress }}<br>
    {{ isMarried }}<br>
    {{ phones }}<br>
    {{ author }}<br>
  </div>
</template>

<script>
export default {
  name:'HelloWorld',
  props:{
    username:String,
    age:Number,
    myAddress:String,
    isMarried:Boolean,  //주의
    phones:Array,       //배열객체
    author:Object       //객체
  }
}
</script>

<style>

</style>

 

HelloWorld.vue

<template>
  <div>
    {{ username }}<br>
    {{ age + 10}}<br>
    {{ myAddress }}<br>
    {{ isMarried==false }}<br>
    {{ phones[0]==100 }}<br>
    {{ author.name }}<br>
    {{ author.company }}<br>
  </div>
</template>

 

'코딩공부 > vue' 카테고리의 다른 글

3/29vue 시작  (0) 2023.03.29
3/29  (0) 2023.03.29
3/28  (0) 2023.03.28
3/24 ECMAScript 6  (0) 2023.03.24