React 组件安装两次

2024-04-01

在我的 React/Redux/ReactRouterV4 应用程序的一小部分中,我有以下组件层次结构,

- Exhibit (Parent)
-- ExhibitOne
-- ExhibitTwo
-- ExhibitThree

在 Exhibit 的子级中,还可以渲染大约 6 种不同的可能路线。别担心,我会用一些代码来解释。

这是我的家长展览组件:

export class Exhibit extends Component {
  render() {
    const { match, backgroundImage } = this.props

    return (
      <div className="exhibit">
        <Header />
        <SecondaryHeader />

        <div className="journey"
          style={{
            color: 'white',
            backgroundImage: `url(${backgroundImage})`,
            backgroundSize: 'cover',
            backgroundRepeat: 'no-repeat',
            backgroundPosition: 'center-center'
          }}>

          <Switch>
            <Route path={`${match.url}/exhibit-one`} component={ExhibitOne} />
            <Route path={`${match.url}/exhibit-two`} component={ExhibitTwo} />
            <Route path={`${match.url}/exhibit-three`} component={ExhibitThree} />
            <Redirect to="/" />
          </Switch>
        </div>
      </div>
    )
  }
}

基本上,它的所有工作就是显示展品子组件之一,并设置背景图像。

这是子组件之一 ExhibitOne:

export default class ExhibitOne extends Component {
  constructor(props) {
    super(props)
  }

  render() {
    const { match } = this.props

    return (
      <div className="exhibit-one">
        <Switch>
          <Route path={`${match.url}/wall-one`} component={ExhibitHOC(WallOne)} />
          <Route path={`${match.url}/wall-two`} component={ExhibitHOC(WallTwo)} />
          <Route path={`${match.url}/wall-three`} component={ExhibitHOC(WallThree)} />
          <Route path={`${match.url}/wall-four`} component={ExhibitHOC(WallFour)} />
          <Route path={`${match.url}/wall-five`} component={ExhibitHOC(WallFive)} />
          <Route path={`${match.url}/wall-six`} component={ExhibitHOC(WallSix)} />
        </Switch>
      </div>
    )
  }
}

为了减少输入,我决定将组件包装在高阶组件中,其 目的是调度一个操作,该操作将在顶级展示父组件上设置正确的背景图像。

这是高阶组件:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import * as actions from '../../actions/wall-background-image'

export default function(ComposedComponent) {
  class ExhibitHoc extends Component {

    componentDidMount = () => this.props.setBackgroundImage(`./img/exhibit-one/${this.getWall()}/bg.jpg`)

    getWall = () => {
      // this part isnt important. it is a function that determines what wall I am on, in order to set
      // the proper image.
    }

    render() {
      return <ComposedComponent />
    }
  }

  return connect(null, actions)(ExhibitHoc);
}

在 ExhibitOne 的初始加载中,我可以看到 setBackgroundImage 操作创建者通过查看执行了两次 在控制台中的 Redux Logger 处。我最初倾向于使用 componentDidMount 是因为我认为使用它 将限制动作创建者只执行一次。这是日志的屏幕截图:

我想我可能误解了高阶组件的工作原理,或者可能是某种类型的 React Router V4 的东西? 无论如何,任何关于为什么执行两次的帮助将不胜感激。


在 2020 年,这是由于<React.StrictMode>包裹在周围的组件<App />在新版本的 Create React App 中。从中删除有问题的组件index.js修复了我所有组件的双重安装问题。这是设计使然,但是对于所有内容都看到两次 console.log() 是令人烦恼和误导的。

对于 Next.js,在next.config.js, set reactStrictMode:false.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 组件安装两次 的相关文章

随机推荐

  • C++ - 如何使用 C++ 读取 Unicode 字符(例如印地语脚本),或者是否有通过其他编程语言更好的方法?

    我有一个像这样的印地语脚本文件 3 我必须编写一个程序 为每个句子中的每个单词添加一个位置 因此 特定单词位置的每一行的编号应以括号中的 1 开头 输出应该是这样的 3 1 2 3 4 5 6 7 8 9 上面这句话的意思是 3 India
  • 我需要在 asp.net 中屏蔽文本框

    该文本框中只能包含数字 条目必须在 100 到 500 之间 文本框需要包含 3 位小数 我不希望在将值插入数据库时 出现任何错误 我需要使用 jQuery 或 ASP NET 验证控件吗 如果 jQuery 有用 那么我会使用哪个插件 或
  • R 中的对称非负矩阵分解

    I am trying to implement NMF in R based on the following formula H is initially guess and then iteratively update based
  • 何时在 Angular + Java 项目中使用 DTO 和 Matpstruct

    好吧 我有一个大项目 我想把它做好 但我什至不知道规范是什么 Problem 我有几个具有关系的实体 我需要将它们一起显示在页面上 在视图中显示前 3 个事件 凡是Event有关系到事件实例 a 取消政策 并且对多个Pricing 截止日期
  • 获取用户在当前之前浏览过的页面

    代替 login php ref http mysite com lastpage 我可以通过其他方式获得之前的页面吗 尝试了 HTTP REFERER 但无法让它工作 Notice Undefined index HTTP REFERER
  • 渲染 svg 文件并使用 Express 提供服务

    我想知道如何使用 Express 渲染和提供 svg 文件 现在 我可以将 svg 作为原始 XML 文件提供 这是我正在做的事情 route router get status function req res next res setH
  • Rails 中的共享 JS(咖啡)

    如果我想在不同文件之间共享一些 JavaScript 函数应用程序 资产 javascript组织目录结构的最佳方法是什么 假设我有共享 js 咖啡 sharedFunction gt Hello 现在 我如何在其他地方使用它 就像这里一样
  • Solr 复制和 Solr 云有什么区别?

    我支持 Rails 项目 其中包含 Rails 应用程序和 Solr 的附加实例 我的环境 rails 3 2 1 ruby 2 1 2 sunspot 2 1 0 Solr 4 1 6 Problem 云提供商不稳定 我不能使用其他云提供
  • Pandas groupby - 计算相对点的距离

    假设我有一些看起来像这样的东西 df pd DataFrame Event A A A A A B B B B B Number 1 2 3 4 5 6 7 8 9 10 Ref False False False False True F
  • Nexus One - Android 2.1 版本,2.1 的 SDK 在哪里?

    搭载 2 1 操作系统的 Nexus Android 手机今天上市 我的朋友 刚刚订购了两个 隔夜运送 我想这意味着明天或后天就会在他手中 人们在他们的生活中拥有 2 1 版本 这怎么可能接受呢 在开发人员接触 SDK 之前就动手 我已经有
  • Selenium:查找基本 URL

    我在不同的机器上使用 Selenium 来自动测试 MVC Web 应用程序 我的问题是我无法获取每台机器的基本网址 我可以使用以下代码获取当前网址 IWebDriver driver new FirefoxDriver string cu
  • 80 端口上的 heroku + nginx

    我正在尝试在 heroku 免费环境中启动 nginx 服务器 我准备了任何操作方法和教程 但我无法运行它 首先 我想在端口 80 上启动 nginx 作为默认 Web 服务器 然后我想将 nginx 配置为 underline expre
  • 3个表之间的内连接

    我在数据库中有这些表 country id country 1 USA 2 Brazil 和段表 id country 1 USA 2 Brazil 我有第三张表 Id segment id country id 其中segment id是
  • GSON 转换为 LinkedHashMap 而不是我的对象

    我有这段代码 public abstract class Repository
  • SQL:查找表中缺失的层次结构文件夹(路径)

    我有一个包含文件夹路径的表 我需要找到层次结构中这些文件夹之间的所有 间隙 我的意思是 如果表包含这 3 个文件夹 A A B C A B C D E F G 我需要在层次结构中找到以下丢失的文件夹 A B A B C D A B C D
  • Sonar 5.1 问题列表 - 如何按问题类型分组

    我们如何识别当前代码库中项目中最常见的问题类型 我们最近从 Sonar 4 5 升级到 5 1 在4 5中 我们曾经查看特定项目中的问题列表 并且问题按问题类型分组 例如 在一个项目中 规则 使用记录器记录此异常 可能是最常见的关键规则 有
  • 如何检查mysql中的二进制字符串是否为UTF-8?

    我找到了一个 Perl 正则表达式 可以检查字符串是否为 UTF 8 正则表达式来自w3c site http www w3 org International questions qa forms utf 8 en php field m
  • matplotlib 中的等高线图显示不正确的线型

    我正在使用轮廓图在 matplotlib 中绘制一个具有正值和负值的二维矩阵 它应该显示正值的实线和负值的虚线 loc matplotlib ticker MaxNLocator 20 Z psi lvls loc tick values
  • 在SSIS中使用执行进程任务和WinSCP进行SFTP传输

    我有一个User file txt文件放置在 WinSCP 根文件夹 USERDATA 中 我正在尝试将其下载到给定位置C User Local Executable C Program Files x86 WinSCP WinSCP ex
  • React 组件安装两次

    在我的 React Redux ReactRouterV4 应用程序的一小部分中 我有以下组件层次结构 Exhibit Parent ExhibitOne ExhibitTwo ExhibitThree 在 Exhibit 的子级中 还可以