微信小程序 router 封装

美女镇楼

提供传参方式,正传和回调,给自己提供了巨大的方便,可以拼接在url,可以写对象,也可以部分拼接。。。

使用则改为:

import { navigateTo } from "../../utils/router.js"
    
navigateTo({
  path: "pages/search/search",
  params: {searchId: "1010101"}
})

这里只处理了单纯的路径和参数分开,后续详细版封装了所有情况,比如路径已经有部分参数,后面params又添加了参数,可至文末查看。

返回封装,这个就和绝对路径导航没啥关系了,但是作为router的一员,不能厚此薄彼
/**
 * 设置上一页面的数据,并返回
 */
export function navigateBack(data = {}) {
  if (data) {
    const length = getCurrentPages().length;
    var prePage = getCurrentPages()[length - 2]
    if (prePage) {
      prePage.setData(data)
    } 
  }
  wx.navigateBack()
}

// 使用
navigateBack(nickName:"我是新设置的昵称")

当我们需要回调数据至上一个页面时,我们带上参数,不需要回调时,就不写,当然参数名需要同上一个页面一致,这里就没封装跨界面返回回调数据了,用的情况比较少

我们还有redirectTo , switchTab , reLaunch这些导航方法,下面分享项目中的router.js,对这些方法做了统一的封装

/**
 *
 * 这里重新封装了导航方法,navigate、redirect、switchTab、reLaunch分别对应着微信的导航方法,
 * 与微信提供的API不通过的是,这里参数data里面的path是静态配置,即app.json文件的页面路径;
 * params为链接查询参数;
 * @example
 * navigate({
 *      path:'pages/index/index',
 *      params:{
 *          id:123
 *      }
 * });//跳转到index页面,index页面的options可以读取到id。
 *
 */

let CURRENT_ROUTE = "";

/**
 * 封装后的 navigate 方法
 * @param {path:静态路径,params: {}}
 */
export function navigate(data = {
  path = "",
  params
} = {}) {
  return route(data, "navigateTo")
}

/**
 * 封装后的 redirect 方法
 * @param {path:静态路径,params: {}}
 */
export function redirect(data = {
  path = "",
  params
} = {}) {
  return route(data, "redirectTo")
}

/**
 * 封装后的 switchTab 方法
 * @param {path:静态路径,params: {}}
 */
export function switchTab(data = {
  path = "",
  params
} = {}) {
  return route(data, "switchTab");
}

/**
 * 封装后的 reLaunch 方法
 * @param {path:静态路径,params: {}}
 */
export function reLaunch(data = {
  path = "",
  params
} = {}) {
  return route(data, "reLaunch");
}

/**
 * 设置上一页面的数据,并返回
 */
export function navigateBack(data = {}) {
  if (data) {
    const length = getCurrentPages().length;
    var prePage = getCurrentPages()[length - 2]
    if (prePage) {
      prePage.setData(data)
    } 
  }
  wx.navigateBack()
}


function route(data, method) {
  try {
    const length = getCurrentPages().length;
    const currentRoute = getCurrentPages()[length - 1].route;
    if (currentRoute == CURRENT_ROUTE) {
      //防止在用一个事件下多次导航到同一个页面
      return;
    }
    CURRENT_ROUTE = currentRoute;
    clearCurrent();
    if (data.path == currentRoute) {
      //不能导航到自己
      return;
    }

    const pathIndex = currentRoute.split('/').length;
    const path = joinPath(pathIndex, data.path)
    const url = joinParams(data.params, path)
    const obj = { ...data,
      url
    };

    //调用微信的router方法
    wx[method].call(null, obj);

  } catch (e) {
    console.log(`error in router: +${e}`)
  }
}

function joinPath(index, url) {
  let str = ""
  for (let i = 0; i < index - 1; i++) {
    str += "../";
  }
  return str + url;
}

function joinParams(params, url) {

  //没有参数,直接返回url
  if (!params) {
    return url;
  }

  let keys = Object.keys(params);
  let finalUrl = ""

  //参数没有key 返回url
  if (keys.length == 0) {
    return url;

  } else {

    //url没有拼接 ?
    if (url.indexOf("?") === -1) {
      finalUrl = keys.reduce((url, key) => {
        return url + key + "=" + params[key] + "&";
      }, url + "?");
    } else {

      //url以 ? 号结尾
      if (url.endsWith("?")) {
        finalUrl = keys.reduce((url, key) => {
          return url + key + "=" + params[key] + "&";
        }, url);

      } else {

        //url以 & 结尾
        if (url.endsWith("&")) {
          finalUrl = keys.reduce((url, key) => {
            return url + key + "=" + params[key] + "&";
          }, url);

        } else {

          //直接拼接
          finalUrl = keys.reduce((url, key) => {
            return url + key + "=" + params[key] + "&";
          }, url + "&")
        }
      }
    }
  }

  return finalUrl.endsWith("&") ?
    finalUrl.slice(0, finalUrl.length - 1) :
    finalUrl;
}


function clearCurrent() {
  setTimeout(() => {
    CURRENT_ROUTE = "";
  }, 0);
}

希望开源这个静态导航能给大家带帮助!

更新navigateBack方法,支持多页面返回:
/**
 * 设置需要返回的页面的数据,并返回
 */
export function navigateBack(data = {},delta = {}) {
  let deltaNum = 1

  if (delta.hasOwnProperty("delta")) {
    deltaNum = delta.delta
  }
  
  if (data) {
    const length = getCurrentPages().length;
    var prePage = getCurrentPages()[length - 1 - deltaNum]
    if (prePage) {
      prePage.setData(data)
    } 
  }
  
  wx.navigateBack({
    delta: deltaNum
  })
}

赏我一个赞吧~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容