본문 바로가기
Vue.js

[Vue3] Stand Alone #6. Component 만들기

by bryan.oh 2022. 3. 21.
반응형

Vuejs 3 Stand Alone Component 만들기

 

Vue3 를, (npm 없이, webpack 없에, package.json 없이 등등..),
홀로 사용 하려는 경우에 vue3 를 개발하는 방식 중 하나 입니다.
Stand Alone 으로 사용할 수 밖에 없는 경우만 봐주세요~

 

npm build 없이 php 나 html 에서 사용하려면 .vue 를 import 못하기 때문에

js 로 component 를 만들어서 사용해야합니다.

 

우선 javascript 파일을 만듭니다.

baseCard.js
const BaseCard = {
    props:{
        title: String,
        content: {
            type: String,
            default: "",
            description: "card content"
        },
        buttonText: {
            type: String,
            default: "Ok",
            description: "button text"
        }
    },
    template:`
    <div class="card" style="width: 18rem;margin: auto;">
        <img src="https://i1.daumcdn.net/thumb/C58x58/?fname=https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTDpcV%2FbtrwqNbZy5N%2FhrBS6KeeRGRiBDKHkWWUHk%2Fimg.jpg" class="card-img-top" alt="...">
        <div class="card-body">
            <h5 class="card-title">{{ title }}</h5>
            <p class="card-text">{{ content }}</p>
            <button class="btn btn-primary" @click="handleClick">{{ buttonText}}</button>
        </div>
    </div>
    `
}

props : 여기에는 tag 에 attribute 로 전달 받을 파라메터들을 입력해 줍니다.

props: [ 'title', 'content', 'something' ] // 이렇게 간단하게 써도 됩니다.
// 또는 아래와 같이 기본값등의 설정도 할 수 있습니다.
props: {
    title : {
         type: String,
         default: "Default Title",
         description: "description of this field"
    }
}

template : 여기에 html 코드와 props 를 사용할 수 있습니다.

template 을 감싸고 있는 문자는 ` 입니다. (상단 숫자키 1번의 왼쪽) 

props 는 {{ }} 사이에 사용해서 쓸수 있습니다.

 

이렇게 작성 한 custom javascript vue template 을 가져다가 쓰는 방법은,

우선 이 js 파일을 include 합니다.

<script src="./baseCard.js"></script>

 그리고 createApp 안에 components 에 등록해 줍니다.

base-card 는 <base-card></base-card> 로 사용하기 위해 이름을 지어준 것이고,

뒤에 있는 BaseCard 는, 위에서 const BaseCard = { ... } 로 사용한 상수 명입니다.

그리고 tag 에서 다음과 같이 사용할 수 있습니다.

 

실행 결과

 

전체 소스

baseCard.js 는 위에 소스가 있습니다.

lesson06.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

    <title>Hello Vue</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.5">

    <!--  Fonts and icons     -->
    <link href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,600,700,800" rel="stylesheet">
    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
    
    <!-- bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>

    <!-- vue 3 -->
    <script src="https://unpkg.com/vue@3"></script>

</head>
<body>
    
<!-- vue 3 -->
<script src="https://unpkg.com/vue@3"></script>

<div id="app">
    <base-card title="Custom Card" content="cardMessage" @click="hello"></base-card>
</div>

<script src="./baseCard.js"></script>

<script>
    var app = Vue.createApp({
        components: {
            'base-card': BaseCard
        },
        data() {
            return {
                cardMessage: "Hello~ bryan. This is for you"
            }
        },
        methods: {
            hello(){
                alert('hi');
            }
        },
    }).mount('#app')
</script>

<style>
    #app{
        width: 100%;
        margin: 20px;
    }
</style>

</body>
</html>

 

 

 

728x90
반응형

댓글