基于Taro的微信小程序模板消息-獲取formId功能模塊封裝實(shí)踐
前言
在微信小程序中,小程序提供了一種能力-模板消息,官方文檔是這樣描述的:“基于微信的通知渠道,我們?yōu)殚_發(fā)者提供了可以高效觸達(dá)用戶的模板消息能力,以便實(shí)現(xiàn)服務(wù)的閉環(huán)并提供更佳的體驗(yàn)?!?br />
看圖說(shuō)話:
下發(fā)模板消息效果圖
這無(wú)疑又給小程序提供了與用戶進(jìn)行通知、反饋的新能力,但是小程序?yàn)榱朔乐鼓0逑?duì)用戶造成信息轟炸,影響用戶體驗(yàn),也設(shè)置了一些規(guī)矩:
- 模板推送位置:服務(wù)通知
- 模板下發(fā)條件:用戶本人在微信體系內(nèi)與頁(yè)面有交互行為后觸發(fā)
- 模板跳轉(zhuǎn)能力:點(diǎn)擊查看詳情僅能跳轉(zhuǎn)下發(fā)模板的該帳號(hào)的各個(gè)頁(yè)面
那我們想通過(guò)小程序給用戶發(fā)送模板消息需要怎么做呢?
- 用戶必須與小程序發(fā)生了頁(yè)面的交互行為,如支付、提交表單
- 支付會(huì)產(chǎn)生一個(gè)prepay_id的標(biāo)記,提交表單會(huì)產(chǎn)生一個(gè)formId的標(biāo)記
- 服務(wù)端根據(jù)prepay_id或formId來(lái)發(fā)送模板消息
無(wú)論是prepay_id還是formId都只有7天的有效期
那么問(wèn)題來(lái)了?
如果用戶在使用小程序的過(guò)程中,沒(méi)有在7天內(nèi)進(jìn)行一些信息提交操作,或者是支付操作,那么我們就無(wú)法獲取prepay_id,formId了,但是實(shí)際的業(yè)務(wù)上卻需要給用戶發(fā)送一些模板消息,已達(dá)到某些推廣或通知的效果。prepay_id必須是支付的時(shí)候才能產(chǎn)生,這個(gè)無(wú)需多言。今天胡哥就給大家來(lái)介紹下,如何在小程序中盡可能的獲取formId,以達(dá)到讓服務(wù)端有盡可能多的formId來(lái)發(fā)送模板消息。
獲取formId的原理
- 必須是form組件,并且需聲明屬性report-submit=",表示需要發(fā)送模板消息,同時(shí)監(jiān)聽bindsubmit事件;
- 必須在該form組件中,有button組件,同時(shí)該button組件需聲明屬性form-type="submit"。
上代碼 --- 小程序原生代碼演示
<form report-submit="true" bindSubmit="submitEvent"> <button open-type="submit">提交</button> </form>
獲取formId模塊的封裝
基于小程序獲取formId的原理,我們可以變相考慮:
- 只要用戶觸發(fā)了符合特定條件的包含button組件的form組件的bindSubmit事件,就可以獲取到formID;
- 同時(shí)借助CSS樣式,我們可以將form組件和button組件設(shè)置成隱形的,不可見但確真實(shí)存在;
- 將隱形的button組件覆蓋在真實(shí)的組件上,當(dāng)點(diǎn)擊真實(shí)組件時(shí),實(shí)際上就觸發(fā)了button的點(diǎn)擊,同時(shí)用戶是無(wú)感知的。
這里是重點(diǎn),圈起來(lái),一定會(huì)考的!
基于Taro的獲取formId功能模塊封裝實(shí)踐
設(shè)計(jì)獨(dú)立的功能模塊,以便供其他模塊方便調(diào)用,項(xiàng)目目錄結(jié)構(gòu)
src/ components/ formId/ index.js index.scss
src/components/formId/index.js
/** * 封裝FormId組件,以提供向服務(wù)端發(fā)送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到后端服務(wù)器 * @param {*} e event對(duì)象 */ formSubmit (e) { // 打印在控制臺(tái) console.log('formId:', e.detail.formId) // 模態(tài)框展示 Taro.showModal({ title: 'formId', content: e.detail.formId, showCancel: false }) /** * 注意: * 實(shí)際封裝中,直接將獲取的formId發(fā)送到后端服務(wù)器即可,無(wú)需彈框提示、控制臺(tái)打印,此處只是為了給小伙伴展示效果 */ } 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
非常重要的問(wèn)題:就是隱藏樣式,讓用戶不可見、無(wú)感知,但實(shí)際確實(shí)存在的。
.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 調(diào)用formId模塊
在任意想使用formId的其他模塊中引入,調(diào)用即可
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"> {/* 調(diào)用FormId組件 */} <FormId> {/* 頁(yè)面中任意元素 */} <Button>其他元素</Button> </FormId> </View> ) } }
效果圖
獲取formId效果圖
后記
以上就是胡哥今天給大家分享的內(nèi)容,喜歡的小伙伴記得收藏、轉(zhuǎn)發(fā)、點(diǎn)擊右下角按鈕在看,推薦給更多小伙伴呦,歡迎多多留言交流...
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
echarts橫向柱狀圖簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于echarts橫向柱狀圖簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,ECharts是百度前端開發(fā)部開發(fā)的一個(gè)開源可視化庫(kù),它可以幫助開發(fā)者輕松的實(shí)現(xiàn)各種數(shù)據(jù)可視化,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12有關(guān)JS中的0,null,undefined,[],{},'''''''''''''''',false之間的關(guān)系
這篇文章主要介紹了有關(guān)JS中的0,null,undefined,[],{},'',false之間的關(guān)系,需要的朋友可以參考下2017-02-02Javascript動(dòng)態(tài)綁定事件的簡(jiǎn)單實(shí)現(xiàn)代碼
Javascript事件綁定的方法很多,很靈活。不過(guò),作為比較簡(jiǎn)單的動(dòng)態(tài)綁定,下面的代碼看似正確,但得不到預(yù)期的效果。2010-12-12js不同客戶端顯示不同廣告(pc端+移動(dòng)端+微信端)
這篇文章主要介紹了js不同客戶端顯示不同廣告(pc端+移動(dòng)端+微信端),比較適合自適應(yīng)網(wǎng)站的廣告,需要的朋友可以參考下2023-02-02深入理解JavaScript中為什么string可以擁有方法
下面小編就為大家?guī)?lái)一篇深入理解JavaScript中為什么string可以擁有方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05javascript實(shí)現(xiàn)的柱狀統(tǒng)計(jì)圖表
下面是完成后的預(yù)覽圖,可以看到,繪制一個(gè)表格,耗時(shí)0.005毫秒,也就是200分之一秒。效率我還是比較滿意的!2010-07-07Javascript驗(yàn)證上傳圖片大小[前臺(tái)處理]
在做上傳圖片的時(shí)候,如果不限制上傳圖片大小,后果非常的嚴(yán)重。解決這個(gè)問(wèn)題有兩種方式:后臺(tái)處理、前臺(tái)處理2014-07-07