React+Umi 的H5 小程序公用跳转 H5小程序路由带参

9 篇文章 0 订阅
2 篇文章 0 订阅

场景分析

使用H5编写小程序的原因:

  1. 公众号和小程序的页面重复,避免同一页面写两次。
  2. 可从网页进入,也可从小程序进入

跳转方法分析

  1. 工具使用端的分为 小程序内页面跳转普通网页页面跳转
  2. 小程序内的页面跳转会分为:
    a>关闭本页打开
    b>不关闭本页打开(普通跳转
    c>跳转tab页
    d>跳转外链
    e>回跳
  3. 网页跳转:外链跳转,普通项目内跳转

Code

// 公用跳转处理 modelName:页面路由,query:参数, type:跳转方式
export const navigate = (modelName, query, type) => {
  //判断是否是小程序里
  isMiniProgram((res) => {
    if (res) {
      // 多层级路由格式处理
      const finalUrl = handleSubUrl(modelName);
      switch (type) {
        case 'redirect': //关闭本页面打开
          wx.miniProgram.redirectTo({
            url: `..${finalUrl}/index?weburl=${prodUrl}${modelName}&${stringify(query)}`,
          });
          break;
        case 'net': //跳转外链  小程序里面的对应页面放在query的pageName里面
          wx.miniProgram.navigateTo({
            url: `../${query.pageName}/index?weburl=${modelName}`,
            fail: function (e) {
              console.log('err===', e);
            },
          });
          break;
        case 'switchTab': //跳转tab页
          wx.miniProgram.switchTab({
            url: `..${finalUrl}/index?weburl=${prodUrl}${modelName}&${stringify(query)}`,
            fail: function (e) {
              console.log('err===', e);
            },
          });

          break;
        case 'back': // 回跳
          wx.miniProgram.navigateBack();
          break;
        default:
          // 默认push 页面
          wx.miniProgram.navigateTo({
            url: `..${finalUrl}/index?weburl=${prodUrl}${modelName}&${stringify(query)}"`,
            fail: function (e) {
              console.log('err===', e);
            },
          });
          break;
      }
    } else {
      console.log('query=', stringify(query));
      //非小程序页面使用路由跳转
      // 判断是否为外链
      const openUrl = modelName.startsWith('http');
      if (openUrl) {
        window.location.href = modelName;
        return;
      }

      history.push({
        pathname: modelName,
        query: query || {},
      });
    }
  });
};

//是否为小程序环境
export const isMiniProgram = (callback) => {
  //是否在微信环境
  if (!isWeixin()) {
    callback(false);
  } else {
    //微信API获取当前运行环境
    wx.miniProgram.getEnv((res) => {
      if (res.miniprogram) {
        //小程序环境
        callback(true);
      } else {
        callback(false);
      }
    });
  }
};

const isWeixin = () => {
  var ua = navigator.userAgent.toLowerCase();
  if (ua.match(/MicroMessenger/i) == 'micromessenger') {
    return true;
  }
  return false;
};


// 小程序路由只能嵌套一层 约定规则为'/'改为'-'
const handleSubUrl = (url) => {
  const count = getStrCount(url, '/');
  let vUrl = url;
  if (count > 1) {
    const str = url.slice(1).split('/').join('-');
    vUrl = `/${str}`;
  }
  return vUrl;
};

// 判断后字符出现的次数aStr:整个string, aChar:需要被查的字符
const getStrCount = (aStr, aChar) => {
  var regex = new RegExp(aChar, 'g'); // 使用g表示整个字符串都要匹配
  var result = aStr.match(regex);
  var count = !result ? 0 : result.length;
  return count;
};

使用微信的API 需要引用它的JSSDKhttps://res.wx.qq.com/open/js/jweixin-1.3.2.js
官网介绍:https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html

解析
我们用在路由中的参数无法带在webUrl中,在小程序中拿不到?后面的值
只能用另一个参数名带过去,然后在小程序中拼接

正常网页地址:
在这里插入图片描述
跳转代码为:

navigate(`/welcome/articleList`, { type: 'food' })}

在小程序中的承接和拼接
在这里插入图片描述
在这里插入图片描述

始终觉得这样的带参有些拼凑了 如果有更加合理的写法,麻烦给我留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值