草庐IT

javascript - 每个附件我都需要附上pdf或word或jpg图标

coder 2024-07-25 原文

在 driveFiles 中我得到了多个文件名。
对于每个附件,我需要附上 pdf 或 word 或 jpg 图标
所以我使用 substr 和 lastIndexOf 得到了文件格式。
现在使用 if 条件我可以禁用一个文件的图标。
如果我测试多个文件,它不会检查第二个 if
我认为问题是由于第一个 if 中的 return 语句引起的。
你能告诉我如何修复多个文件吗?

{this.props.driveFiles.length > 0 ? 
  this.props.driveFiles.map(_driveFileKey => {
    var driveFormat = _driveFileKey.name.substr(
      _driveFileKey.name.lastIndexOf(".") + 1
    );
    console.log("filename--->", driveFormat);
    if (driveFormat === "pdf") {
      return (
        <div>
          {" "}
          <Icon icon={["fal", "file-pdf"]} />
          {_driveFileKey.name}
        </div>
      );
    } else if (driveFormat === "doc") {
      return (
        <div>
          {" "}
          <Icon icon={["fal", "file-word"]} />
          {_driveFileKey.name}
        </div>
      );
    } else if (driveFormat === "jpg") {
      return (
        <div>
          {" "}
          <Icon icon={["fal", "file-image"]} />
          {_driveFileKey.name}
        </div>
      );
    }

    //return <div>{_driveFileKey.name}</div>;
  })
: ""}

最佳答案

问题

JSX 中的大括号 ({}) 的功能有限,因为它们仅支持 single expression .将表达式视为将由解释器/编译器评估为单行代码的代码块。将如此复杂的逻辑放入单个表达式既难以实现又难以阅读。

解决方案

将 JSX 表达式与其他有用的 React/Javascript 功能结合使用。下面的解决方案是用 ES6 编写的(如果您需要将其转译为 ES5,请告诉我)。

从适当的文件中导入 Icon 或在此文件中定义它。您可以在 render 函数中填写其余组件。

逻辑被拆分成函数,这样更容易理解代码试图实现的目标。测试一下,看看它是否适合你。

下面还有解释一些片段的注释。

import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import Icon from '...<icon directory>...';

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

    this.getIconInfo = this.getIconInfo.bind(this);
    this.getIcons = this.getIcons.bind(this);
  }

  getIcons(driveFiles) {
    return driveFiles.map((driveFileKey, i) => {
      const dotIndex = driveFileKey.name.lastIndexOf('.') + 1;
      const driveFormat = driveFileKey.name.substr(dotIndex);
      console.log('filename---> %s', driveFormat);
      const iconInfo = this.getIconInfo(driveFormat);
      if (iconInfo === null) {
        return null;
      }
      return (
        <div key={`${driveFormat}${i}`}>
          <Icon icon={iconInfo} />
        </div>
      );
    });
  }

  getIconInfo(fileExtension) {
    const iconInfo = ['fal'];

    if (fileExtension === 'pdf') {
      iconInfo.push('file-pdf');
      return iconInfo;
    } else if (fileExtension === 'doc') {
      iconInfo.push('file-doc');
      return iconInfo;
    } else if (fileExtension === 'jpg') {
      iconInfo.push('file-jpg');
      return iconInfo;
    }

    return null;
  }

  render() {
    return (
      <Fragment>
        {this.props.driveFiles.length > 0 &&
        this.getIcons(this.props.driveFiles)
        }
      </Fragment>
    );
  }
}

IconExample.propTypes = {
  driveFiles: PropTypes.array,
};

export default IconExample;

注意事项

表达式评估

{this.state.driveFiles.length > 0 &&
this.getIcons(this.state.driveFiles)
}

&&(和)运算符计算两边的语句并返回最后 语句,即右侧的语句。因此,只有当 this.state.driveFiles.length > 0 返回 true 时,才会评估 this.getIcons(this.props.driveFiles)

按键

<div key={${driveFormat}${i}}>
  <Icon icon={iconInfo} />
</div>

This part的 React 文档解释了为什么我们在从迭代器返回时使用键。

在构造函数中绑定(bind)

this.getIconInfo = this.getIconInfo.bind(this);
this.getIcons = this.getIcons.bind(this);

这是使用“经典”javascript 函数的问题,但我相信在最现代的 ECMAScript 和更高版本中你可以使用 arrow functions在类定义中以避免需要。我们绑定(bind)以确保 this 在函数中引用什么,我们希望它是我们正在使用的组件,而不是全局 this 或任何默认的这种情况。

关于javascript - 每个附件我都需要附上pdf或word或jpg图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56997931/

有关javascript - 每个附件我都需要附上pdf或word或jpg图标的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby-on-rails - Rails 3 I18 : translation missing: da. datetime.distance_in_words.about_x_hours - 2

    我看到这个错误:translationmissing:da.datetime.distance_in_words.about_x_hours我的语言环境文件:http://pastie.org/2944890我的看法:我已将其添加到我的application.rb中:config.i18n.load_path+=Dir[Rails.root.join('my','locales','*.{rb,yml}').to_s]config.i18n.default_locale=:da如果我删除I18配置,帮助程序会处理英语。更新:我在config/enviorments/devolpment

  3. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  6. ruby-on-rails - Prawn PDF : I need to generate nested tables - 2

    我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested

  7. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  8. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  9. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  10. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

随机推荐