FrontEnd/Vue

[Vue3] 양방향 바인딩

Grace 2023. 4. 17. 16:11

v-model

프론트엔드에서 입력 양식을 처리할 때 입력 요소의 상태자바스크립트의 상태동기화해야 하는 경우가 많습니다. value를 바인딩하고 @input이벤트로 text를 변경하는 것은 번거로울 수 있습니다.

<input
  :value="text"
  @input="event => text = event.target.value" />

그래서 Vue에서는 이러한 작업은 단순화 하도록 양방향을 바인딩할 수 있는 v-model디렉티브를 제공합니다.

<input v-model="text" />

textarea

  • :value, @input
  • <textarea :value="textareaValue" @input="(event) => (textareaValue = event.target.value)" ></textarea>
  • v-model
  • <textarea v-model="textareaValue"></textarea>

checkbox, radio, select

v-model은 내부적으로 HTML 요소가 어떤 요소냐에 따라 서로 다른 속성(:value)과 이벤트(@input)를 사용합니다.

  • input type=”text”textareavalue 속성과 input 이벤트를 사용합니다.
  • checkboxradio버튼은 checked 속성과 change 이벤트를 사용합니다.
  • select 태그는 value 속성과 change 이벤트를 사용합니다.

checkbox

  • :checked, @change
  • <input type="checkbox" :checked="checkboxValue" @change="(event) => (checkboxValue = event.target.checked)" />
  • v-model
  • <input type="checkbox" v-model="checkboxValue" />

radio

  • v-model
  • <label> <input type="radio" name="type" value="O" v-model="radioValue" /> O형 </label> <label> <input type="radio" name="type" value="A" v-model="radioValue" /> A형 </label>

select

  • v-model
  • <select v-model="selectValue"> <option value="html">HTML 수업</option> <option value="css">CSS 수업</option> <option value="javascript">JavaScript 수업</option> </select>

checkbox

하나의 checkbox는 단일 boolean 값을 가집니다.

<label>
  <input type="checkbox" v-model="checkboxValue" />
  {{ checkboxValue }}
</label>

여러개의 checkbox는 배열을 바인딩할 수 있습니다.

<div>
  <label>
    <input type="checkbox" v-model="checkboxValues" value="html" />
    HTML
  </label>
  <label>
    <input type="checkbox" v-model="checkboxValues" value="css" />
    CSS
  </label>
  <label>
    <input type="checkbox" v-model="checkboxValues" value="javascript" />
    JavaScript
  </label>
  <p>
    {{ checkboxValues }}
  </p>
</div>

값 바인딩

단일 checkbox 일 때 boolean이 아닌 다른 값을 바인딩 하고 싶다면 true-value, false-value 속성을 사용할 수 있다.

<label>
  <input
    type="checkbox"
    v-model="checkboxYN"
    true-value="Yes"
    false-value="No"
  />
  {{ checkboxYN }}
</label>

v-model 수식어(modifiers)

.lazy

기본적으로, v-model은 각 input 이벤트 후 입력과 데이터를 동기화 합니다. 

한글 입력 시 키보드 입력이 바로 v-model 값에 업데이트 되지 않습니다!
한국어, 중국어, 일본어 등의 IME 입력 방식을 따르는 언어들은 v-model이 IDE composition을 구성하여 업데이트 하는 동안에 반영되지 않을 수 있습니다. 만약, 입력값이 실시간으로 업데이트 되는 것이 중요하다면 v-model 대신 기본 input event listenervalue를 사용해주세요!

lazy 수식어를 추가하여 change 이벤트 이후에 동기화 할 수 있습니다.

<input v-model.lazy="text" />

.number

사용자 입력이 자동으로 number 타입으로 형변환 되기를 원하면,  .number 수식어를 추가하면 됩니다.

<input v-model.number="text" />

.trim

사용자가 입력한 내용에서 자동으로 앞뒤 공백을 제거하는 트림처리가 되길 바란다면, v-model이 관리하는 input에 trim 수식어를 추가하면 됩니다.

<input v-model.trim="text" />

'FrontEnd > Vue' 카테고리의 다른 글

[Vue3] Dynamic component  (0) 2023.04.17
[Vue3] watch, watchEffect  (0) 2023.04.17
[Vue3] 이벤트 처리  (0) 2023.04.17
[Vue3] 디렉티브  (0) 2023.04.17
[Vue3] 리스트 렌더링  (0) 2023.04.17