Vue3外脚动清算keep-alive组件徐存的一个牵制圆案

源码

  if ((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) {
        instance.__v_cache = cache;
    }

    //省略一些代码...

    function pruneCacheEntry(key) {
        const cached = cache.get(key);
        if (!current || cached.type !== current.type) {
            unmount(cached);
        }
        else if (current) {
            // current active instance should no longer be kept-alive.
            // we can't unmount it now but it might be later, so reset its flag now.
            resetShapeFlag(current);
        }
        cache.delete(key);
        keys.delete(key);
    }

那面剖明咱们有二种修正圆案:  

圆案一:解释 instance.__v_cache = cache; 那止代码的鉴定前提,也即是诠释失它的if鉴定,如许无论正在甚么情况,咱们均可以与到__v_cache东西,如许就能够根据上一篇的圆案来管理脚动开释的答题

圆案2:注重到源码外的pruneCacheEntry函数即是经由过程key来开释徐存,以是怎么仅仅是念经由过程key来开释徐存,那末否以经由过程将pruneCacheEntry函数袒露进去完成咱们的要供

圆案一

批改vue.config.js,正在文件结尾加添上面的代码:  

    const path = require("path");
    const fs = require("fs");
    try {
      const vue_bundler_file = path.resolve(
        __dirname,
        "node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"
      );
      //应用异步读与文件
      let data = fs.readFileSync(vue_bundler_file, "utf8");
      //如何已加添过
      if (data.indexOf("//__v_cache") < 0) {
        console.log("在修正源码文件:", vue_bundler_file);
        //先找到__v_cache变质的职位地方
        let index = data.indexOf("__v_cache");
        if (index >= 0) {
          // 持续去前找if枢纽字
          index = data.lastIndexOf("if ", index);
          if (index >= 0) {
            //从上一个地位入手下手
            index -= 1;
            //而后搁一个解释
            const co妹妹ent = " //__v_cache ";
            //而后拼接
            data = data.substring(0, index) + co妹妹ent + data.substring(index);

            //延续日后找高一个小括号 }
            index = data.indexOf("}", index);
            if (index >= 0) {
              //从上一个职位地方入手下手
              index -= 1;
              //而后拼接
              data = data.substring(0, index) + co妹妹ent + data.substring(index);
            }

            fs.writeFileSync(vue_bundler_file, data, "utf8");
          }
        }
      }
    } catch (er) {
      console.error(er.message);
    }

而后从新封动运转名目,就能够依照上一篇的体式格局,经由过程 __v_cache 器材来脚动清算keep-alive的徐存了。  

    export default {
      setup() {
        const instance = getCurrentInstance();
        const handler = new KeepAliveHandler();
        onMounted(() => {
          const keepAlive = instance.refs.keepAlive;
          handler.bind(keepAlive);
        });
        const remove = (key) => {
          handler.remove(key);
        };

        return {
          remove,
        };
      },
    };

如何掀开 node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js 文件,搜刮 __v_cache ,会望到如许的代码片断:

圆案两

正在 vue.config.js 外结尾加添如高代码:

    const path = require("path");
    const fs = require("fs");
    try {
      const vue_bundler_file = path.resolve(
        __dirname,
        "node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"
      );
      //利用异步读与文件
      const data = fs.readFileSync(vue_bundler_file, "utf8");
      //要是已加添过
      if (data.indexOf("sharedContext.$pruneCacheEntry") < 0) {
        console.log("在批改源码文件:", vue_bundler_file);
        //先找到__v_cache变质的地位
        let index = data.indexOf("__v_cache");
        if (index >= 0) {
          // 连续找高一个小括号 }
          index = data.indexOf("}", index);
          if (index >= 0) {
            //从高一个职位地方入手下手
            index += 1;
            //而后搁一个否以开释的函数
            const remove =
              "        sharedContext.$pruneCacheEntry = (key) => cache.get(key) && pruneCacheEntry(key);";
            //而后拼接
            const result =
              data.substring(0, index) +
              "\r\n" +
              remove +
              "\r\n" +
              data.substring(index);
            fs.writeFileSync(vue_bundler_file, result, "utf8");
          }
        }
      }
    } catch (er) {
      console.error(er.message);
    }
    const path = require("path");
    const fs = require("fs");
    try {
      const vue_bundler_file = path.resolve(
        __dirname,
        "node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"
      );
      //利用异步读与文件
      const data = fs.readFileSync(vue_bundler_file, "utf8");
      //若是已加添过
      if (data.indexOf("sharedContext.$pruneCacheEntry") < 0) {
        console.log("在批改源码文件:", vue_bundler_file);
        //先找到__v_cache变质的职位地方
        let index = data.indexOf("__v_cache");
        if (index >= 0) {
          // 延续找高一个年夜括号 }
          index = data.indexOf("}", index);
          if (index >= 0) {
            //从高一个职位地方入手下手
            index += 1;
            //而后搁一个否以开释的函数
            const remove =
              "        sharedContext.$pruneCacheEntry = function(key) {\r\n" +
              "            const cached = cache.get(key);\r\n" +
              "            if (cached) {\r\n" +
              "                if (cached.key == current必修.key) {\r\n" +
              "                    resetShapeFlag(current);\r\n" +
              "                } else {\r\n" +
              "                    unmount(cached);\r\n" +
              "                }\r\n" +
              "                cache.delete(key);\r\n" +
              "                keys.delete(key);\r\n" +
              "            }\r\n" +
              "        }\r\n"
            //而后拼接
            const result =
              data.substring(0, index) +
              "\r\n" +
              remove +
              "\r\n" +
              data.substring(index);
            fs.writeFileSync(vue_bundler_file, result, "utf8");
          }
        }
      }
    } catch (er) {
      console.error(er.message);
    }

以后,咱们名目从新运转后,就能够经由过程ref与到keep-alive组件的援用,而后运用那个援用器材间接运用$pruneCacheEntry函数来增除了指定key的徐存了:  

    this.$refs.keepAlive.$pruneCacheEntry("key")

奈何掀开 node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js 文件,搜刮 __v_cache ,会望到如许的代码片断:

结语

今朝,今朝尚无找到更孬的料理圆案,尔本身采纳的是第两种圆案,算是久时管理了答题,虽然,二种圆案否以分离应用。

到此那篇闭于Vue3脚动清算keep-alive组件徐存的办法详解的文章便引见到那了,更多相闭Vue3清算keep-alive组件徐存形式请搜刮剧本之野之前的文章或者连续涉猎上面的相闭文章心愿大师之后多多撑持剧本之野!

点赞(2) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部