当前位置: 首页 > 知识库问答 >
问题:

Vuex:当vue瞬间中的对象发生属性更改时,是否可以直接从vue瞬间变异状态对象?

卞经业
2023-03-14

我正在使用vue和vuex来设置web应用程序。在此应用程序中,我希望以包含可编辑属性的对象形式将一些用户可编辑数据存储到vuex状态,即{firstname:,lastname::},但是有人告诉我,试着去掉监视对象变化的监视程序,让应用程序能够将变化的对象存储到状态。

我已尝试从存储中获取状态,并将其放入vue instant,让用户编辑绑定到对象属性的字段,即v-model:detail。firstname其中详细信息是从vuex存储中获取的对象。很明显,当值发生变化时,控制台会显示错误“不要在突变外存储数据”。我明白它的意思,所以后来我做了这样的事情:

模板:

<input type="text" v-model="detail.firstname" />
<br />
<input type="text" v-model="detail.lastname" />

脚本:

data() {
  return {
    detail: {}
  }
},
created: function () {
  // initialize this.detail with Object.assign to clone from another object etc.
},
watch: {
  'detail': {
    handler: function (val) {
      debugger;
      this.setTabStorageItem({ key: "modifyingDetail", value: val });
    },
    deep: true
  }
}

我知道值的更改不应该在变异的情况下进行,所以我不会直接从getter引用detail,直接更改该对象。但正如我所说的,我被告知不要使用watcher进行值更改。但如果是这样的话,我能想到的唯一解决方案就是直接从getter引用细节,这样v-model就可以在用户编辑时更改给定对象的属性,而问题又回到变异状态。

有没有其他的解决方案,我可以尝试,不使用观察者?

我认为在这个例子中还有另一个问题,它总是用一个新的对象替换整个对象。这听起来好像会对页面造成不必要的加载,因为所有状态更改都使用新对象。(请原谅我没有将此包含在标题/另一个问题中)解决此问题可能会导致告诉我不要使用watcher的人同意使用watcher。或者如果真的没有其他选择,他们会告诉我怎么用。

共有1个答案

高朝明
2023-03-14

我不确定我是否完全理解了您的意思,但根据我的理解,您想要做的是允许用户编辑值、firstname和lastname

我愿意

data(){
 return{
  detail:{
    firstname: this.$store.getters['getUser'].firstname,
    lastname: this.$store.getters['getUser'].lastname
  }
 }
}

通过观察者观察细节的变化

watch:{
  'detail.firstname': function(val){
    this.changeHandler()
  }
  'detail.lastname':function(val){
     this.changeHandler()
   }
}

如果您不关心与数据库同步,您可以提交(")每个数据更改

  methods:{
      changeHandler: function(){
         this.$store.commit('changeUser', {firstname: this.detail.firstname, 
                                           lastname: this.detail.lastname})
      }
    }

我甚至不知道为什么在用户单击某个提交按钮并在数据库中进行更改并将详细信息设置为最新值后,您会希望关注每一个更改,而不是更改详细信息

 类似资料:
  • 我目前正在做一个项目,我遇到了这个错误: 发生了什么:1。)我在登录后设置了一个会话范围变量,比如SessionScopeVariableA。 2.)然后我有一个页面,我在其中添加一个实体,比如EntityA。 3.)EntityA有一个惰性字段sessionScopeVariableA,所以当我调用add方法时,我必须设置这个变量。 4.)请注意,SessionScopeVariableA被包装

  • 更新父实体时出现以下错误:请注意,在持久化新的父子实体时没有错误,只有在合并操作时才会发生错误。 组织。冬眠TransientPropertyValueException:对象引用未保存的临时实例-在刷新之前保存临时实例: 以下是我的实体结构: 使用DTO通过网络向客户端发送数据,并使用Dozer映射工具将数据从实体复制到DTO。 下面是保存Vendor及其地址的EJB方法。Cascade选项设置

  • 问题内容: 我正在调试一些旧代码,在这些代码中,我们有一个似乎在外部更改的缓存对象。 如果我知道它的对象标识符(在调试时),是否有某种方法可以“监视”它,以便如果同一线程或另一个线程中的某些其他代码试图修改其状态,将触发我的调试? 我不能仅使用表达式监视它,因为在其他地方可能有对该对象的引用,并且同一类有很多实例。 问题答案: 当值更改时,在要停止的代码中设置一个断点。 从断点视图开始。 选择断点

  • 本文向大家介绍解决vue中对象属性改变视图不更新的问题,包括了解决vue中对象属性改变视图不更新的问题的使用技巧和注意事项,需要的朋友参考一下 常规情况下我们在vue实例的data中设置响应数据。但当数据为对象,我们增加或删除对象属性值时,视图并不触发更新,如何解决这个问题呢? 实例代码如下: 有三种解决方案: 方案一:利用Vue.set(object,key,val) 例:Vue.set(vm.

  • 问题内容: 每天都会通过Web服务导入数据。 我创建了一个pojo 的 新(临时)实例 ,该 实例 已通过JPA注释在hibernate中进行了映射。 我将来自Web服务的数据填充到临时实例中 我从数据库中加载要使用瞬时实例中的数据更新的持久对象。 我以某种方式将此瞬态实例与持久实例合并。如果持久对象在其字段之一上具有非null值,则不会被瞬态对象上的潜在null值覆盖。基本上,我不想丢失任何数据

  • 我有一个Vuex实例,其中包含两个变量: 我有我的主Vue实例,其中日期属性是从继承的: 我最初称之为不带任何额外参数,但是一旦和的值更改,我想调用上面的之类的函数。但是,当我更改和的值时,没有任何变化。 可能值得注意的是,当我使用Vue插件在Chrome中进行检查,并单击根组件时,视图中会突然显示更改?很奇怪