使用自定义按钮组件将 Typeform 嵌入 React

Posted

技术标签:

【中文标题】使用自定义按钮组件将 Typeform 嵌入 React【英文标题】:Embed Typeform into React using Custom Button Component 【发布时间】:2021-02-21 03:51:03 【问题描述】:

我正在尝试在我的 Gatsby React 网站中嵌入一个 Typeform 联系表单。我见过的所有示例都使用基本的 html button 作为示例,但这与我网站的主题背道而驰。这是我用来嵌入 typeform 的代码示例:

import React,  Component  from 'react';
import * as typeformEmbed from '@typeform/embed';

class ContactInfo extends Component 
  componentDidMount() 
    const popup1 = typeformEmbed.makePopup('URL', 
      mode: 'drawer_right',
      autoclose: 3000,
      hideHeaders: true,
      onSubmit: function () 
        console.log('Typeform successfully submitted');
      
    );

    document.getElementById('bt-popup').addEventListener('click', function () 
      popup1.open();
    );
  
  render() 
    return (
      <div>
        <button id="bt-popup" class="my-button">
          Popup
        </button>
      </div>
    );
  


export default ContactInfo;

但是,我在这里创建了自己的按钮组件,我想使用它来代替示例中的按钮组件。代码如下:

import React from 'react';
import PropTypes from 'prop-types';

import * as Styled from './styles';

const Button = ( primary, block, children ) => (
  <Styled.Button primary=primary block=block whileHover= scale: 1.05  whileTap= scale: 0.95 >
    children
  </Styled.Button>
);

Button.propTypes = 
  primary: PropTypes.bool,
  block: PropTypes.bool,
  children: PropTypes.any.isRequired
;

export default Button;

如何将&lt;button&gt; 替换为我自己的组件&lt;Button&gt; 以使其与网站主题保持一致?

【问题讨论】:

【参考方案1】:

你的意思是?

import React,  Component  from 'react';
import * as typeformEmbed from '@typeform/embed';
import Button from 'path/to/button/component'

class ContactInfo extends Component 
  componentDidMount() 
    const popup1 = typeformEmbed.makePopup('URL', 
      mode: 'drawer_right',
      autoclose: 3000,
      hideHeaders: true,
      onSubmit: function () 
        console.log('Typeform successfully submitted');
      
    );

    document.getElementById('bt-popup').addEventListener('click', function () 
      popup1.open();
    );
  
  render() 
    return (
      <div>
        <Button id="bt-popup" class="my-button">
          Popup
        </Button>
      </div>
    );
  


export default ContactInfo;

注意:您可能需要使用 createPopop (^1.01) 而不是 makePopup,具体取决于您的 Typeform 版本。

请记住,就最佳实践而言,直接访问 DOM(就像您使用 document.getElementById 一样)并不是最佳方法,因为它会对性能产生巨大影响(例如 jQuery)。事实上,这就是你使用 React 的原因,它创建了一个虚拟 DOM。您可以使用 useRef hook 复制相同的行为。

【讨论】:

嗨 Ferran,实际上当我尝试这个时 - 按钮组件出来了,但是一旦你点击它,typeform 就不会弹出...... 所以我得到:当我使用 Button 而不是 button 时,TypeError: Cannot read property 'addEventListener' of null 没关系!我想我已经解决了。非常感谢费兰! 仅供参考:makePopup@typeform/embed1.01 的较新版本中被 createPopup 替换。

以上是关于使用自定义按钮组件将 Typeform 嵌入 React的主要内容,如果未能解决你的问题,请参考以下文章

Vimeo 嵌入:自定义播放按钮工作。如何添加暂停按钮?

Wix React-Native-Navigation:自定义组件按钮的 onPress

iview组件库:自定义方法去控制Tree树形数据的根节点与叶节点的关联性

[[TemplateSyntaxError,同时使用typeform sdk将url参数传递给类]

Flutter 按钮组件 底部导航 浮动按钮 Swiper 自定义Dialog

使用 Javascript 将传入的 URL 参数传递给 iframe src