【Vue.js】복수의 카운트 버튼을, 각각 누른 수만큼 카운트시키고 싶다【Component】

문제



Vue.js의 Component 공부를 위해 카운터를 만들었을 때입니다.

한 버튼을 누르면 다른 버튼의 카운트도 늘어나는 문제가 발생.



환경


  • Vue.js v2.6.11 (CDN)

  • 코드



    index.html
    <!DOCTYPE html>
    <html lang="ja">
    <head>
      <meta charset="UTF-8">
      <title>Components</title>
      <link rel="stylesheet" href="css/styles.css">
    </head>
    <body>
      <div id="app">
        <button-counter message="Counter A"></button-counter>
        <button-counter message="Counter B"></button-counter>
        <button-counter message="Counter C"></button-counter>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
      <script src="js/main.js"></script>
    </body>
    </html>
    

    js/main.js
    (function () {
      'use strict';
    
      const counter = {
        count: 0
      };
    
      const countComponent = Vue.extend({
        template: '<button @click="countUp">{{ message }}: {{ count }}</button>',
        props: {
          message: {
            type: String,
          },
        },
        data: function () {
          return counter;
        },
        methods: {
          countUp: function () {
            this.count++;
          },
        },
      });
    
      const vm = new Vue({
        el: '#app',
        components: {
          'button-counter': countComponent,
        },
      });
    })();
    

    원인



    참조를 읽으면,

    구성 요소의 data 옵션은 함수여야 합니다. 각 인스턴스가 반환되는 데이터 객체의 별도 복사본을 유지할 수 있기 때문입니다.

    라는 설명이 있었습니다.
    참조 : 【Vue.js 가이드】data는 함수여야 합니다.

    각각의 카운트 버튼 인스턴스에 돌려주어지는 값을 독립시키기 위해서, data 옵션을 함수로 해야 하는군요.

    해결



    레퍼런스에 기술의 방법이 제대로 써 있었습니다.
    data: function () {
      return {
        count: 0
      }
    }
    

    Vue에이 규칙이 없으면 버튼을 클릭하면 다음과 같이 모든 다른 인스턴스의 데이터에 영향을줍니다.

    정중하게 이번 사건의 예도 제시하고 있었습니다.

    수정 후 이렇게 되었습니다.

    js/main.js
    (function () {
      'use strict';
    
      // 削除
      // const counter = {
      //   count: 0
      // };
    
      const countComponent = Vue.extend({
        template: '<button @click="countUp">{{ message }}: {{ count }}</button>',
        props: {
          message: {
            type: String,
          },
        },
        // 変更-----
        data: function () {
          return {
            count: 0,
          };
        },
        // -----
        methods: {
          countUp: function () {
            this.count++;
          },
        },
      });
    
      const vm = new Vue({
        el: '#app',
        components: {
          'button-counter': countComponent,
        },
      });
    })();
    

    제대로 각각의 버튼의 압하수를 카운트 해 줍니다.


    반성



    덧붙여서 countComponent 안에서 data 옵션을 함수로 하지 않고 count를 정의하려고 하면, Vue.js 쪽에서 ReferenceError: count is not defined 라고 에러가 되는 것을 가르쳐 주었습니다.


    원래 count는 별도로 정의하는 것이 아니라, 처리를 하고 있는 인스턴스내에서 설정하면 좋았지요.

    참조



    【Vue.js 가이드】data는 함수여야 합니다.

    좋은 웹페이지 즐겨찾기