3 回答
TA贡献2011条经验 获得超2个赞
问题是组件的状态不是持久的。
有多种解决方案。
1. 全局管理状态Vuex
这可能是处理这种情况的默认或最常见的方式。您无需将数据存储在组件中,而是使用该库来管理状态。很可能你可以在你的项目中实现 vuex 而不是继续阅读。这是一个可靠的选择,有太多优点无法一一列举。
2.在父组件中封装表单状态。
您可以在父对象内为相关数据创建状态,而不是在步骤组件内管理状态。
例子:
<Step2
v-if="step === 2"
:formData="formData"
:updateFormData="updateFormData"
:nextStep="() => gotoStep(3)"
></Step2>
这个想法是Step2组件将通过 prop 传入数据formData。每当数据发生变化时,updateFormData都会用新数据调用函数。您甚至可以利用v-model.
3. DIY商店
如果您使用的是 Vue js 2 (>= 2.6, < 3),您可以使用observable
查看 2.6+
创建一个store.js文件
import Vue from "vue";
export const store = Vue.observable({
step: 1,
isFormCompleted: false,
isBreedSelected: false,
isNameCompleted: false,
loading: false,
isLoaderFinished: false,
});
然后你可以从任何组件调用你的store.js,如果你将它分配给this钩子beforeCreate,你可以像数据一样使用它(this.store.isFormCompleted在脚本中,store.isFormCompleted在模板中)
import { store} from 'store.js';
//...
beforeCreate(){
this.store = store;
}
如果你想跳过额外的store.,你甚至可以解构存储对象。
视图 3
与那里的另一个类似,但使用一个reactive()(或多个ref())。如果您想让我对此进行扩展,请告诉我。
TA贡献1829条经验 获得超13个赞
如果每个步骤都是它自己的组件,你可以使用keep-alive组件来缓存组件和它们的状态,这样当你在它们之间切换时,它们的状态会被保留。在这种情况下,我个人更喜欢它而不是使用 Vuex,因为它更简单。
<keep-alive>
<step-1-component v-if="step === 1"></step-1-component>
<step-2-component v-if="step === 2"></step-2-component>
<step-3-component v-if="step === 3"></step-3-component>
</keep-alive>
TA贡献1818条经验 获得超3个赞
之所以如此,是因为当你回到第一页时组件正在重新渲染,所以所有的默认状态都会生效。尝试使用Vuex保存您的状态,以便所有组件都由商店中的状态控制。
添加回答
举报