vue.js $set的使用 数组

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="vue.js"></script>
    <style>
    .blue {
        color: blue;
    }
    </style>
</head>

<body>
    <div id="example-1">
        <ul>
            <template v-for="item in items">
                <li>
                    {{$index}}.{{ item.msg }}

                    <button v-on:click="f5(item)">vm.items.splice(index, 1)</button>

                    <button v-on:click="f6(item)">vm.remove</button>
                </li>
            </template>
        </ul>

        
        <ul>
            <li>
                <button v-on:click="f1">vm.items[0] = {} 失效</button>
            </li>
            <li>
                <button v-on:click="f2">vm.items.$set(0, { childMsg: 'Changed!'}) </button>
            </li>
            <li>
                <button v-on:click="f3">vm.items.length = 0 失效</button>
            </li>
            <li>
                <button v-on:click="f4">vm.items={}</button>
            </li>
        </ul>
        <div class="blue">
            {{$data | json }}
        </div>
        <pre>
        因为 JavaScript 的限制,Vue.js 不能检测到下面数组变化:
        直接用索引设置元素,如 vm.items[0] = {};
        修改数据的长度,如 vm.items.length = 0。
        </pre>
    </div>
    <script>
    var vm = new Vue({
        el: '#example-1',
        data: {
            items: [{
                msg: 'Foo'
            }, {
                msg: 'Bar'
            }, {
                msg: 'George'
            }]
        },
        methods: {
            f1: function() {
                vm.items[0] = {}; // 失效
            },
            f2: function() {
                vm.items.$set(0, {
                    childMsg: 'Changed!'
                })
                
                 vm.items.$set(2, {
                    msg: 'dongtao!'
                })
            },
            f3: function() {
                vm.items.length = 0; // 失效
            },
            f4: function() {
                vm.items = {}
            },
            f5: function(item) {
                var index = this.items.indexOf(item) //Search an array for the item
                if (index !== -1) {
                    this.items.splice(index, 1) //Selects a part of an array, and returns the new array
                }
            },
            f6: function(item) {
                this.items.$remove(item)
            }
        }

    })
    </script>
</body>

</html>

### Vue.js 使用 `this.$set` 更新数组元素的方法及注意事项 在 Vue.js 中,为了确保数据变更能够被检测到并触发视图更新,对于数组的操作应当使用特殊的方式。直接修改数组索引不会触发视图更新,因此推荐使用 `this.$set` 来实现这一目的。 #### 修改现有数组项 当需要更改数组内的某个元素时,可以利用 `this.$set` 方法指定位置进行替换: ```javascript methods: { updateArrayElement(index, newValue) { this.$set(this.items, index, newValue); } } ``` 上述代码展示了如何通过提供具体的索引来更新数组中的单个项目[^1]。 #### 向数组追加新项 如果目的是向数组添加新的成员而不是覆盖已有条目,则应该采用如下方式: ```javascript methods: { addItem(newValue) { this.items.push(newValue); // 或者使用其他原生方法如 unshift() // 如果希望显式调用 $set 可以这样做: // let newIndex = this.items.length; // this.$set(this.items, newIndex, newValue); } } ``` 这里需要注意的是,在大多数情况下直接使用 JavaScript 的内置函数(比如 push)就足够了,并不需要额外调用 `$set` 函数来完成这项工作[^3]。 #### 替换整个数组 有时可能想要一次性替换成一个新的数组实例,这时可以直接给原来的变量名赋予新的值: ```javascript data() { return { items: [] }; }, methods: { replaceItems(newItems) { this.items = newItems; // 这样做会使 Vue 自动追踪变化 } } ``` 这种方式简单有效,适用于完全重置列表的情况[^2]。 #### 注意事项 - **避免直接设置键值对**:不要尝试像对待普通对象那样直接修改数组下标的值,因为这可能导致响应机制失效。 - **保持一致性**:始终遵循官方文档建议的最佳实践,以确保应用稳定性和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值