
<button v-for="catalog in catalogs" :key="catalog.id" :class="{'active': current_catalog==catalog.name}" @click="change(catalog.name)" > {{ catalog.name }} </button> data() { return { catalogs: [{id: 999, name: '不限类目'}], current_catalog: '不限类目' } }, created() { $axios({ method: 'get', url: '/api/catalog' }) .then( resp=> { this.catalogs = this.catalogs.concat(resp.data.data) }) }, methods: { change(val) { this.current_catalog = val }, } 之前问过一次, 补上代码. 需要 class="active"生效, 如果 catalogs 一开始写死, 就没问题, 但如果用请求的数据, 就没辙了. 不知道怎么解决?
1 donething 2019-08-05 00:04:47 +08:00 使用 Vue.set()向数组添加新元素,看看 |
2 xxx749 2019-08-05 00:10:00 +08:00 via Android Vue 的数组变异方法里没有 concat,试试 this.catalogs = [...this.catalogs.concat, ...resp.data.data] |
3 luckyx 2019-08-05 05:08:00 +08:00 via iPhone :class="'active:'+current_catalog==catalog.name" |
4 Exceptionluo 2019-08-05 09:06:32 +08:00 看代码应该没问题呀 建议检查下返回的数据结构 |
5 aria955 2019-08-05 09:54:56 +08:00 watch catelogs 试试看 |
6 xutao881 2019-08-05 10:35:50 +08:00 写了测试方法没问题,建议放一下返回数据结构 |
7 aoscici2000 OP @xutao881 那就相当奇怪了... 数据结构没问题的, button 里面的内容也显示正常 |
8 xutao881 2019-08-05 11:07:47 +08:00 @aoscici2000 贴一下 concat 之后的 catalogs 看看 |
9 aoscici2000 OP @xutao881 [{"id":999,"name":"不限类目"},{"id":10007,"name":"游泳"},{"id":10008,"name":"瑜伽"}......] ,直接从 Vue devtools 复制的 |
10 no1xsyzy 2019-08-05 12:30:27 +08:00 |
11 no1xsyzy 2019-08-05 12:35:21 +08:00 考虑:HTML/JS 预处理器的存在导致代码语义变化、各库版本(以 lock 文件为标准)、 |
12 aoscici2000 OP .then(resp => { this.$set(this, 'catalogs', resp.data.data) }) 也无效 |
13 SilentDepth 2019-08-05 14:19:08 +08:00 从贴出来的代码上看,没问题。我现在只能怀疑是你的 Array.prototype.concat 有问题。 @aoscici2000 #12 this.$set( ) 不能这么用,应该是: this.$set(this.catalogs, 1, resp.data.data[0]) // ... |
14 aoscici2000 OP @SilentDepth 文档里#Vue.set(object, key, value) 不是这样的? 我就直接不要原本定死的那个数据了, 数据添加也能正常. this.$set(this.catalogs, 1, resp.data.data[0]) 这个倒是有点看不懂什么意思了, 1 是什么意思? |
15 aoscici2000 OP @no1xsyzy 晕, 这难道我在组件里用的就无效... |
16 SilentDepth 2019-08-05 14:43:27 +08:00 @aoscici2000 #14 Vue 官方文档: 注意对象( Vue.set( ) 的 target 参数)不能是 Vue 实例,或者 Vue 实例的根数据对象。 1 是 this.catalogs 的属性名。由于它是个数组,所以属性名就是数字的形式,也就是数组下标。 |
17 jtwor 2019-08-05 15:19:09 +08:00 (current_catalog==catalog.name) |
18 aoscici2000 OP @SilentDepth 得到的数据正常, get, set 什么的属性都有, :class 就是不工作, 放弃了 .then(resp => { let list = resp.data.data for (let i=0, len=list.length; i<len; i++) { this.$set(this.catalogs, i+1, list[i]) } }) |
19 hellomimi 2019-08-05 15:26:38 +08:00 代码没问题,console.log(resp)看看返回数据 |
20 hellomimi 2019-08-05 15:29:06 +08:00 .active 的样式、css 权重检查一下 |
21 rain0002009 2019-08-05 15:38:40 +08:00 你把 current_catalog==catalog.name 展示出来 到底是 true 还是 false |
22 no1xsyzy 2019-08-05 15:43:00 +08:00 如果确实替换 data() > return object > 'catalogs' 和 create() 就能解决的话(请先确认)考虑: 1. :class 内容是否写错?= 与 ==,或者 === 试一下 2. class 确认没有正确填上,而不是 #20 猜测的那样 class 填上了样式没正确应用? 3. Promise.resolve() 替换一下试试? 4. 将 active 的判断转化为 ((x,y)=>{console.log(x,y,x==y);return x==y})(current_catalog,catalog.name),来 hook 进去打一下 log |
23 yang137162692 2019-08-05 17:13:05 +08:00 this.catalogs = this.catalogs.concat(resp.data.data) 更新数组 使用 concat 不会触发 vue 更新 |
24 hellomimi 2019-08-05 17:39:46 +08:00 |
25 mikoshu 2019-08-05 17:48:53 +08:00 数组用 push 进去 才会监听到变动 |
26 wlor 2019-08-06 09:24:36 +08:00 Vue 2.0 是基于 Object.defineProperty 对对象实现“响应式化”,而对于数组,Vue 提供的方法是重写 push、pop、shift、unshift、splice、sort、reverse 这七个数组方法 你用 concat 是监听不了的 要用的话用 Vue,$set 你的$set 用错了 而且不建议你用 concat 方法 性能很差 |
27 no1xsyzy 2019-08-06 14:53:09 +08:00 @wlor @yang137162692 @mikoshu 所以说现在我很怀疑 v2 前端水平 Array::concat 不是变异方法,调用完原数组不变的 触发变动的是对 this.catalogs 全量赋值,不然我 #10 的例子和 #24 的例子为什么能正常工作? 另一方面印证,楼主仅仅是 :class 不能正常工作,而不是 v-for,所以可见给 this.catalogs 赋值正常工作了。 |
28 yang137162692 2019-08-06 16:27:49 +08:00 @no1xsyzy 嘿嘿,不好意思,不会再随意回复了 |