vue给对象新添加属性,一定要使用Vue.set( target, key, value )这个API来添加
this.tagList = [{
id:1,
tagName:'90后'
},
{
id:2,
tagName:'土豪'
},
{
id:3,
tagName:'美女'
},
{
id:4,
tagName:'帅哥'
},
{
id:5,
tagName:'鸽子王'
},
{
id:6,
tagName:'人傻钱多'
}]
今天做一个这样的功能:遍历对象数组 tagList 渲染出标签列表,以前写过类似的功能,但这次不一样,tagList的数组项中没有表示选中状态的属性select,我自己后面遍历添加的:
this.tagList.forEach((item,index)=>{
item.select = false
})
点击标签切换选中状态,动态添加class,
/* 渲染列表,动态添加class */
<ul class="tag_list">
<li v-for="(item, index) in tagList" @click="selectTag(index)" :class="{'select': item.select}">{{item.tagName}}</li>
</ul>
// 点击事件
selectTag(index){
this.tagList[index].select = !this.tagList[index].select;
}
点击每个标签,属性值select确实是变了,但是绑定的class名纹丝不动,这时我就慌了。
搞了半天终于搞好了,原来是这样的:
向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.obj.newProperty = 'hi')
官方文档:https://cn.vuejs.org/v2/api/#Vue-set
所以给对象添加属性应该这样写:
<script>
import Vue from 'vue'
export default{
data(){
},
methods:{
this.tagList.forEach((item,index)=>{
// item.select = false //这是错误写法
Vue.set(item,'select',false); //正确姿势
}
}
}
</script>
然后就完美实现了,哎,这么一个简单的功能搞了这么久,还是对官方API掌握不够呀。

2019/1/22日补充:
今天又遇到了类似的问题,这次是给二元数组添加新的数组元素,写法如下:
假设:this.tagList = [[5, 8], [3, 1]]
Vue.set(this.tagList, 2, ['a', 'b']) // [[5, 8], [3, 1], ['a', 'b']]
vue给对象新添加属性,一定要使用Vue.set( target, key, value )这个API来添加的更多相关文章
- vue 数组对象取对象的属性: Cannot read property 'xxxx' of undefined
{{ list[0].name }} list[0]没有定义 能正确打印出想要的结果,但就是报错,外面套个v-for就没错了 很费解 看到文章说是与异步有关,解决办法: <template v- ...
- 关于vue给对象新增属性页面不会动态更新
不知道大家有没有遇到过这个问题,当我们给data里边声明或者已经赋值过的对象或者数组,添加新的属性时,如果更新此属性的值是不会动态更新视图的. $set 看以下实例: 我们开始给drug_list追加 ...
- VUE(vue对象的简单属性)
一:全局过滤器和局部过滤器 ps:不管是局部过滤器还是全局过滤器,一定都要有renturn 返回 <!DOCTYPE html> <html lang="en"& ...
- iOS Category 添加属性实现原理 - 关联对象
iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...
- vue data对象添加新属性触发视图
<template> <div class="wrap open"> <a>{{test01.name}}</a> <a> ...
- vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)
Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...
- 针对vue中请求数据对象新添加的属性不能响应式的解决方法
1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...
- javascript已存在的对象构造器中是不能添加新的属性的:
<!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鸟教程 ...
- Vue对象提供的属性功能
一. 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种: 1. 使用Vue.filter()进行全局定义 示例: < ...
随机推荐
- 学习——HTML5中事件
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- Mysql学习总结(7)——MySql索引原理与使用大全
一.索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构.在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快.索引的作用相当于图书的目录,可以根据目录中的页 ...
- [转]LNMP环境下的Web常见问题排查(精品)
来源:http://mp.weixin.qq.com/s? __biz=MjM5NzUwNDA5MA==&mid=200596752&idx=1&sn=37ecae802f32 ...
- [Parcel] Bundle a React App with Parcel
Parcel comes in as the new cool kid in the bundlers world. Unlike other bundlers which take lots of ...
- RvmTranslator6.0
RvmTranslator6.0 eryar@163.com 1. Introduction RvmTranslator can translate the RVM file exported by ...
- Linq复杂对象查询
复杂的查询对象, using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- Android Studio 中 gradle 构建 堆栈空间不足
Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of ...
- 体验SUSE (附视频演示)
操作动画演示 本文出自 "李晨光原创技术博客" 博客,谢绝转载!
- FZU 2205 据说题目很水
2205 据说题目很水 Accept: 199 Submit: 458Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Descr ...
- Linux shell command学习笔记(二)
<cut> 作用:从输入文件或者命令的输出中析取出各种域 用法:cut –c{字符串范围} –d{字段间分割符} –f{字段索引编号} 举例: (1)查看在线用户:who | cut –c ...