demo代码如下:

    1. <template>
    2. <div>
    3. 翻车现场,以下是数组
    4. <button @click="reset">复原</button>
    5. <button @click="deleteLast">删除最后一个元素</button>
    6. <button @click="deleteSecond">删除第二个元素</button>
    7. <ul>
    8. <select>
    9. <option v-for="(item, index) in targetArr" :key="index" value="">{{item.name}}</option>
    10. <!-- <option v-for="item in targetArr" :key="item.id" value="">{{item.name}}</option> -->
    11. </select>
    12. </ul>
    13. </div>
    14. </template>
    15. <script>
    16. export default {
    17. data() {
    18. return {
    19. targetArr: [],
    20. testData1: [
    21. {
    22. id: 1,
    23. name: 'aaa',
    24. },
    25. {
    26. id: 2,
    27. name: 'bbb',
    28. }, {
    29. id: 3,
    30. name: 'ccc',
    31. }, {
    32. id: 4,
    33. name: 'ddd',
    34. },
    35. ],
    36. };
    37. },
    38. created() {
    39. this.targetArr = JSON.parse(JSON.stringify(this.testData1));
    40. },
    41. mounted() {
    42. },
    43. methods: {
    44. reset() {
    45. this.targetArr = JSON.parse(JSON.stringify(this.testData1));
    46. },
    47. deleteLast() {
    48. this.targetArr.pop();
    49. },
    50. deleteSecond() {
    51. this.targetArr.splice(1, 1);
    52. },
    53. },
    54. };
    55. </script>
    56. <style scoped lang="css">
    57. </style>

    bug复现步骤:

    • 1、选择选择框,选到第三项 ccc
    • 2、点击删除“第二个元素”
    • 3、这个时候发现:选择框自动选到了第四项 ddd

    使用index的缺点:

    • 通常来说,只是显示不会有什么问题。但是如果有删除之类的操作,则可能出现上述bug。
    • 果有删除之类的操作,会影响性能。因为删除列表中的一项后,数组各项的index都发生了改变,要重新渲染