【问题标题】:React Native Image component source as ES6 import imagesReact Native Image 组件源作为 ES6 导入图像
【发布时间】:2020-04-29 06:32:34
【问题描述】:

是否可以导入图像并在<Image /> 组件的source 中使用它们?

我有很多地方需要根据状态有条件地显示图标或其他图标。 例如:

{isToggled ? (
  <Image
    resizeMode='contain'        
    source={require('../../assets/images/icon_chevron_up_B82BF9.png')}
    style={styles.toggleArrowImage}
  />
) : (
  <Image
    resizeMode='contain'
    source={require('../../assets/images/icon_chevron_down_B82BF9.png')}
    style={styles.toggleArrowImagew}
  />
)}

或者

const getToogleImageSource = () => {
  if (isToggled) {
    return require('../../assets/images/icon_chevron_up_B82BF9.png')
  }

  return require('../../assets/images/icon_chevron_down_B82BF9.png')
}

...
<Image
  resizeMode='contain'
  source={getToogleImageSource()}
  style={styles.toggleArrowImagew} 
/>

查看React Native documentation on Image,并在 StackOverflow 上搜索此内容,我总是看到使用require 获取源代码的解决方案。

因此我的问题是关于使用 ES6 导入来减少代码行数(我也发现它更易于阅读):

import chevronDown from ('../../assets/images/icon_chevron_down_B82BF9.png')
import chevronUp from ('../../assets/images/icon_chevron_up_B82BF9.png')

...

<Image
  resizeMode='contain'
  source={isToggled ? chevronUp : chevronDown}
  style={styles.toggleArrowImagew} 
/>

我在本地对其进行了测试,它运行良好,所以我想知道这是否会由于打包程序或我忽略的原因而导致独立应用出现问题。

仅供参考,我在 app.json 中有这个:

"assetBundlePatterns": [
  "assets/images/*"
],

感谢您的帮助。

[编辑]:我忘了说我正在使用 Expo

【问题讨论】:

    标签: javascript image react-native es6-modules


    【解决方案1】:

    在 react-native 应用中使用图片时,我使用了以下方法。虽然这仍然使用required 关键字,但我得到了您也在寻求的以下优势。

    • 代码行数更少,并且能够避免在许多地方为同一图像重复 required 关键字。
    • 由于它是单点导入,因此可以通过一行代码更改整个应用中的图像。
    • 非常高的可读性

    这里是 3 个简单步骤的实现。

    1. 在您的assets 目录中定义一个索引文件(index.tx)。如果你使用的是 js index.js
    2. 在索引文件中进行所有导入

      const images = {
          logo: require('./logo.png'),
          splash_image: require('./splash_image.png'),
          chevronUp: require('./chevronUp.png'),
          chevronUp: require('./chevronDown.png'),
      }
      
      export default images;
      
    3. index.tx 导入您的组件并按如下方式使用。您可以使用image.filename 使用任何图像。并且组件中不再有 require 关键字。

      import images from '../../../assets';
      ...
      
      <Image
        resizeMode='contain'
        source={isToggled ? images.chevronUp : images.chevronDown}
        style={styles.toggleArrowImagew} 
      />
      

    希望这就是你要找的东西:D



    尝试import后更新

    只需在组件顶部按如下方式导入图像即可。

    import { ... , Image } from 'react-native';
    import img_welcome from '../../images/welcome.png';
    
    ...
    
    <Image source={img_welcome} />
    

    这对我来说非常有用。

    我在 app.json 中除了 appnames 什么都没有

    我从您的代码和我的工作代码中看到的唯一区别是 import 语句中有一对圆括号 ()

    干杯!

    【讨论】:

    • 非常感谢@omal-perera 提供这个简洁的解决方案。我仍然对 requirees6 import 感到好奇。 require 的使用是强制性的吗?
    • 我刚刚检查了我的代码中的 import 关键字,令人惊讶的是它起作用了。我以前从未尝试过:D。我使用相同的普通代码导入图像。我将编辑答案以添加我尝试过的内容
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2019-06-21
    • 2017-12-13
    • 2021-11-15
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多