拜托 vue 的小伙伴们帮忙看个问题

2019-01-18 12:36:33 +08:00
 zuicaidenage

现在我的页面上有个 select

<select type="text" class="form-control" v-bind="chooseItem" v-on:change="changeApp($event.target.value)">
       <option value="" selected="selected">-- 应用来源 --</option>
       <option v-for="item in channelList" :value="item.id" v-text="item.name"></option>
</select>

我绑定了一个 chooseItem data 为 chooseItem:{}, 然后我的 methods 里有两个方法

add: function () {
                this.editLayer.display = true;
                // this.chooseItem = {};
                // this.chooseItem.app = "";
            },
changeApp: function(val){
              this.$set(this.chooseItem,'app',val)
            }

add 方法调用后会展示这个选择框

我写了个 computed

computed : {
          productList:function(){
            if(app == '**') {
              return this.products[0]
            }else if (app == '***') {
              return this.products[1]
            }else {
              return {}
            }
          }
        },

我发现如果我注释掉 methods 里的this.chooseItem.app = "";时,我的 computed 才会随着 select 的切换改变值,不加注释的话 computed 就毫无反应,不过这是什么原因呢?难道是这行代码使 chooseItem.app 变成了非响应式属性嘛?

2978 次点击
所在节点    前端开发
13 条回复
corkspin
2019-01-18 12:50:50 +08:00
对象变了吧,监听不到 property 的变化
FakeLeung
2019-01-18 12:59:23 +08:00
修改对象要用 $set。试试。
shintendo
2019-01-18 13:08:08 +08:00
你的 data 是怎么定义的?
zuicaidenage
2019-01-18 13:39:39 +08:00
@FakeLeung `this.$set(this.chooseItem,'app',val)` 就是这行吧
zuicaidenage
2019-01-18 13:40:03 +08:00
@shintendo chooseItem: {}
zuicaidenage
2019-01-18 13:40:37 +08:00
@corkspin 只是 chooseItem 的属性变了吧
shintendo
2019-01-18 15:20:20 +08:00
没看懂你的 computed 里面的 app 这个变量是哪来的,跟 chooseItem.app 什么关系。
只说一下,只有定义在 data 里面的属性是响应式的,后续用$set 新加的属性也是响应式的,直接用.赋值的属性不是响应式的。
好的实践是尽可能地把要用到的变量和属性都在 data 里面定义出来。
nekoneko
2019-01-18 15:58:44 +08:00
真的没看懂想干嘛。。。。
zuicaidenage
2019-01-18 15:59:34 +08:00
@shintendo 代码删多了。。 `let app = this.channelList.filter(t=>t.id==this.chooseItem.app)[0]`
corkspin
2019-01-18 19:30:38 +08:00
// this.obj.a='' 这行注释掉的话切换选择框计算属性是有效的,去掉注释就不行
corkspin
2019-01-18 19:33:11 +08:00
// this.obj.a='' 这行注释掉的话切换选择框计算属性是有效的,去掉注释就不行
动态增加属性,不能监听。change 方法里的这个 this.$set(this.obj, 'a', val)检查到已经有了的属性也不会监听。
所以应该就这样了吧
Trim21
2019-01-18 20:28:03 +08:00
在 data 里给 obj.a 加一个默认值就好了
zuicaidenage
2019-01-19 16:02:34 +08:00
多谢楼上两位指点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/528245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX