接口文档SDK业务专题开发者工具

快速构建定向UI

本章节介绍了 Marketing UI 中定向模块的安装、使用方法及步骤。

支持的定向元素类型

单选 (radio)、多选 (checkox) 、数值范围 (range)、行为兴趣 (interest_or_behavior)、地域定向 (geo_location)

使用步骤

step 1. 加载 Marketing UI 组件包

参考 如何安装组件包

step 2. 加载组件

import React, { Component } from 'react';
import { render } from 'react-dom';

import { AdTargeting } from '@tencent/mktui';
const { AdTargetingForm, AdTargetingUtils } = AdTargeting;
const { validator } = AdTargetingUtils;
const { validateField, validateTargeting } = validator;

step 3. 初始化定向表单

在Demo代码中初始化定向表单,并传入必填的属性,包括 config, data, onChange, onSwitch 等等。 定向组件需要传入的定向配置 props.config 目前还没有对应的 Marketing API 接口可以拉取。 根据 Marketing API 创建定向的 targetings/add 接口文档,我们制定了一份定向配置数据,可以将其保存为 mktui_adtargeting_config.js,点此获取 。具体显示哪些定向,可通过配置中的 display_fields 字段指定。

自定义定向组件

目前我们支持的定向项类型 (type) 包含 checkbox 和 radio,对于其他不支持的类型,用户可通过传入 fieldComponentMap 属性来自定义,如以下demo所示。自定义的组件可通过props获取对应项的定向配置数据。

// config引用自step 4 中获取的配置文件
import { config } from './mktui_adtargeting_config.js';
const targetingFieldconfig = config.targeting_fields

// 自定义Component
const CustomPlaceHolderComponent = (props = {}) => {
    const { description, status, data, type, name, tips } = props
    return (
        <div className=custom_placeholder>
            <ul>
                <p><strong>CustomPlaceHolderComponent</strong></p>
                <li>description: {description}</li>
                <li>type: {type}</li>
                <li>name: {name}</li>
                <li>tips: {JSON.stringify(tips)}</li>
                <li>data: {JSON.stringify(data)}</li>
                <li>status: {JSON.stringify(status)}</li>
                <li>all properties: {JSON.stringify(Object.keys(props))}</li>
            </ul>
        </div>
    )
}

// 自定义custom_type类型的定向项渲染CustomPlaceHolderComponent组件
const customFieldComponentMap = {
    'custom_type': CustomPlaceHolderComponent
}

class Example extends Component {
    constructor(props) {
        super(props);

        this.state = {
            checkedFields: [],
            data: {},
            errorTips: {},
            showError: false
        }

        this.handleChange = this.handleChange.bind(this)
        this.handleCheckedChange = this.handleCheckedChange.bind(this)
        this.handleSubmit = this.handleSubmit.bind(this)

    }

    handleChange(fieldName, data) {
        const error = validateField(data, targetingFieldconfig[fieldName])
        const newData = Object.assign({}, this.state.data)
        const newErrorTips = Object.assign({}, this.state.errorTips)
        newData[fieldName] = data

        if (error) {
            newErrorTips[fieldName] = error
        } else {
            delete newErrorTips[fieldName]
        }

        this.setState({
            data: newData,
            errorTips: newErrorTips
        })
    }

    handleCheckedChange(fieldName) {
        const { checkedFields: oldCheckedFields } = this.state
        const checkedFields = Object.assign([], oldCheckedFields)
        const index = checkedFields.indexOf(fieldName)
        if (index > -1) {
            checkedFields.splice(index, 1)
        } else {
            checkedFields.push(fieldName)
        }

        this.setState({
            checkedFields
        })
    }

    handleSubmit() {
        const { data, checkedFields } = this.state
        const errorTips = validateTargeting(data, targetingFieldconfig, checkedFields)

        // 示例展示用
        console.log('表单数据:')
        console.log(data)

        this.setState({
            errorTips,
            showError: true
        })
    }

    render() {
        const { data, checkedFields, errorTips, showError } = this.state
        return (
            <div className=tsaui style={{ margin: '60px' }}>
                <AdTargetingForm
                    data={data}
                    checkedFields={checkedFields}
                    errorTips={errorTips}
                    showError={showError}
                    config={config}
                    onChange={this.handleChange}
                    onCheckedChange={this.handleCheckedChange}
                    fieldComponentMap={customFieldComponentMap}
                />
                <button type=button className=btn btn-primary onClick={this.handleSubmit} style={{ 'marginTop': '30px' }}>提交(console中查看)</button>
            </div>
        );
    }
}

render(<Example/>, document.getElementById('test'));