回到上一步时为什么不显示v-show? Vue 2.6 + Vue 3

如何解决回到上一步时为什么不显示v-show? Vue 2.6 + Vue 3

我在VUE中有一个SAP,它由4个步骤组成。 当在第一步按钮中提交并重定向到第二步时,如果我返回第一步,则最后一个组件将停止显示,尽管在更改组件之前已显示了该组件。 这是我的模板

   <input
      type="text"
      id="animalName"
      ref="animalName"
      v-model="animalFormInfo.name"
      @keypress="onChangeName($event)"
      @keyup="onChangeName($event)"
      />
      <div class="loader-spinner" v-if="loading">
        <app-loader>
      </div>
    </div>
  </div>
</div>

<div v-show="isNameCompleted">
  <div class="from-group">
    <h1 class="title">
      For
      <span>{{this.formInfo.name}}</span>,you have:
    </h1>
    <div class="list-services">
      <div
        class="column-service"
        v-for="estimation in filteredEstimation"
        v-bind:key="estimation.name"
      >
        <div>{{estimation.name}}</div>
        <div>{{estimation.description}}</div>
        <div>{{estimation.price.toString().replace(".",",")}}</div>
      </div>
    </div>
  </div>
</div>
<div class="button-line" v-show="isLoaderFinished"></div>
<div class="forward" v-show="isLoaderFinished">
  <div class="forward-button">
    <button
      ref="submit"
      v-bind:disabled="!isFormCompleted"
      type="submit"
      @click="navigateToCreate"
    >
      SEND INFO
    </button>
  </div>
</div>

以及下面的数据和控制组件负载的方法


data() {
  return {
    step: 1,isFormCompleted: false,isBreedSelected: false,isNameCompleted: false,loading: false,isLoaderFinished: false,myTimeout: 0
  };
},methods:{
  onChangeName(event) {
    if (this.myTimeout >= 0 && event) {
      clearTimeout(this.myTimeout);
      this.loading = true;
      this.isNameCompleted = false;
    }
    this.myTimeout = window.setTimeout(() => {
      this.isNameCompleted = true;
      const typedAnimalName = event.target._value;
      this.capitalizeAnimalName(typedAnimalName);
      this.loading = false;
      this.isLoaderFinished = true;
      this.isFormCompleted = true;
      setTimeout(() => (this.$refs.scrolled_3.focus()),10);
    },2200);
  },capitalizeAnimalName(typedAnimalName) {
    var splitAnimalName = typedAnimalName.toLowerCase().split(' ');
    for (var i = 0; i < splitAnimalName.length; i++) {
      splitAnimalName[i] = splitAnimalName[i].charAt(0).toUpperCase() + splitAnimalName[i].substring(1);
    } 
    return this.animalName = splitAnimalName.join(' ');
  },},

一旦我到达步骤2并返回到步骤1,仅显示信息,直到输入id为“ animalName”的输入为止。 我究竟做错了什么? 加载第一个组件时,它是否遵循逻辑并显示它们,而当我转到下一个组件时,它们消失了吗?

感谢大家的时间和事先的帮助

解决方法

如果每个步骤都是其自己的组件,则可以使用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>

请参阅:https://vuejs.org/v2/api/#keep-alive

,

问题在于组件的状态不是持久的。

对此有多种解决方案。

1。使用Vuex

全局管理状态

这可能是处理这种情况的默认方法或最常见的方法。不用将数据存储在组件中,而是使用此库来管理状态。最有可能的是,您只能在项目中实现vuex而不继续阅读。这是一个可靠的选择,还有太多需要列出的方面。

2。将表单状态封装在父组件中。

您可以在父对象内部为相关数据创建状态,而不是在step组件中管理状态。

示例:

<Step2
  v-if="step === 2"
  :formData="formData"
  :updateFormData="updateFormData"
  :nextStep="() => gotoStep(3)"
></Step2>

这个想法是Step2组件将通过formData属性传递数据。每当数据更改时,updateFormData函数都会被新数据调用。您甚至可以利用v-model来简化它。

3。 DIY商店

如果您使用的是Vue js 2(> = 2.6,observable

Vue 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.,甚至可以分解商店对象。

Vue 3

类似于那里的另一个,但是使用reactive()(或多个ref())。让我知道您是否想对此进行扩展。

,

之所以这样,是因为当您返回首页时,该组件正在重新渲染,因此所有默认状态都将生效。尝试使用Vuex保存状态,以便所有组件都可以由商店中的状态控制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-