【问题标题】:can you set outer HTML in return function of a React component?你可以在 React 组件的返回函数中设置外部 HTML 吗?
【发布时间】:2020-10-01 09:50:27
【问题描述】:

MailchimpSubscribe 组件的默认行为会在用户注册时显示状态警报。我想将此状态警报移到它在 DOM 中的位置之外,以便它显示在页面顶部。

我的代码如下所示:

import MailchimpSubscribe from "react-mailchimp-subscribe"
import SimpleForm from './SimpleForm.js'

function Info() {
 return (
  <div className="canary">
   <MailchimpSubscribe url={process.env.REACT_APP_MAILCHIMP_URL} 
    render={({subscribe, status, message}) => <SimpleForm
     status={status}
     message={message}
     className="form"
     style={{}}
     onSubmitted={formData => subscribe(formData)}
    />
   }/>
  </div>
 );
}

export default Info;

为了更改默认按钮文本,我创建了自己的SimpleForm.js 组件:

import React from "react";

// a basic form
const SimpleForm = ({ status, message, className, style, onSubmitted }) => {
  let input;
  const submit = () =>
    input &&
    input.value.indexOf("@") > -1 &&
    onSubmitted({
      EMAIL: input.value
    });

  return (
    <div className={className} style={style}>
      {status === "sending" && <div style={{ color: "blue" }}>sending...</div>}
      {status === "error" && (
        <div
          style={{ color: "red" }}
          dangerouslySetInnerHTML={{ __html: message }}
        />
      )}
      {status === "success" && (
        <div
          style={{ color: "green" }}
          dangerouslySetInnerHTML={{ __html: message }}
        />
      )}
      <input
        ref={node => (input = node)}
        type="email"
        placeholder="Your email"
      />
      <button onClick={submit}>Subscribe</button>
    </div>
  );
};

export default SimpleForm;

如何修改这个返回函数,以便将dangerouslySetInnerHTML={{ __html: message }} 部分设置为&lt;div className="canary"&gt;

【问题讨论】:

    标签: reactjs mailchimp


    【解决方案1】:

    From what I see in component definition you can pass render props

    MailchimpSubscribe.defaultProps = {
      render: ({ subscribe, status, message }) => (
        <SimpleForm
          status={status}
          message={message}
          onSubmitted={formData => subscribe(formData)}
        />
      )
    };
    

    使用SimpleForm 并包含特定的className style

    <MailchimpSubscribe url={process.env.REACT_APP_MAILCHIMP_URL} 
      render={({subscribe, status, message}) => <SimpleForm
          status={status}
          message={message}
          className="form"
          style={{}}
          onSubmitted={formData => subscribe(formData)}
        />
    }/>
    

    如果您需要更多自定义,您可以根据 SimpleForm 内部的内容创建自己的组件

    【讨论】:

    • 哦哦,我看到了渲染道具,但我认为这意味着我只能传入 subscribestatusmessage
    • 等待这会产生一个新问题 - &lt;SimpleForm&gt; 不是我正在使用的组件。我看到 mailchimp 代码使用它,但这是否意味着我应该能够在不导入任何其他内容的情况下使用它?我尝试安装和导入几个不同的类似命名的 npm 包,但无济于事
    • 这个 Simpleform 组件只是一个 inputbutton 包裹着 divonClick 事件。您可以使用两种提到的方法为容器设置样式,也可以制作类似的组件
    • 当您说“使用两种提到的方法设置容器样式”时,您是指inputbutton 吗?很抱歉,我只是对我实际上是如何做到这一点有点困惑
    • 我的意思是 classNamestyle SimpleForm 的道具
    【解决方案2】:

    这就是我对问题的理解?:

    问题

    如何在Component B 中呈现作为道具传递给Component A 的数据?

    • MailchimpSubscribemessage 保存在其内部状态中,并将其作为道具传递给其 render 函数的结果

    回答

    React 旨在仅以单向数据流的形式将数据从父母传递给孩子, 所以作为 props 传递给MailchimpSubscribe 的数据不能直接在另一个不是其子组件的组件中呈现?

    我能想到的最好的规避方法是利用Context API 在MailchimpSubscribe 内部呈现的SimpleForm 和应用其他地方呈现的DisplayMessage 之间创建共享状态。

    • 在新文件中SharedState.js
      • 创建SharedContext 以允许组件访问上下文
      • 创建SharedProvider,它是一个父级,它将使上下文对其所有子级都可用
    • SimpleForm
      • 阅读SharedContext
      • 设置将statusmessage 值推送到上下文的效果。每次这些值发生变化时都会调用此效果。
      • status 不为空时返回null,因为您想在别处呈现message 并隐藏表单。
    • DisplayMessage
      • 阅读SharedContext
      • 使用SharedContext 中的statusmessage 呈现您的消息

    演示

    我把this CodeSandbox 放在一起说明了这个策略。

    参考文献

    希望对您有所帮助!让我知道您是否想进一步澄清任何事情?

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 2017-01-04
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多