본문 바로가기

데일리 공부 기록

hands on vue - Component 대충 한번 만들어보기

728x90

[목표]

1. Component는 왜 만들고 만드는 구조를 이해해본다

 


아래의 그림은 ul(unorder list)의 li가 두개있는 구조다.

li하나씩 component화 하여 만들어보려고한다.


컴포넌트를 만들 때 기존에 Vue를 만드는 것과 비슷하다.

차이점은 template이 있다는 점이다. 

 

Vue는 SinglePageApplication 이지 않은가. 

하나의 도화지에 레이어를 쌓을 수 있다.

 

4절지 도화지가 있다고 생각해보면

색종이만한 종이를 꾸미고 만들어서 4절지 위에 붙인다고 생각하면 쉽게 이해된다.

 

색종이의 내용이 template 속성인 듯 하다.

 

아래는 전체 코드다. 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vue Basics</title>
    <link
      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="styles.css" />
    <script src="https://unpkg.com/vue@next" defer></script>
    <script src="app.js" defer></script>
  </head>
  <body>
    <header>
      <h1>FriendList</h1>
    </header>
    <section id="app">
      <ul>
        <friend-contact></friend-contact>
      </ul>
    </section>
  </body>
</html>
const app = Vue.createApp({
    data: function(){
        return{
            detailVisible: false,
            friends: [
                {
                    id: 'manuel',
                    name: 'Manuel Lorenz',
                    phone:'01234 5678 991',
                    email: 'manuel@localhost.com',
                },
                {
                    id: 'julie',
                    name: 'Julie Jones',
                    phone:'09876 543 221',
                    email: 'julie@localhost.com',
                },
            ],
        }
    },
    methods: {
        detailVis(){
            this.detailVisible = !this.detailVisible;
        },
    }
});

app.component('friend-contact', {
    template: `
    <li>
        <h2>{{friend.name}}</h2>
        <button @click="toggleDetails">
            {{detailVisible ? 'Hide' : 'Show'}} Details
        </button>
        <ul v-if="detailVisible == true">
            <li><strong>Phone:</strong> {{friend.phone}}</li>
            <li><strong>Email:</strong> {{friend.email}}</li>
        </ul>
    </li>
    `,
    data: function(){
        return{
            detailVisible: false,
            friend: {
                id: 'manuel',
                name: 'Manuel Lorenz',
                phone:'01234 5678 991',
                email: 'manuel@localhost.com',
            },
        }
    },
    methods: {
        toggleDetails(){
            this.detailVisible = !this.detailVisible;
        }
    },
});

app.mount('#app');
* {
  box-sizing: border-box;
}

html {
  font-family: 'Jost', sans-serif;
}

body {
  margin: 0;
}

header {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
  margin: 3rem auto;
  border-radius: 10px;
  padding: 1rem;
  background-color: #58004d;
  color: white;
  text-align: center;
  width: 90%;
  max-width: 40rem;
}

#app ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

#app li {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
  margin: 1rem auto;
  border-radius: 10px;
  padding: 1rem;
  text-align: center;
  width: 90%;
  max-width: 40rem;
}

#app h2 {
  font-size: 2rem;
  border-bottom: 4px solid #ccc;
  color: #58004d;
  margin: 0 0 1rem 0;
}

#app button {
  font: inherit;
  cursor: pointer;
  border: 1px solid #ff0077;
  background-color: #ff0077;
  color: white;
  padding: 0.05rem 1rem;
  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.26);
}

#app button:hover,
#app button:active {
  background-color: #ec3169;
  border-color: #ec3169;
  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.26);
}

 

 

아! 그리고 중요하다고 느꼈던 점은 

app.mount를 제일 나중에 한다는 점이다. 

 

mount는 모든 종이들을 붙이는 작업이라고 생각하면 된다.