this.$set小例子

如下图一,现在需要做一个单选框的功能。思路:for循环,将所有变成false,让当前变成true。在创建arr的过程中,先有name这个属性。然后利用for循环给arr的每一项添加一个状态。点击的时候,让arr中每一项的状态都变成false,让当前的状态变为true
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app">
		<table>
			<tr>
				<th>姓名</th>
				<th>操作</th>
			</tr>
			<tr v-for="item,index in arr">
				<td>{{item.name}}</td>
				<td>
					<input type="checkbox" v-model="item.status" @click="inputShow(index)" style="zoom:150%;">
				</td>
			</tr>
		</table>
	</div>
	
<script src='vue.js'></script>
<script>
    

    new Vue({
        el:'#app',
        data:{
        	arr:[
        		{
        			name :'小黄'
        		},
        		{
        			name :'小明'
        		},
        		{
        			name :'小红'
        		}
        	]
        },
        created:function() {
        	this.getArr()
        },
        methods:{
        	getArr() {
        		for (var i = 0; i < this.arr.length; i++) {
	        		this.arr[i].status = false
	        	}
        	},
        	inputShow (item) {
        		for (var i = 0; i < this.arr.length; i++) {
        			this.arr[i].status = false
        		}
        		item.status  = true
        		console.log(this.arr)
        	}
        }
    })
</script>
</body>
</html>


这里会出现问题。打印出来最终的arr,status是对的,但是页面中的checkbox的状态有问题?

原因就出在for循环中对arr进行的赋值操作。

在vue文档中有这样一段话。

Vue 不能检测到对象属性的添加或删除

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

  1. 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength
此时用set方法就能解决问题

将for循环中的代码改为 this.$set(this.arr[i],'status', false)即可

### Vue.js 中 `this.$set` 的使用方法 在 Vue.js 中,`this.$set` 是一种用来向对象动态添加响应式属性的方法。当直接通过赋值的方式给对象新增一个未定义过的属性时,Vue 无法检测到该变化并触发视图更新。此时可以通过调用 `this.$set` 来确保新属性具有响应性。 #### 基本语法 以下是 `this.$set` 的基本语法结构[^2]: ```javascript this.$set(target, key, value); ``` - **target**: 需要修改的目标对象。 - **key**: 新增或修改的属性名称。 - **value**: 设置的新值。 #### 示例代码解析 以下是一个完整的示例,展示如何利用 `this.$set` 动态添加响应式属性: ```html <template> <div> <!-- 绑定输入框 --> <input type="text" v-model="obj.a" /> <input type="text" v-model="obj.b" /> <input type="text" v-model="obj.c" /> <hr /> <!-- 添加按钮 --> <button @click="addProperty">点击出现 c</button> </div> </template> <script> import Vue from "vue"; export default { data() { return { obj: { a: 1, b: 2, }, }; }, methods: { addProperty() { // 使用 this.$set 向 obj 对象中添加新的响应式属性 c this.$set(this.obj, "c", 3); }, }, }; </script> ``` 在这个例子中,初始状态下的 `obj` 对象只包含两个键 (`a`, `b`)。当我们点击按钮时,会执行 `this.$set(this.obj, 'c', 3)`,从而动态地为 `obj` 添加了一个名为 `c` 的响应式属性,并将其初始化为数值 `3`。 --- ### 常见问题及解决方案 1. **为什么需要使用 `this.$set`?** 如果尝试直接通过赋值方式(如 `this.obj.newKey = newValue`)向已有的对象添加新属性,则 Vue 不会自动追踪这些更改,也不会重新渲染视图。这是因为 Vue 在实例化时只会对已经存在的属性设置 getter 和 setter。为了使新增加的属性也具备响应能力,必须显式调用 `this.$set` 或者其全局形式 `Vue.set`[^1]。 2. **数组中的索引变更不生效怎么办?** 当操作的是数组而非普通对象时,某些特定的操作可能不会被 Vue 自动捕获。例如,直接通过下标修改数组项(即 `arr[index] = newValue`),这种情况下也需要借助于 `this.$set` 方法来完成响应式更新: ```javascript let index = 0; this.$set(this.array, index, newValue); ``` 3. **性能优化建议** 尽量减少频繁调用 `$set` 操作复杂的数据结构。对于大量数据绑定场景,考虑提前规划好所有的字段,在组件创建阶段就一次性声明出来,这样可以避免运行期间额外引入开销较大的动态调整逻辑。 4. **替代方案——Vuex 状态管理工具** 在实际项目开发过程中,尤其是面对复杂的跨模块通信需求时,推荐采用 Vuex 进行集中化的状态管理和同步控制,而不是单纯依赖局部变量配合手动调用 `$set` 完成任务。 --- ### 总结 综上所述,掌握 `this.$set` 的正确应用能够有效解决因 Vue 数据观测机制局限而导致的功能异常现象;与此同时也要注意合理设计程序架构以降低不必要的复杂度提升维护效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值