zoukankan      html  css  js  c++  java
  • 前端路上那些坑——keep-alive

    vue项目中切换页签如何保留当前正在创建/编辑的表单输入的内容呢?

    一、可以使用vuex

    结合组件中的导航守卫beforeRouteLeave

    在导航守卫中将输入的数据存入vuex中

    再切回页面时从vuex中读取数据进行回显

    但是这样很麻烦诶~

    从vuex中读取数据,按照每个字段回显

    然后编辑的时候也需要做回显

    需要严格保证事件的执行顺序:先初始化数据,再将编辑请求回来的数据进行回显赋值,然后vuex中的数据再来一遍

    此外,还需要保证数据的响应式,否则debug的时候能找哭

    比如,vuex中state存obj的时候在mutation中直接用state.obj={a: 1}

    这样在组件中无法监听到这个obj的变化

    正确的方法是:

    在mutation中使用Vue.set(state.obj, 'a', 1)

    二、使用keep-alive

    当你尝试使用keep-alive当时候,你就会发现网上有铺天盖地的推荐这样用:

     亲测不行!!!

    这样会出现什么问题呢?先描述一下我的使用过程:

    1. 我从创建页切换到列表页不需要缓存创建页数据,于是在beforeRouteLeave中判断将创建页的keepAlive设置为false;

    2. 我从创建页切换到非列表页需要缓存创建页的数据,于是在beforeRouteLeave中判断将创建页的keepAlive设置为true;

    3. 为了保险起见,我在列表页的beforeRouteLeave中判断它要进入创建页了,我将创建页的keepAlive设置为false

    看起来是不是很完美?没什么问题对不对?

    奇怪的事情发生了:我一顿如下操作:

    当我从创建页(以下称为A)的表单某个input中输入1

    切换页签到非列表页(以下称为B)

    再切换回A发现1还在,没毛病对不对?

    接下来我从A返回列表页(以下称为C)

    再切换回A发现1没了,也很正确的样子

    然后,问题来了:

    现在我在A页把输入的1改成2

    再切换到B

    再切换回A

    发现居然还是1!!!

    发现这说明之前的缓存并没有被清掉,具体原因网上有很多解释,就不赘述了

    所以此法不通~

    摆正姿势,再来:

     

     

     就这样~ok

  • 相关阅读:
    poj 2262 筛法求素数(巧妙利用数组下标!)
    BestCoder Round #65 (ZYB's Premutation)
    BestCoder Round #65 (ZYB's Game)
    BestCoder Round #65 (ZYB's Biology)
    筛法求素数
    常见OJ提交结果对照表
    CSS3伸缩盒Flexible Box
    移动开发屏幕适配分析
    用PHP抓取页面并分析
    安装最新版本的PHPUnit后,不能使用
  • 原文地址:https://www.cnblogs.com/fcybp/p/13725915.html
Copyright © 2011-2022 走看看