Vue.js 表单数据绑定在浏览器返回页面时丢失

sto*_*sky 1 forms vue.js vue-component vuejs2 v-model

这是我在做什么: 我有一个表单集组件,它通过 ajax 获取数据来填充表单集。用户可以从表单修改这些数据并提交。

问题:这很好用。但是,我注意到如果我导航到另一个页面然后点击浏览器“返回一页”按钮,表单在那里(模板中的 DOM)但是是空的。v-model 输入字段中不再有数据绑定...

大多数关于此行为的帖子都与我不使用的 vue-router 相关。

我认为它可能需要处理生命周期钩子......实际上,在我的组件上,我在“挂载”时获取数据。但是,如果是这样,哪个生命周期?

我也尝试过“保持活力”但没有成功。

我在我的组件上放了一些详细的日志,试图在浏览器返回时捕获生命周期钩子,但没有打印出来......

beforeCreate: function() {
    console.log('---- BEFORE CREATE ----> ')
},
created: function() {
    console.log('---- CREATED ----> ')
    this.getModelObjects();
},
beforeMount: function() {
    console.log('---- BEFORE MOUNT ----> ')
},
mounted: function() {
    console.log('---- MOUNTED ---->')
    this.getModelObjects();
},
beforeUpdate: function() {
    console.log('---- BEFORE update ----> ')
},
updated: function() {
    console.log('---- UPDATED ----> ')
},
beforeDestroy: function() {
    console.log('---- BEFORE DESTROY ----> ')
},
destroyed: function() {
    console.log('----  DESTROYED ----> ')
},
Run Code Online (Sandbox Code Playgroud)

任何的想法?

sto*_*sky 5

好的,我用最简单的方法解决了这个问题!

实际上,使用localStoragehttps://fr.vuejs.org/v2/cookbook/client-side-storage.html)并不能解决问题。

无论如何,它需要绑定到生命周期钩子才能被触发。因此,由于我已经将后端数据库上的这些数据与 Axios 同步,这会增加冗余的复杂性并最终出现相同的问题。

我还注意到,只有 v-model 字段是相关的。{{ var }} 不是。所以,我最终认为这真的与形式有关。

相反,我autocomplete="on"在我的表格中使用。

<form method="post" autocomplete="on">
.....
</form>
Run Code Online (Sandbox Code Playgroud)

但是,实际上,默认情况下自动完成是“开启”的:

https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete

默认情况下启用持久性功能。将 autocomplete 属性的值设置为 off 将禁用此功能。

我不记得为什么,但我autocomplete="off"在我的表格中使用了 :-( ... 这可能就是为什么我没有看到太多关于它的帖子......

现在,如果用户单击页面上的链接,然后使用“返回一页”按钮向后导航,则 v-model 绑定字段就在那里。