19. 2 way data binding

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>2-way data binding</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.3.4/vue.global.min.js" integrity="sha512-Wbf9QOX8TxnLykSrNGmAc5mDntbpyXjOw9zgnKql3DgQ7Iyr5TCSPWpvpwDuo+jikYoSNMD9tRRH854VfPpL9A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  <style>
      .app {
          font-size: 3em;
      }
  </style>
</head>
<body>
<div id="app">
  <p>{{ fullname() }}</p>
  <hr/>
  <label for="firstname">first name</label>
  <input id="firstname" type="text" v-model="firstname">

  <label for="lastname">last name</label>
  <input id="lastname" type="text" v-model="lastname">
</div>

<script>
  const vm = Vue.createApp({
    data() {
      return {
        firstname: 'hyungju',
        lastname: 'lee',
      }
    },
    methods: {
      fullname() {
        return `${this.firstname}-${this.lastname}`
      }
    }
  }).mount('#app');
</script>
</body>
</html>

위 기능을 자바스크립트로 구현한다면 아래와 같은 코드가 될 것이다.

const input = document.querySelector('#firstname');

input.addEventListener('keyup', (e) => {
    const p = document.querySelector('p');
    
    p.innerText = e.target.value;
})

위와 같이 자바스크립트로도 동일한 기능을 구현할 수 있지만,

위 방식엔 몇 가지 문제점이 있다.

  1. element에 id 또는 class를 할당해야된다.
  2. 입력 필드와 p 태그와 같은게 수십개, 수백개가 된다면?

코드가 복잡해질 것이다.


반응성을 통해 이 문제를 간단하게 해결할 수 있다.

  1. 문서의 데이터가 업데이트되면 자바스크립트 코드의 데이터도 업데이트 된다.
  2. 자바스크립트의 데이터가 업데이트되면 문서의 데이터도 업데이트 된다.

크롬 개발자창에 콘솔창에서

vm.firstname = 'xxxxx'

위와 같이 입력하면 문서 화면도 업데이트된다.