VueJS - 如何从方法内的函数更新组件数据?

Posted

技术标签:

【中文标题】VueJS - 如何从方法内的函数更新组件数据?【英文标题】:VueJS - How to update component data from a function inside a method? 【发布时间】:2020-08-03 01:14:01 【问题描述】:

我正在尝试使用 Firebase 进行搜索。我的 VueJS 代码中有这个。

export default 
  data () 
    return 
      listings: [],
      searchData: 
        keyword: ""
      
    
  ,
  name: 'SearchScreen',
  components: 
    ValidationProvider,
    ValidationObserver
  ,
  firebase: 
    listings: listingsRef
  ,
  methods: 
    search () 
      console.log(this.searchData.keyword)
      listingsRef.orderByChild('location').equalTo(this.searchData.keyword).on('value', function (snapshot)
        console.log(snapshot.val())
        return
          listings: snapshot.val()
        
      )
    
  

现在当我执行console.log 时,它成功过滤出数据并在控制台中显示响应。但是我无法使用从 Firebase 获得的响应来更新组件数据中的“列表”。试过this.listing 但没有用。我该怎么做?

【问题讨论】:

console.log(snapshot.val()) 返回什么?数组还是对象? @palash 它是一个对象数组 什么是 console.log( this ) 里面 search () 在开始和里面 .on('value', function (snapshot) ... ?请在主帖中发布图片。 @palaѕн 我解决了。 (snapshot)=> 完成了这项工作。谢谢 【参考方案1】:

您应该将this(组件实例)分配给全局变量vm,然后在回调中将snapshot.val() 分配给listing 数据属性,如下所示:

 search () 
      console.log(this.searchData.keyword)
       let vm =this;
      listingsRef.orderByChild('location').equalTo(this.searchData.keyword).on('value', function (snapshot)
        console.log(snapshot.val())

          vm.listings= snapshot.val()

      )
    

或将回调用作箭头函数(snapshot)=>

 search () 
      console.log(this.searchData.keyword)
      listingsRef.orderByChild('location').equalTo(this.searchData.keyword).on('value',  (snapshot)=>
        console.log(snapshot.val())

          this.listings= snapshot.val()

      )
    

【讨论】:

我试过了,但它说Cannot set property 'listings' of null nullundefined ?你添加let vm =this;了吗? @SuvinNimnakaSukka 这是不可能的,因为vm这里指的是vue实例。 @Boussadjra null 。是的,我也添加了这个 @palaѕн 你是什么意思?【参考方案2】:

向搜索功能添加对组件的引用

thisComponent = this

然后在函数内部(快照)

use thisComponent.searchData.keyword = (whatever)

【讨论】:

【参考方案3】:

一种方法是将this 绑定到您的函数:

listingsRef.orderByChild('location').equalTo(this.searchData.keyword).on('value', function (snapshot)
    this.listings = snapshot.val()
.bind(this))

参考:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Function/bind

【讨论】:

没用 :( 但是@Boussadjra 提供了一个带有箭头功能的解决方案,它有效。谢谢 好的!很高兴知道! :) 不要忘记支持@Boussadjra 的答案并将其作为您问题的正确答案。

以上是关于VueJS - 如何从方法内的函数更新组件数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级更新 vuejs 组件

vueJS 路由器:从组件数据更新页面标题

vuejs啥时候使用钩子函数

如何使用使用 promise 的方法对 vuejs 组件更新进行单元测试

使用 axios.put [laravel + vuejs 3] 更新模式内的数据时出现错误 422

打造可复用Vuejs组件