2.0.1-alpha.3 • Published 1 year ago

@clue_nidapp/form-core v2.0.1-alpha.3

Weekly downloads
-
License
MIT
Repository
-
Last release
1 year ago

线索通表单 SDK

线索通表单 SDK 为线索通表单组件核心逻辑SDK,包含表单从初始化到最终销毁全生命周期数据流转,仅作为核心逻辑的封装不侵入UI交互。目前该 SDK 支持 h5,lynx,字节小程序环境。使用该 SDK,开发者可以不依靠橙子建站,搭建自己的表单落地页。

安装

yarn add @clue_nidapp/form-core
# or
npm install @clue_nidapp/form-core

使用

step1 引入

需引入 sdk 本体和对应环境的网络请求插件,注意,表单 sdk 必须配合对应环境的网络请求插件使用

import { Core, FormOptions } from '@clue_nidapp/form-core/web';
import { API } from '@clue_nidapp/plugin-api-h5' // 引入网络请求插件

step2 引入 convertSDK

// 字节小程序环境
import convertSDK from '@clue_nidapp/mini-convert-sdk'
// h5 环境
import convertSDK from '@clue_nidapp/h5-convert-sdk'

step3 实例化 sdk

登录线索通,新建表单,并获取表单 instanceId advId 以及 clueAccountId

// 场景一:SDK 内部加载数据
let options:FormMetaData = {
  // formId是表单的instanceId
  data: { formId: 0, advId: 0, clueAccountId: 0 },
  // 注册插件,sdk 必须注册对应环境的网络请求插件后使用
  plugins: [new API()],
  externalSetting: {
    scenarioType: FormScenarioType // SDK接入场景,小程序为 25,h5 为 28,更多场景值可以查看 FormScenarioType
  }
};
const formCore = new Core(options, convertSDK);

初始化参数说明

字段类型说明
dataobject表单归属信息
externalSettingobject额外配置
pluginsarray插件

表单归属信息

字段类型说明
formIdnumber表单id
advIdnumber广告主账号id
clueAccountIdnumber线索通账号id

额外配置

字段类型说明
scenarioTypeFormScenarioTypeSDK接入场景,小程序为25
settingobject表单配置

表单配置

字段类型说明
showTipsOnSubmitSuccessboolean表单提交成功后是否由SDK控制弹窗交互事件,默认为true

step4 使用 sdk

  1. 订阅 FormLifeCycleEvent.DetailReady 方法,获取你在青鸟线索通上创建的表单的数据,然后用这些数据作为你的表单字段的默认值(如果你的表单字段是有默认值的场景)

  2. 在你表单字段值修改时,调用 formCore.reportBehavior 方法向 sdk 上报修改后的值(必须)

  3. 调用 formCore.submitForm 方法提交表单

  4. 接收提交表单后的回调事件

完整生命周期

以下方法挂载在 FormLifeCycleEvent 枚举上

常量名常量值描述返回值类型备注
DetailReadyDetailReadydetail 加载成功,可能是 api 加载的,也可能外部直接传入data : FormCoreData
FieldValidateResultFieldValidateResult填写表单校验结果详见 IFieldValidateResult
ValidateBeforeSubmitFormValidateBeforeSubmitForm提交表单前校验结果详见 IValidateResult
SubmitFormSuccessSubmitFormSuccess表单提交成功
NeedSMSVerificationNeedSMSVerification提交表单后需要出短信验证码详见 INeedSMSVerificationData-
SubmitFormErrorSubmitFormError提交错误,指有明确的业务错误含义(如参数不正确,或者唯一性校验不通过等)返回值同 AfterSubmitForm服务端校验失败
SubmitFormFailSubmitFormFail提交失败, 指提交没有送达服务端或者服务端异常,服务不可用返回值同 AfterSubmitForm表单提交服务异常
FieldResetFieldReset表单字段值重置--
FinishFinish表单提交流程结束--

生命周期图

npm.io

插件机制介绍

线索通表单 SDK 中只提供了一些基础能力,其余能力的扩展都是引入插件,注册插件来完成的。以网络请求插件为例

import { Core, FormOptions } from '@clue_nidapp/form-core/web';
import { API } from '@clue_nidapp/plugin-api-h5' // 引入网络请求插件
const options: FormOptions = {
  data: { formId: 0, advId: 0, clueAccountId: 0, },
  // 注册插件
  plugins: [new API()]
}
const formCore = new Core(
  options,
);

注册完成后,就可以使用 sdk 发送网络请求了

formCore.request.get(url, options).then((res) => {});

官方插件列表

包名说明支持环境
@clue_nidapp/plugin-api-miniAPI 请求插件,必须注册字节小程序
@clue_nidapp/plugin-api-lynxAPI 请求插件,必须注册lynx
@clue_nidapp/plugin-api-h5API 请求插件,必须注册h5
@clue_nidapp/plugin-bridge-h5说明h5
@clue_nidapp/plugin-bridge-lynx说明lynx
@clue_nidapp/plugin-autofiller-common表单自动填充插件h5 lynx
@clue_nidapp/plugin-form-dealer-common获取优选经销商数据插件h5 lynx
@clue_nidapp/plugin-form-dealer-mini获取优选经销商数据插件字节小程序
@clue_nidapp/plugin-logger-common埋点上报插件h5 lynx 字节小程序

定制你的插件

我们允许使用方定制自己的插件,然后将其注册到表单 sdk 中使用。

插件的实现并不复杂,只需要实现抽象类 IPlugin 中的 plugIn 方法和 plugOff 方法即可

plugIn 方法是插件的注册方法,接收一个参数为表单 sdk 的实例,它将会在插件注册时触发

plugOff 方法是插件的销毁方法,它将在插件卸载时触发

import { IPlugin } from '@clue_nidapp/shared';
import { Core } from '@clue_nidapp/form-core';

export class Api implements IPlugin {
  name = 'your plugin name'

  public plugIn(coreInstance: Core) {
    // add your code
  }

  public plugOff() {
    // add your code
  }
}

实现完你的插件之后,将它注册到表单 sdk 即可,我们提供了两种方法来注册

方法一

在表单 sdk 实例化时就注册,这也是我们推荐的方法

const formCore = new Core({
  detailData: formData,
  // 注册插件
  plugins: [new API()]
}, convertSDK);

方法二

在表单 sdk 实例后注册,需要确保表单 sdk 实例化时不依赖这些插件,否则表单 sdk 会实例化失败

const formCore = new Core();
formCore.registerPlugin(new Plugin());

静态方法和实例上方法、属性

除去使用发布订阅方法调用 sdk 方法外,sdk 还提供了静态方法和普通方法,列表如下

名称类型参数说明示例
submitWithCaptchaAPIsms_ticket: string提交短信验证码-
reportBehaviorAPIdata: IReportBehavior修改表单字段值-
submitFormAPIsubmitType: ISubmitType提交表单-
captchaVerificationFailAPI验证码校验失败-
onAPIeventName: string, callback?: Function注册@clue_nidapp/form-core SDK 事件参考 EventEmitter 用法
emitAPIeventName: string, params: any触发@clue_nidapp/form-core SDK 事件参考 EventEmitter 用法
addToCustomFieldsAPIarr: ICustomField[]修改自定义提交参数,key相同时值会覆盖-
resetCustomFieldsAPI重置自定义提交参数-

ICustomField

interface ICustomField {
  k: string;
  v: any;
}

生命周期返回值及方法参数说明

表单detail加载成功返回值(FormCoreData)

字段类型描述
elementsFEFormElement表单字段
submitTextstring表单提交按钮文案

表单字段配置详情(FEFormElement)

字段类型描述
idnumber字段ID
labelstringlabel
typeFormElementType字段类型
requiredboolean字段是否必填
dataSourcenull/RadioCheckboxData/TreeData单选/多选/下拉字段选项配置
expandobject字段子类型等信息,简单字段无子类型,详见 FormElementExpand |

FormElementExpand

interface FormElementExpand {
  subType: FormElementExpandSubType; // 子类型
  fieldSubType: FormElementExpandFieldSubType; // 子类型
  dpaId: number;
  multiple: boolean; // 是否是多选组件
  optionNumber?: number; // 多选时有,多选最大数量
}

enum FormElementExpandSubType {
  carOneSelect = 1, // 汽车行业一级下拉
  carTwoSelect = 2, // 汽车行业二级下拉
  carDistributorSelect = 3, // 汽车行业经销商下拉
  carCustomSelect = 4, // 汽车行业经销商下拉 - 自定义csv上传
  carOptimizedRetailerSelect = 5, //汽车行业优选经销商
  carDcdSelect = 6, // 懂车帝下拉
}

enum FormElementExpandFieldSubType {
  default = 0,
  carOneSelect = 101, // 汽车行业一级下拉
  carTwoSelect = 102, // 汽车行业二级下拉
  carDistributorSelect = 103, // 汽车行业经销商下拉
  carCustomSelect = 104, // 汽车行业自定义下拉
  carOptimizedRetailerSelect = 105, // 汽车行业优选经销商
  intentionBuyCarCity = 106, // 企业号车云店意向城市优选
  carDcdSelect = 107, // 懂车帝下拉
  interactiveRadio = 111, // 对话表单对话选项
}

填写表单校验结果返回值(IFieldValidateResult)

字段类型描述
fieldIdOrFieldTypenumber校验字段id
resultValidateResult校验结果

IValidateResult

字段类型说明
validboolean校验是否通过
errors{ elementId: number, message: string } []校验不通过时返回,未通过元素的错误原因数组

IAfterSubmitForm

字段类型说明
statushttpCode网络请求状态码
dataobject返回数据
messagestring

修改表单字段字入参(IReportBehavior)

字段类型说明
atBehaviorEventactionType,用户行为
fidnumberelement.id,字段ID
etFormElementTypeelement.type,字段类型
valuenumber/string/Array字段value
tsnumber上报时间戳, Date.now()
useractionboolean是否用户主动触发, true
extraobject仅下拉字段需要传,详见demo

用户行为(BehaviorEvent)

字段value说明
field_focus'01'
field_change'02'element.id,字段ID
field_blur'03'element.type,字段类型
autofill'06'使用历史|自动填充时
autounfill'07'取消自动填充时调用

字段类型说明(FormElementType)

字段枚举值说明
姓名1
电话2
邮箱3
数字4
性别5
日期6
城市7
文本8
多文本9
下拉10
单选11
多选12

字段值说明

字段value类型eg说明
姓名string'张一鸣'
电话string'18888888888'
邮箱string'10000@qq.com'
数字number1
性别'男'/'女''男'
日期string'1971-01-01'
城市cityCode'100000'
文本string''
多文本string''
下拉array单选:['河北省','石家庄市','经销商a'],多选:['河北省','石家庄市','经销商a','河北省','石家庄市','经销商b','河北省','石家庄市','经销商c']
单选string''
多选string[]'a', 'b'

字段默认值获取

单选

let defaultValue = '';
const defaultArray = element.dataSource.filter(({isDefault})=>isDefault).map(({name}) => name);
if(defaultArray.length > 0){
  defaultValue = defaultArray[0]
}

多选

const defaultValue = element.dataSource.filter(({isDefault})=>isDefault).map(({name}) => name);

下拉

import { FEFormElement, BehaviorMap, getSelectLevelOptions, getSelectFieldDefaultValue, formatSelectFieldValue } from '@clue_nidapp/form-core';

// 获取下拉选项默认值数,据结构为TreeDataItem[][]
const selectItems = getSelectFieldDefaultValue(element.dataSource);
// 格式化默认值, 数据结构string[][]
const defaultValue = formatSelectFieldValue(selectItems);

Tips:下拉字段传值

下拉字段支持单选和多选两种格式,单选时每一级仅支持选择一个选项,多选时仅支持优选经销商进行多选(需要在青鸟线索通中进行配置)

代码示例

小程序

常见问题

Q: 表单提交后,能收到表单提交成功的回调,但是在飞鱼看不到提交的线索

A: 在测试时,如果短时间内多次提交,表单提交生成的线索极有可能被反作弊系统拦截,这种情况下线索不会进入到飞鱼,可以更换手机号、设备重新提交尝试,或在一定时间(一般为 24h)后再次尝试

Q: 在字节小程序中编译报错 TypeError: Converting circular structure to JSON / 在字节小程序中无法将 formCore 实例作为 props 传递给子组件

A: 小程序对 props 的序列化使用 JSON.parseformCore 实例继承自 EventEmitter3 对象,是无法被这样序列化的,故而推荐使用 provide inject 来传递 formCore 实例