基于Taro的微信小程序模板消息-获取formId功能模块封装实践


Posted in Javascript onJuly 15, 2019

前言

在微信小程序中,小程序提供了一种能力-模板消息,官方文档是这样描述的:“基于微信的通知渠道,我们为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。”

看图说话:

下发模板消息效果图

基于Taro的微信小程序模板消息-获取formId功能模块封装实践

这无疑又给小程序提供了与用户进行通知、反馈的新能力,但是小程序为了防止模板消息对用户造成信息轰炸,影响用户体验,也设置了一些规矩:

  • 模板推送位置:服务通知
  • 模板下发条件:用户本人在微信体系内与页面有交互行为后触发
  • 模板跳转能力:点击查看详情仅能跳转下发模板的该帐号的各个页面

那我们想通过小程序给用户发送模板消息需要怎么做呢?

  • 用户必须与小程序发生了页面的交互行为,如支付、提交表单
  • 支付会产生一个prepay_id的标记,提交表单会产生一个formId的标记
  • 服务端根据prepay_id或formId来发送模板消息

无论是prepay_id还是formId都只有7天的有效期

那么问题来了?

如果用户在使用小程序的过程中,没有在7天内进行一些信息提交操作,或者是支付操作,那么我们就无法获取prepay_id,formId了,但是实际的业务上却需要给用户发送一些模板消息,已达到某些推广或通知的效果。prepay_id必须是支付的时候才能产生,这个无需多言。今天胡哥就给大家来介绍下,如何在小程序中尽可能的获取formId,以达到让服务端有尽可能多的formId来发送模板消息。

获取formId的原理

  • 必须是form组件,并且需声明属性report-submit=",表示需要发送模板消息,同时监听bindsubmit事件;
  • 必须在该form组件中,有button组件,同时该button组件需声明属性form-type="submit"。

上代码 --- 小程序原生代码演示

<form report-submit="true" bindSubmit="submitEvent">
 <button open-type="submit">提交</button>  
</form>

获取formId模块的封装

基于小程序获取formId的原理,我们可以变相考虑:

  • 只要用户触发了符合特定条件的包含button组件的form组件的bindSubmit事件,就可以获取到formID;
  • 同时借助CSS样式,我们可以将form组件和button组件设置成隐形的,不可见但确真实存在;
  • 将隐形的button组件覆盖在真实的组件上,当点击真实组件时,实际上就触发了button的点击,同时用户是无感知的。

这里是重点,圈起来,一定会考的!

基于Taro的获取formId功能模块封装实践

设计独立的功能模块,以便供其他模块方便调用,项目目录结构

src/
 components/
  formId/
   index.js
   index.scss

src/components/formId/index.js

/**
 * 封装FormId组件,以提供向服务端发送formId的功能
 */
import Taro, { Component } from '@tarojs/taro'
import { View, Form } from '@tarojs/components'
import './index.scss'

export default class FormId extends Component {
 constructor (props) {
  super(props)
 }
 /**
  * formSubmit()
  * @description 提交formId到后端服务器
  * @param {*} e event对象
  */
 formSubmit (e) {
  // 打印在控制台
  console.log('formId:', e.detail.formId)
  // 模态框展示
  Taro.showModal({
   title: 'formId',
   content: e.detail.formId,
   showCancel: false
  })
  /**
  * 注意: 
  * 实际封装中,直接将获取的formId发送到后端服务器即可,无需弹框提示、控制台打印,此处只是为了给小伙伴展示效果
  */ 
 }
 render () {
  let { children } = this.props
  return (
   <Form className="form" reportSubmit="true" onSubmit={this.formSubmit}>
    { children }
    <Button className="form-btn" formType="submit"></Button>
   </Form>
  )
 }
}

src/components/formId/index.scss

非常重要的问题:就是隐藏样式,让用户不可见、无感知,但实际确实存在的。

.form {
 position: relative;
 display: flex;
 .form-btn {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: transparent;
  outline: none;
  padding: 0;
  box-sizing: border-box;
  &::after {
   content: "";
   border: none;
  }
 }
}

src/pages/index/index.js 调用formId模块

在任意想使用formId的其他模块中引入,调用即可

import Taro, { Component } from '@tarojs/taro'
import { View, Button } from '@tarojs/components'
import FormId from '../../components/formId'

export default class Index extends Component {
 render () {
  return (
   <View className="index">
    {/* 调用FormId组件 */}
    <FormId>
     {/* 页面中任意元素 */}
     <Button>其他元素</Button>
    </FormId>
   </View>
  )
 }
}

效果图

获取formId效果图

基于Taro的微信小程序模板消息-获取formId功能模块封装实践

后记

以上就是胡哥今天给大家分享的内容,喜欢的小伙伴记得收藏、转发、点击右下角按钮在看,推荐给更多小伙伴呦,欢迎多多留言交流...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Html中JS脚本执行顺序简单举例说明
Jun 19 Javascript
点击隐藏页面左栏或右栏实现js代码
Apr 01 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
jQuery控制Div拖拽效果完整实例分析
Apr 15 Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 Javascript
基于Vue渲染与插件的加载顺序的问题详解
Mar 05 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
Aug 12 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
Apr 26 Javascript
Vue实现搜索结果高亮显示关键字
May 28 Javascript
jQuery提示框插件SweetAlert用法分析
Aug 05 jQuery
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
Sep 21 Javascript
vue+elementui 对话框取消 表单验证重置示例
Oct 29 Javascript
微信小程序开发技巧汇总
Jul 15 #Javascript
微信小程序中如何计算距离某个节日还有多少天
Jul 15 #Javascript
微信小程序基础教程之worker线程的使用方法
Jul 15 #Javascript
使用vue-router在Vue页面之间传递数据的方法
Jul 15 #Javascript
微信小程序在其他页面监听globalData中值的变化
Jul 15 #Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 #Javascript
微信小程序全局变量改变监听的实现方法
Jul 15 #Javascript
You might like
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
laravel自定义分页效果
2017/07/23 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
教师求职推荐信范文
2013/11/20 职场文书
化学学院毕业生自荐信范文
2013/12/17 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
人力资源主管职责范本
2014/03/05 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python