评论

从基础学习:如何重写 Page 加入路由守卫

学习 JavaScript 基础概念函数重写,到小程序开发中全局 Page 重写的路由守卫应用,小白学习全过程。

1.函数的基础

在 JavaScript 中,函数是一种特殊的对象,可以被赋值、传递和修改。

function greet() {
    console.log("Hello!");
}

greet(); // 输出:Hello!

2.函数的重写

我们可以通过重新赋值来 重写 一个函数。

function greet() {
    console.log("Hello!");
}

greet(); // 输出:Hello!

// 重写 greet 函数
greet = function () {
    console.log("Hi!");
};

greet(); // 输出:Hi!

第一次调用 greet(),输出 “Hello!”。
重写 greet 函数后,再次调用 greet(),输出 “Hi!”。

3.保存原始函数

在重写函数时,通常需要保存原始函数,以便在重写后的函数中调用它。

function greet() {
    console.log("Hello!");
}

// 保存原始函数
const originalGreet = greet;

// 重写 greet 函数
greet = function () {
    console.log("Before greeting...");
    originalGreet(); // 调用原始函数
    console.log("After greeting...");
};

greet();

输出:

Before greeting...
Hello!
After greeting...

4.应用到 Page 函数

在微信小程序中,Page 是一个全局函数,用于注册页面。我们可以通过重写 Page 函数,在页面注册时插入自定义逻辑。

// 保存原始的 Page 函数
const originalPage = Page;

// 重写 Page 函数
Page = function (obj) {
    console.log("Page is being registered...");

    // 调用原始的 Page 函数
    originalPage(obj);
};

// 注册页面
Page({
    onLoad() {
        console.log("Page loaded!");
    }
});

输出:

Page is being registered...
Page loaded!

5.扩展页面生命周期

通过重写 Page 函数,我们可以在页面生命周期中插入自定义逻辑。

// 保存原始的 Page 函数
const originalPage = Page;

// 重写 Page 函数
Page = function (obj) {
    // 保存原始的 onLoad 函数
    const originalOnLoad = obj.onLoad;

    // 重写 onLoad 函数
    obj.onLoad = function (options) {
        console.log("Before onLoad...");
        if (originalOnLoad) {
            originalOnLoad.call(this, options); // 调用原始的 onLoad 函数
        }
        console.log("After onLoad...");
    };

    // 调用原始的 Page 函数
    originalPage(obj);
};

// 注册页面
Page({
    onLoad() {
        console.log("Page loaded!");
    }
});

输出:

Before onLoad...
Page loaded!
After onLoad...

6.使用场景:加入路由守卫

let data;

function init(_data) {
    data = _data;
    let oldPage = Page; // 保存原始的 Page 函数
    Page = function (obj) {
        // 重写 onShow
        let oldOnShow = obj.onShow;
        obj.onShow = function () {
            routerBeforeEach(() => {
                if (oldOnShow) {
                    oldOnShow.call(this); // 调用原始的 onShow 函数
                }
            });
        };

        // 重写 onHide
        let oldOnHide = obj.onHide;
        obj.onHide = function () {
            routerBeforeEach(() => {
                if (oldOnHide) {
                    oldOnHide.call(this); // 调用原始的 onHide 函数
                }
            });
        };

        return oldPage(obj); // 调用原始的 Page 函数
    };
}

7.总结

  • 重写函数:通过重新赋值函数,可以在函数执行前后插入自定义逻辑。
  • 保存原始函数:在重写函数时,通常需要保存原始函数,以便在需要时调用它。
  • 应用到 Page:通过重写 Page 函数,可以在页面生命周期中插入路由守卫逻辑。
最后一次编辑于  02-16  
点赞 0
收藏
评论
登录 后发表内容