Vue.js 当指定给零部件特性时,防止对象转换为反应对象

Vue.js 当指定给零部件特性时,防止对象转换为反应对象,vue.js,vuejs2,vue-component,Vue.js,Vuejs2,Vue Component,这个有点奇怪,对不起 我正在使用第三方库从API获取一些数据 import lib from 'third-party' import Vue from 'vue' @Component({}) export default UserComponent extends Vue{ public user = null as lib.User | null mounted(){ lib.getUser().then((val: lib.User) => { th

这个有点奇怪,对不起

我正在使用第三方库从API获取一些数据

import lib from 'third-party'
import Vue from 'vue'

@Component({})
export default UserComponent extends Vue{
  public user = null as lib.User | null

  mounted(){
    lib.getUser().then((val: lib.User) => {
      this.user = val; /// this is where things blow up
    })
  }
} // this is from memory, but it looks like a decent recreation ¯\_(ツ)_/¯
因此,lib从API调用中获取响应,并使用它生成lib.User类型的实例。到目前为止还可以,但只要我将响应分配给组件中的属性,新“lib.User”实例中的几个函数就会触发,并且我开始收到大量错误

我的猜测是Vue正在将对象属性转换为反应属性,这会导致触发事件

如果可以避免的话,我希望在组件中有这个对象,而不必将它映射到本地生成的对象


是否有任何方法可以防止这种行为?

假设问题的原因是由于对象处于反应状态,那么可以通过三种方式避免这种情况的发生

方式1

不要将用户定义为组件实例上的被动数据属性。我不知道如何在Typescript中实现这一点,但通常您会在数据对象中省略user,而是在创建的钩子中初始化this.user

这样做的结果是this.user属性将不会是被动的。这可能不是你想要的

方式2

如果将冻结对象分配给此用户,则Vue将不会使对象处于反应状态:

this.user=Object.user 这样做的结果是,用户对象上的所有属性都将变为只读,这可能不是您想要的

您可以改用Object.seal或Object.preventExtensions

方式3

通过将用户对象上的_isVue属性指定为true,可以诱使Vue认为该用户对象已经是被动的;这样Vue就不会观察到它了

用户。_isVue=true this.user=user
这样做的结果是,据我所知,它不是一个公共API,因此将来可能会更改,我认为它可能会出现在Vue 3中。

这看起来非常有希望。事实上,我认为用户只读是好的。我稍后会尝试这个,并相应地标记。非常感谢。