Vue 3 模式在重新打开时返回旧数据

Posted

技术标签:

【中文标题】Vue 3 模式在重新打开时返回旧数据【英文标题】:Vue 3 Modal Comes Back With Old Data When Reopen 【发布时间】:2021-01-18 20:29:43 【问题描述】:

我正在使用 Vue 3 和 Vuex 4。当我打开模态框时,主对象(汽车)变得等于默认对象,并且这些默认值填充模态框的表单。下面的代码是简化版。

Vuex 模块:

state: 
    car: 
    defaults: 
        brand: "",
        color: "",
        value: ""
        ...
    
,
actions: 
    fillTheCar(state, commit) 
        commit("SET_CAR", state.defaults)
    ,
,
mutations: 
    SET_CAR(state, payload) 
        state.car = payload
    

getters: 
    data(state) 
        return state.car    
    
 

当我填写任何输入字段时,“汽车”对象会按应有的方式更新。当我关闭模式时:

methods: 
    closeModal() 
        this.$store.commit("Cars/SET_CAR", )
        // I have a different Vuex module to control all toggled items
        // such as sidebar, modals, header, etc.
        // I change modal visibility on there.
        this.$store.commit("Toggles/SET_VISIBILITY", modal: false
    

我的文件结构是这样的:

App.vue 
/ Components
  / Modal.vue
  / Input.vue
  / ...
/ Pages
  / Cars
    / Show.vue
    / Edit.vue
    / Create.vue
    / Delete.vue
    / CarModal.vue

当我转到“/cars”路线时,App.vue中显示Show.vue。

当我点击“创建”按钮时,包含 CarModal.vue 和与创建汽车相关的所有功能的 Create.vue 变得可见。

CarModal.vue 具有 CRUD 操作所需的所有表单项,并将自身注入 /components/Modal.vue

//components/Modal.vue
<template>
    <teleport to="body">
        <slot name="header"></slot>
        <slot name="content"></slot>
        <slot name="actions"></slot>
    </teleport>
</template>

我希望这些细节足以获得帮助。这是我的问题:

如果我填写一些输入并关闭模态,然后重新打开它,它会返回先前填充的输入中的数据,即使我在关闭模态时清空了汽车对象。我尝试使用 v-if 销毁 Modal、CarModal 和 Create 文件。它没有做任何改变。我尝试将 :key="Math.floor(Math.random() * 1000000)" 设置为相同文件上的容器,并在模式关闭时随机更改密钥。它也没有用。我不知道任何其他选项来重置表单。我希望有人能指出我在这里缺少的东西。顺便说一句,当我关闭模式时,我确定汽车对象会变为空。

【问题讨论】:

【参考方案1】:

我认为问题出在您的商店

actions: 
    fillTheCar(state, commit) 
        commit("SET_CAR", state.defaults)
    ,
,
mutations: 
    SET_CAR(state, payload) 
        state.car = payload
    

当我打开模态框时,主对象(汽车)变得等于默认对象,并且这些默认值填充模态框的表单

因此,当您打开模式时,您正在调用 fillTheCar 操作,这将反过来调用突变 - 结果是,state.car 指向与 state.defaults 相同的对象。因此,当您在模式中更改某些内容时,实际上您也在更改 state.defaults 的属性(应该很容易在 Vue 开发工具中检查)

关闭模式时,this.$store.commit("Cars/SET_CAR", ) 只会将state.car 设置为一个新对象,但当您再次打开它时,它将再次设置为state.defaults(已从之前修改)

TLDR

这不是 Vue/Vuex 问题,而是 javascript 使用问题之一......

要将state.car 设置为某些默认值,而不是commit("SET_CAR", state.defaults),请执行commit("SET_CAR", ...state.defaults ) ...这将创建具有从state.defaults 复制的属性值的新对象(假设所有属性都是值类型,如字符串、数字等。即不通过引用传递)

【讨论】:

这是我犯的一个令人难以置信的菜鸟错误。是的,你是对的,你的建议解决了我的问题。非常感谢。

以上是关于Vue 3 模式在重新打开时返回旧数据的主要内容,如果未能解决你的问题,请参考以下文章

element-ui弹窗组件再次打开时残留上次打开时的数据

为啥我的网络应用程序无法在打开时重新加载

boost::asio::acceptor - 在旧连接仍然打开时接受新的传入连接

当 ajax 代码在 wordpress 的自定义插件中打开时,数据库表条目停止

HKObserverQuery 仅在应用程序重新打开时运行

Excel电子表格保存后,重新打开时原先设置的格式都没了?