随笔 - 441  文章 - 4  评论 - 84  阅读 - 109万 

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。

根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property)。然而它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上。

我们编写如下代码测试给一个对象动态添加属性:

复制代码
<div id="app">
    <input v-model="form.amount" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        i:0,
        form:{}
    },
    methods:{
        demoSet(){
            this.form.amount=this.i++;
            //this.$set(this.form,"amount",this.i++);
        }
    }
   });
</script>
复制代码

这种方式可以给form增加一个属性,但是不会界面不会响应更新。

正确的做法:

复制代码
<div id="app">
    <input v-model="form.amount" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        i:0,
        form:{}
    },
    methods:{
        demoSet(){
            this.$set(this.form,"amount",this.i++);
        }
    }
   });
</script>
复制代码

这样就可以给对象添加amount 属性了。

这个有什么应用场景呢,比如 data.form 属性很多,其中大部分是不需要要的,这时候,可以使用这种方法实现动态添加需要的属性。

需要注意的是,这种方式是不能给根数据添加属性的,比如:

复制代码
<div id="app">
    <input v-model="name" /> 
    <input type="button" @click="demoSet()" value="setName">
</div>
<script type="text/javascript">
var vm=new Vue({
    el: "#app",
    data: {
        
    },
    methods:{
        demoSet(){
            this.$set(this,"name","ray");
        }
    }
   });
</script>
复制代码

这种方式给data 增加一个 name 属性是无效的。

 

posted on   自由港  阅读(16199)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示