首页 > 编程语言 >vue3 跳转小程序

vue3 跳转小程序

时间:2023-09-09 10:44:28浏览次数:43  
标签:50% const 跳转 程序 value vue3 path ref

兼容微信内跳转 和 h5跳转

第一步

在index.html 里面引入 SKD

<!-- 公众号 JSSDK -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 云开发 Web SDK -->
<script src="https://res.wx.qq.com/open/js/cloudbase/1.1.0/cloud.js"></script>

第二步

部署云函数, 如果只用微信内打开小程序, 可以跳过这一步
文档地址
https://developers.weixin.qq.com/minigame/dev/api-backend/open-api/url-scheme/urlscheme.generate.html
index.js

const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  return getUrlScheme(event.options)
}

async function getUrlScheme(options) {
  var url = options.url;
  var arr = url.split("?");
  var params = "";
  if(arr.length > 1){
    params = arr[1];
  } 
  return cloud.openapi.urlscheme.generate({
    jumpWxa: {
      path: arr[0],
      query: params,
    },
    isExpire: true,
    expireTime: parseInt(Date.now() / 1000 + 60),
  })
}

第三步

这里包含了微信内跳转 和 普通浏览器跳转

<template>
  <div class="open-applet" :style="{ height: '100vh' }">
    <template v-if="isDesktop">
      <div class="wb-pc-wrap">
        <p class="message">请在手机打开网页链接</p>
      </div>
    </template>
    <template v-else>
      <template v-if="isWeixin">
        <div class="wx-h5-wrap">
          <wx-open-launch-weapp id="launch-btn" :username="username" :path="path" @ready="onReady">
            <div v-is="'script'" type="text/wxtag-template">
            <!-- 此处代码可以替换成自己的 -->
              <div :style="{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', opacity: 1 }">
                <img
                  class="img-wrap"
                  src="你的图片"
                  alt=""
                  style="width: 100%"
                />
              </div>
            </div>
          </wx-open-launch-weapp>
        </div>
      </template>

      <template v-else>
        <div class="public-h5-wrap" @click="openWeapp">
          <!-- 此处代码可以替换成自己的 -->
          <img src="你的图片" alt="" />
        </div>
      </template>
    </template>
  </div>
</template>
<script lang="ts">
  import { defineComponent, PropType, onMounted, ref } from 'vue';
  import { openAppletType } from '../props';
  import { getQueryVariable } from '../util';

  export default defineComponent({
    name: 'openApplet',
    props: {
      config: {
        type: Object as PropType<openAppletType>,
        default: () => ({}),
      },
    },
    setup() {
      let cloudApi: any = {};

      const appId = ref<string>(''); // appid
      const resourceEnv = ref<string>('');// 云函数id
      const username = ref<string>('');//小程序原始id

      const isWeixin = ref<boolean>(false); // 是否微信
      const isMobile = ref<boolean>(false); // 是否手机
      const isDesktop = ref<boolean>(false); // 是否桌面
      const path = ref<any>('/pages/index/index'); // 小程序路径

      onMounted(() => {
        // 这里的逻辑是如果 链接带路径path=xxxx, 就会替换path替换掉
        const query = decodeURIComponent(window.location.search.substring(1));
        path.value = query.substring(5);
        // gdtevent();
        load();
      });

      async function load() {
        const ua: any = navigator.userAgent.toLowerCase();
        let isWXWork = ua.match(/wxwork/i) == 'wxwork'; // 企微环境
        isWeixin.value = !isWXWork && ua.match(/micromessenger/i) == 'micromessenger'; // 不是企微环境 && 是微信浏览器
        if (navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i)) {
          isMobile.value = true;
        } else {
          isDesktop.value = true;
        }

        // 微信环境下
        if (isWeixin.value) {
          wx.config({
            // debug: true, // 调试时可开启
            appId: appId.value,
            timestamp: 0, // 必填,填任意数字即可
            nonceStr: 'nonceStr', // 必填,填任意非空字符串即可
            signature: 'signature', // 必填,填任意非空字符串即可
            jsApiList: ['chooseImage'], // 必填,随意一个接口即可
            openTagList: ['wx-open-launch-weapp'], // 填入打开小程序的开放标签名
          });
        } else {
          // 非微信环境h5
          cloudApi = new cloud.Cloud({
            // 必填,表示是未登录模式
            identityless: true,
            // 资源方 AppID
            resourceAppid: appId.value,
            // 资源方环境 ID
            resourceEnv: resourceEnv.value,
          });

          await cloudApi.init();
          await openWeapp();
        }
      }

      // 这里是云函数调用接口
      async function openWeapp() {
        const res = await cloudApi.callFunction({
          name: 'public',
          data: {
            action: 'getUrlScheme',
            options:{
              url: path.value // 传递给云函数的跳转路径, 云函数根据路径返回openlink地址
            }
          },
        });
        // openlink是h5跳转小程序的地址
        window.location.href = res.result.openlink;
      }

      function onReady(val) {
        console.log('onReady');
      }

      return {
        openWeapp,
        isWeixin,
        isMobile,
        isDesktop,
        onReady,
        path,
        username,
      };
    },
  });
</script>
<style scoped lang="less">
  .open-applet {
    .img-wrap {
      display: block;
      margin: 0 auto;
      top: 50%;
      left: 50%;
      position: absolute;
      width: 90%;
      transform: translate(-50%, -50%);
    }

    .wx-h5-wrap,
    .public-h5-wrap {
      width: 100%;
      height: 100%;
    }

    .wb-pc-wrap {
      width: 100%;
      height: 100%;
      position: relative;

      .message {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        font-size: 16px;
      }
    }
  }

  wx-open-launch-weapp,
  wx-open-launch-weapp {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: pink;
    display: block;
  }
</style>
****

标签:50%,const,跳转,程序,value,vue3,path,ref
From: https://www.cnblogs.com/cl1998/p/17688968.html

相关文章

  • 解决一个程序问题需要多少步——确定我们没有在摸鱼
    3天前,运行的社区系统报告,很多老的历史照片都无法作为附件加载——小鲨鱼,快来解决问题。很多人都问题,为什么程序员每天不是在调Bug就是在调Bug的路上。其实呀,计算机是一个逻辑性非常强的东西,每一步都应该是原因的,所以我们要通过逻辑性找到不同的原因。 这个和把大象关进笼子......
  • 2023-09-08 小程序之启用组件按需注入 ==》 添加一行代码:"lazyCodeLoading": "require
    在manifest.json文件里面的mp-weix对象添加代码:"lazyCodeLoading":"requiredComponents"可实现组件按需注入,引用官方说法就是:启用按需注入后,小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化,对应代码文件将不被......
  • vue3+PHP实战手册(16)
    目录通讯录管理系统登录通讯录管理系统登录使用v-model进行双向绑定,将表单输入框的内容同步给JavaScript中相应的变量,设置了相应的事件监听器。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>通讯录管理系统</title></head>......
  • 【疑难解决】运行EasyRTSPSever组件提示程序无法启动问题解决
    RTSP协议以客户服务器方式工作,它是一个多媒体播放控制协议,用来使用户在播放从因特网下载的实时数据时能够进行控制,如:暂停/继续、后退、前进等。因此RTSP又称为“因特网录像机遥控协议”。我们的RTSP-Sever组件EasyRTSPSever就是一款比较便捷的组件。我们有开发者在测试EasyRTSPS......
  • MacOs环境反编译微信小程序
    条件:mac版微信版本大于3.8.0的(无需解*密,下面直接反编译)使用node版本的wxappUnpacker解*密工具(https://github.com/geilige/wxappUnpacker)步骤:打开微信小程序,点点点点点点(尽量点全)默认存放小程序的路径/Users/用户名/Library(资源库)/Containers/com.tencent.xinWeChat(微信)/Data/.wxap......
  • React项目笔记-环境搭建、路由封装(跳转Navigate、懒加载lazy)、模块化样式引入、状态管
    环境准备nodev16.15.0npm8.5.5AntDesignofReact:https://ant.design/docs/react/introduce-cn一,创建项目npminitvite√Projectname:...vite-project-react√Selectaframework:»React√Selectavariant:»TypeScript然后使用vscode打开项目,由于......
  • 解决vue3+js unplugin-auto-import/vite 自动引入生效后 页面eslint报错
           ......
  • DBeaver执行sql脚本报错:CreateProcess error=193, %1 不是有效的 Win32 应用程序。
    DBeaver执行sql脚本报错:CreateProcesserror=193,%1不是有效的Win32应用程序。如图:  定位发现DBeaver默认安装的mysql.exe大小为0字节!解决方案,重新给DBeaver指定有效的mysql安装的bin目录下mysql.exe即可:选中当前的mysql连接,右键:编辑连接-主要-本地客户端-浏览......
  • vue路由跳转
    第一种方式  <router-link :target="$store.getters.username?'_blank':'_self'"class="course-item-cont":to="$store.getters.username?{path:'/VirtualClass/Detail',query:{id:item.id,introductionPat......
  • 【微信小程序-组件】仪表盘样式的滑动组件(不卡顿)
    滑动组件,选中后手机会振动 <template><viewclass="gear-select"><viewclass="scale-mark-container"><viewclass="every-scale-mark"v-for="(gear,index)ofgearList":key="ge......