본문 바로가기
front-end/Vue.js

Vue의 module타입

by 모두의 향연 2022. 9. 5.
728x90
반응형
  • 변수,  함수, 클래스, 인스턴스의 집합을 독립된 파일(~.js, ~.vue)로 만든 것
  • 모듈로 만들어 필요한 기능만 여러 프로그램에서 재사용
  • 모듈 내부에서 export 된 것만 외부 프로그램에서 사용 가능
  • export : 개수와 상관없이 내보내기 가능
  • export default : 기본 한 개만 내보내기 가능

[test.html]

body-script-type을 module로 설정

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

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <style>
    [v-cloak] {
      display: none;
    }
  </style>
</head>

<body>
  <div id="app">
    <input type="text" v-model.number="num1" />
    <select v-model="op">
      <option value="+">+</option>
      <option value="-">-</option>
    </select>
    <input type="text" v-model.number="num2" />
    <button v-on:click="doCal">계산하기</button>
    <div v-cloak>{{result}}</div>
  </div>

  <!-- module타입:  -->
  <script type="module" src="./test.js"></script>

</body>

</html>

type이 module이고 src가 해당 파일 경로로 적혀있다.

 

[test.js]

import { title, add, sub } from './test_module1.js';
// import { title, add, sub } from './test_module2.js';
console.log(title);
console.log(add(20, 10));
console.log(sub(20, 10));

new Vue({
  el: '#app',
  data: {
    num1: 0,
    num2: 0,
    op: '-',
    result: 0,
  },
  methods: {
    doCal() {
      if (this.op === '+') {
        this.result = add(this.num1, this.num2);
      } else {
        this.result = sub(this.num1, this.num2);
      }
    },
  },
  watch: {
    op(val) {
      if (val === '+') {
        this.result = add(this.num1, this.num2);
      } else {
        this.result = sub(this.num1, this.num2);
      }
    },
  },
});

js의 vue부분을 따로 뺐다. title, add함수, sub함수는 여기에 없는데 어디 있는 걸까?맨 위에 보니 test_module1.js에서 title, add, sub를 가져왔다.

 

방법1 : 일일이 export 하는 방법

[test_module1.js]

export const title = '계산기 모듈';

export function add(i, j) {
  return i + j;
}
export function sub(i, j) {
  return i - j;
}

 

방법2 : export default로 객체로 만들어서 한 번에 보내는 방법(import할 때 임의 식별자 설정해줘야 함 ex)'cal'이라는 식별자라면 cal.title/cal.add/cal.sub)

[test_module2.js]

// default는 호출하는 곳에 기본으로 넘어간다.
export default {
  title: '계산기 모듈',
  add(i, j) {
    return i + j;
  },
  sub(i, j) {
    return i - j;
  },
};

export default { }는 객체가 되어버린다.

그럼 이 객체안의 내용이 전체 나가게 된다.

이름없이 객체를 넘겨주게 되면 내 마음대로 'cal'이라는 이름을 붙여서 넘겨줄 수 있다.

 

방법3 : 다 적고 한 번에 export { } 로 내보내는 방법

[test_module3.js]

const title = '계산기 모듈';

function add(i, j) {
  return i + j;
}
function sub(i, j) {
  return i - j;
}

export { title, add, sub };

 

 


component를 따로 빼서 import한다.

 

[test.html]

컴포넌트를 쓴다고 해야하니까 vue안에 components

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        <my-comp></my-comp>
    </div>
    <template id="MyComp">
        <div>
            <h2>{{msg}}</h2>
        </div>
    </template>
    <script type="module">
        import MyComp from './components/MyComp.js'
        new Vue({
            el: "#app",
            components: {
                // MyComp: MyComp
                MyComp
            }
        })
    </script>
</body>

</html>

컴포넌트도 따로 뺄 수 있다.

components/MyComp.js를 MyComp라는 이름으로 가져온다.

[MyComp.js]

export default {
  template: '#MyComp',
  data() {
    return {
      msg: 'hello module component',
    };
  },
};

[기존 board에서 복잡한 코드 따로 빼기] 

 1. 파일을 만들고 이름은 명확하게 정한다 : board에서 list의 items

(board delete/board/board view/board cancel/board modify 등)

 

2. boardListItem.js export default와 template작성하기

export default {
  template: `
    <tr>
    <td>{{article.articleno}}</td>
    <td>{{article.subject}}</td>
    <td>{{article.userid}}</td>
    <td>{{article.hit}}</td>
    <td>{{article.regtime}}</td>
    </tr>
    `,
};

 

3.  <script type="module">로 바꾸기

 

4. boardList.html으로 boardListItem.js를 가져오기

import BoardListItem from "./boardListItem.js";

 

5. 컴포넌트로 등록하기

        new Vue({
            el: "#app",
            component: {
                BoardListItem
            },
            data() {
                return {
                    articles: [], //배열로 뿌림
                }
            },
            created() { //페이지 열자마자 바로 뿌리기 위해
                axios.get(address) //axios로 주소 가져오고
                    .then((response) => {
                        console.log(response.data);
                        this.articles = response.data;
                    });
            },
        })

 

6. 테이블에 컴포넌트 뿌리고 반복문 돌리기

<tr>
    <board-list-item v-for="(article, index) in articles" :key="index"></board-list-item>
</tr>

 

7.props로 넘겨주기 :article="article" article이란 이름으로 반복문의 article넘겨주기

boardListItem.js에서  변수들이 쓰이는 데 여기엔 선언 안 되어 있음 -> props로 넘겨주기(bind로)

<board-list-item v-for="(article, index) in articles" :article="article" :key="index"> </board-list-item>

 

8. boardListItem.js에서 props로 받기

props: {
  article: Object;
} //article이라는 이름을 Object로 넘어와

 

9. 결론: tr같은건 주로 따로 빼지 않는다..

728x90
반응형

'front-end > Vue.js' 카테고리의 다른 글

API로 아파트 리스트 가져오기  (0) 2022.07.28
axios 비동기처리, Promise, async, await  (0) 2022.07.20
Vue.js 컴포넌트  (0) 2022.07.11
Vue.js 이벤트  (0) 2022.07.08
Vue.js 인스턴스 속성(methods, filter, computed, watch)  (0) 2022.07.07