视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2020-11-27 21:53:45 责编:小采
文档


那么问题来了?

如果用户在使用小程序的过程中,没有在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效果图

    后记

    下载本文
    显示全文
    专题