Vue: <select>splice () ν›„ λ°°μ—΄κ³Ό 바인딩이 잘λͺ» μˆ˜ν–‰λ¨</select>

에 λ§Œλ“  2016λ…„ 09μ›” 30일  Β·  6μ½”λ©˜νŠΈ  Β·  좜처: vuejs/vue

λ‹€μŒ μ½”λ“œλ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

<div id="demo">
  <select v-model="selected" number>
    <option v-for="opt in options" :value="$index" number>{{opt}}</option>
  </select>
</div>

<select> μ—μ„œ 각 μ˜΅μ…˜ 값은 $index λ°”μΈλ”©λ©λ‹ˆλ‹€. μš°λ¦¬κ°€ μˆ˜ν–‰ν•˜λŠ” 경우 splice() 에 options , 같은 options.splice(0,1) , $index ν•˜μ§€ μ˜¬λ°”λ₯΄κ²Œ 동기화 μ˜΅μ…˜ μ•ŠμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, options=['a','b'] ν•˜λ©΄ λ Œλ”λ§ 된 HTML은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€ (μ‹€μ œλ‘œλŠ” μ•„λ‹˜).

<div id="demo">
  <select selectedIndex="0">
    <option value="0">a</option>
    <option value="1">b</option>
  </select>
</div>

options.splice(0,1) λ‹€μŒμ— options=['b'] μ΄μ§€λ§Œ λ Œλ”λ§ 된 HTML은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

<div id="demo">
  <select selectedIndex="0">
    <option value="1">b</option>
  </select>
</div>

'b'μ˜΅μ…˜μ˜ 값은 1μ΄λ˜μ§€ μ•ŠμœΌλ©° $index λ•Œλ¬Έμ— 0μ΄μ–΄μ•Όν•©λ‹ˆλ‹€. 이것은 버그가 아닐 수 μžˆμ§€λ§Œ 이것은 λ‹€μ†Œ μ΄μƒν•©λ‹ˆλ‹€.

λ‹€μŒμ€μ΄ 문제의 라이브 데λͺ¨μž…λ‹ˆλ‹€.
https://jsfiddle.net/peteranny/trwp98g9/4/

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

2.0μ—μ„œ ν…ŒμŠ€νŠΈλ˜μ—ˆμœΌλ©° μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€ : https://jsfiddle.net/dycmgzcm/
κ·Έλž˜μ„œ λ‚˜λŠ” 이것을 1.x의 λ²„κ·Έλ‘œ ν‘œμ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  6 λŒ“κΈ€

ν…œν”Œλ¦Ώ selected="{{$index == selected}}" μ—μ„œ μ„ νƒν•œ 속성을 μΆ”κ°€ν•˜κΈ° λ§Œν•˜λ©΄λ©λ‹ˆλ‹€.

μ—¬κΈ°μ—μ„œ 데λͺ¨λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€ https://jsfiddle.net/trwp98g9/5/

@peteranny μ˜ˆμƒλ˜λŠ” λ™μž‘μ΄ 무엇인지 λͺ…ν™•νžˆ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

options.splice (0,1) λ‹€μŒμ— options = [ 'b'], λ Œλ”λ§ 된 HTML은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
<option value="1">b</option>

μ—¬κΈ°μ—μ„œ 제곡 ν•œ 것과 λ™μΌν•œ κ²°κ³Όλ₯Ό 얻지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.
제거λ₯Ό ν΄λ¦­ν•˜κΈ° 전에 :
before

클릭 ν›„ :
after

'b'μ˜΅μ…˜μ˜ 값은 1μ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. $ index λ•Œλ¬Έμ— 0μ΄μ–΄μ•Όν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ •ν™•νžˆ λ¬΄μ—‡μ΄λ˜μ–΄μ•Όν•©λ‹ˆκΉŒ? 'b'의 값은 클릭 μ „ 1μ΄μ—ˆκ³  클릭 ν›„ 0μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

@fnlctrl 음, ν…ŒμŠ€νŠΈ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 잘λͺ»λœ μ§ˆλ¬Έμ„ ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.
ν…ŒμŠ€νŠΈμ— λ”°λ₯΄λ©΄ 클릭 ν›„ 'b'의 값이 0μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μ§„μ •ν•œ μ§ˆλ¬Έμ€ : 이제 'b'의 값이 0인데 μ™œ <select> κ°€ 'b'λ₯Ό μ„ νƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆκΉŒ?
μ΄λ―Έμ§€μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ <select> λŠ” μ˜΅μ…˜μ„ μ „ν˜€ μ„ νƒν•˜μ§€ μ•Šμ•˜κ³  <select> λŠ” 값이 0 인 μ˜΅μ…˜μ„ μ„ νƒν•΄μ•Όν•©λ‹ˆλ‹€.
(κ·Έλž˜μ„œ 'b'의 값이 λ³€ν•˜μ§€ μ•Šμ•˜λ‹€κ³  μ˜€ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.)

@peteranny selected κ°€ 0으둜 μœ μ§€λ˜κ³  options λ³€κ²½ λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 버그 일 수 있으며 dom은이 λ³€κ²½ 사항을 λ°˜μ˜ν•΄μ•Όν•˜μ§€λ§Œ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ ..

μ§€κΈˆμ€ @defccκ°€ μ œμ•ˆν•œλŒ€λ‘œ selected prop을 μΆ”κ°€ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€ (props / attrs에 λŒ€ν•œ μ½§μˆ˜μ—Ό 바인딩은 2.0μ—μ„œ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ―€λ‘œ λŒ€μ‹  :selected="$index == selected" μ‚¬μš©ν•˜μ‹­μ‹œμ˜€).
λ˜λŠ” track-by prop을 <options> μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그러면 vueκ°€ domμ—μ„œ μ„ νƒν•œ 값을 μ—…λ°μ΄νŠΈν•˜λŠ” 것이 μ•ˆμ „ν•˜λ‹€κ³  생각할 수 μžˆμŠ΅λ‹ˆλ‹€. https://jsfiddle.net/74ncq90w/

2.0μ—μ„œ ν…ŒμŠ€νŠΈλ˜μ—ˆμœΌλ©° μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€ : https://jsfiddle.net/dycmgzcm/
κ·Έλž˜μ„œ λ‚˜λŠ” 이것을 1.x의 λ²„κ·Έλ‘œ ν‘œμ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

1.x 문제λ₯Ό 1.x둜 μ’…λ£Œν•˜λ©΄ 이제 수λͺ…이 μ’…λ£Œλ˜λ©° μ€‘μš”ν•œ λ³΄μ•ˆ 패치 만 λ°›κ²Œλ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰