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来添加的更多相关文章

  1. vue 数组对象取对象的属性: Cannot read property 'xxxx' of undefined

    {{ list[0].name }} list[0]没有定义 能正确打印出想要的结果,但就是报错,外面套个v-for就没错了 很费解 看到文章说是与异步有关,解决办法: <template v- ...

  2. 关于vue给对象新增属性页面不会动态更新

    不知道大家有没有遇到过这个问题,当我们给data里边声明或者已经赋值过的对象或者数组,添加新的属性时,如果更新此属性的值是不会动态更新视图的. $set 看以下实例: 我们开始给drug_list追加 ...

  3. VUE(vue对象的简单属性)

    一:全局过滤器和局部过滤器 ps:不管是局部过滤器还是全局过滤器,一定都要有renturn 返回 <!DOCTYPE html> <html lang="en"& ...

  4. iOS Category 添加属性实现原理 - 关联对象

    iOS Category 添加属性实现原理 - 关联对象 RunTime为Category动态关联对象 使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系.对象一开始初始化的时候其属性 ...

  5. vue data对象添加新属性触发视图

    <template> <div class="wrap open"> <a>{{test01.name}}</a> <a> ...

  6. vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)

    Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...

  7. 针对vue中请求数据对象新添加的属性不能响应式的解决方法

    1.需要给对象添加属性时,不能采用传统的obj.属性=值,obj[属性]=值 来添加属性,在vue页面时需要这样使用 this.$set(obj,"propertyName",&q ...

  8. javascript已存在的对象构造器中是不能添加新的属性的:

    <!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鸟教程 ...

  9. Vue对象提供的属性功能

    一. 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种: 1. 使用Vue.filter()进行全局定义 示例: < ...

随机推荐

  1. POJ——T 2299 Ultra-QuickSort

    http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 62894   ...

  2. 洛谷 P1964 【mc生存】卖东西

    P1964 [mc生存]卖东西 题目背景 服务器好好玩 题目描述 lcy0x1去服务器的系统商店卖东西. 一个人的背包有21格. 一开始他的背包里有m件不同的物品(不能卖). 他要卖n种物品,每种物品 ...

  3. 矩阵乘法2(codevs3147)

    题目描写叙述 Description 给出两个n*n的矩阵.m次询问它们的积中给定子矩阵的数值和. 输入描写叙述 Input Description 第一行两个正整数n,m. 接下来n行,每行n个非负 ...

  4. Razor数组数据

    控制器层 public ActionResult DemoArray() { Product[] array = { new Product {Name = "Kayak", Pr ...

  5. pip的认识

    一.pip与python的关系:pip并不是一种语言,而是一个Python包管理工具,主要是用于安装 PyPI 上的软件包.安装好pip之后,使用pip install 命令即可方便的安装python ...

  6. PHP foreach遍历数组之如何判断当前值已经是数组的最后一个

    先给出foreach的两种语法格式 1,foreach (array_expression as $value) statement 2,foreach (array_expression as $k ...

  7. Vue 国家省市三级联动

    在网上查阅一下,基本上是省市区三级联动,国家省市的就只能自己动手了. 样式就根据自己的需要去调整了. JSON数组太长,就折叠放在了后面. 效果图: <!DOCTYPE html> < ...

  8. CSS 文本样式

    1. 文本样式 text <!--文本颜色color --> .text {color:red;} 2. 文本对齐方式    text-align <style> .text ...

  9. [Javascript] Identify the most important words in a document using tf-idf in Natural

    Tf-idf, or term frequency-inverse document frequency, is a statistic that indicates how important a ...

  10. userAgent判断客户端,以及各个浏览器的ua

    userAgent判断客户端,以及各个浏览器的ua http://blog.csdn.net/yoyoosyy/article/details/70142884 navigator.userAgent ...