未触发计算属性(添加到 Set)

Posted

技术标签:

【中文标题】未触发计算属性(添加到 Set)【英文标题】:Computed property not triggered (add to Set) 【发布时间】:2020-12-05 13:36:51 【问题描述】:

免责声明:javascript 新手

我只是试图通过以下方式跟踪组件中的所有当前错误,但我不明白我做错了什么。每次用户名更改时,我的错误集都会更新,也就是说,我的计算属性 displayErrors 基于 errors 集也应该更改:

html 组件

<ol v-if="displayErrors">
  <li v-for="e in errors" v-bind:key="e">
     e 
  </li>
<ol>

数据

data: function () 
    return 
      username: "",
      errors: new Set(),
    
  

观察者和方法

watch: 
    username: function (username) 
      this.checkUsernameAvailability(username)
    
  ,
  methods: 
    async checkUsernameAvailability(username) 
      const errorCode = 'usernameNotAvailable'

      try 

        const response = await this.$apollo.query( query: GET_USERS_QUERY )
        const users = response.data.users

        const usernames = users.map((user) =>  return user.username )
        
        if (usernames.includes(username)) 
          this.errors.add(errorCode)
         else 
          this.errors.delete(errorCode)
        
        
        // trying to force the computed property
        this.$forceUpdate()

       catch (error) 
        console.log(error)
        return false
      
    
  

计算属性

computed: 
    displayErrors: function() 
      console.log('triggered', this.errors.size)
      return this.errors.size > 0
    
  

提前致谢!

【问题讨论】:

new set() 不适用于 Vue。最好使用 Array 来实现您想要的。 【参考方案1】:

Set 不能被 Vue 观察到,只能被普通对象观察到。

data 属性的 docs 解释了这一点(这也适用于计算属性):

Vue 实例的数据对象。 Vue 将递归地将其属性转换为 getter/setter 以使其“反应”。 对象必须是普通对象:忽略浏览器 API 对象和原型属性等原生对象。经验法则是数据应该只是数据 - 不建议观察具有自己状态行为的对象。

您应该使用数组来存储错误列表。

【讨论】:

以上是关于未触发计算属性(添加到 Set)的主要内容,如果未能解决你的问题,请参考以下文章

vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

更改记录时,DS 模型记录上的 Ember 计算属性未触发

对挂载中的属性的更改未触发在 VueJS 中计算

使用 Nhibernate 按未映射的计算属性进行排序

Vue3.x computed函数----计算属性

Vue 中未调用计算属性集