次のコードについて考えてみます。
<div id="demo">
<select v-model="selected" number>
<option v-for="opt in options" :value="$index" number>{{opt}}</option>
</select>
</div>
<select>
では、各オプション値は$index
バインドされます。 options
でsplice()
を実行すると、 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/
選択した属性をテンプレートに追加するだけですselected="{{$index == selected}}"
ここでデモを更新しますhttps://jsfiddle.net/trwp98g9/5/
@peteranny予想される動作を明確にできますか?
options.splice(0,1)の後、options = ['b']ですが、レンダリングされたHTMLは次のようになります。
<option value="1">b</option>
ここから提供したものと同じ結果が得られません:
[削除]をクリックする前に:
クリック後:
'b'オプションの値は1になりません。これは、$ indexのために0になるはずです。
それで、それは正確に何になるべきですか? 'b'の値は、クリック前は1でしたが、クリック後は0になりました。
@fnlctrlええと、テストしていただきありがとうございます。 私は間違った質問をしたと思います。
テストによると、「b」の値はクリック後に0になりました。
私の本当の質問は、「b」の値が0になったのに、なぜ<select>
が「b」を選択しなかったのかということです。
画像に見られるように、 <select>
はオプションをまったく選択しません<select>
は値0のオプションを選択する必要があります。
(そのため、「b」の値は変わらないと誤解しました。)
@peteranny options
変更されている間selected
が0のままであり、domがこの変更を反映することになっているため、バグの可能性がありますが、よくわかりません。
今のところ、 @ defccが提案したようにselected
小道具を追加してみることができます(小道具/属性の口ひげバインディングは2.0で非推奨になるため、代わりに:selected="$index == selected"
を使用してください)
または、 track-by
小道具を<options>
に追加することもできます。これにより、選択した値をdomで更新しても安全であるとvueに思わせることができます。 https://jsfiddle.net/74ncq90w/
2.0でテストされ、期待どおりに機能しました: https :
だから私はこれを1.xのバグとしてマークしています
1.xはサポート終了となり、重要なセキュリティパッチのみを受け取るため、1.xの問題をクローズします。
最も参考になるコメント
2.0でテストされ、期待どおりに機能しました: https :
だから私はこれを1.xのバグとしてマークしています