109

我目前正在使用 React Native 构建一个测试应用程序。到目前为止,图像模块一直运行良好。

例如,如果我有一个名为 的图像avatar,则下面的代码片段可以正常工作。

<Image source={require('image!avatar')} />

但是,如果我将其更改为动态字符串,我会得到

<Image source={require('image!' + 'avatar')} />

我得到错误:

需要未知模块“image!avatar”。如果您确定该模块在那里,请尝试重新启动打包程序。

显然,这是一个人为的例子,但动态图像名称很重要。React Native 不支持动态图片名称吗?

使用动态图像名称反应本机错误

4

16 回答 16

88

这在“静态资源”部分下的文档中有所介绍:

引用包中图像的唯一允许方法是在源代码中逐字写入 require('image!name-of-the-asset') 。

// GOOD
<Image source={require('image!my-icon')} />

// BAD
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('image!' + icon)} />

// GOOD
var icon = this.props.active ? require('image!my-icon-active') : require('image!my-icon-inactive');
<Image source={icon} />

但是,您还需要记住在 Xcode 中将图像添加到应用程序中的 xcassets 包中,尽管从您的评论看来您已经这样做了。

http://facebook.github.io/react-native/docs/image.html#adding-static-resources-to-your-app-using-images-xcassets

于 2015-06-16T12:50:33.263 回答
73

这对我有用:

我制作了一个自定义图像组件,它接受一个布尔值来检查图像是来自网络还是从本地文件夹传递。

// In index.ios.js after importing the component
<CustomImage fromWeb={false} imageName={require('./images/logo.png')}/>

// In CustomImage.js which is my image component
<Image style={styles.image} source={this.props.imageName} />

如果您看到代码,而不是使用其中之一:

// NOTE: Neither of these will work
source={require('../images/'+imageName)} 
var imageName = require('../images/'+imageName)

我只是将整个require('./images/logo.png')作为道具发送。有用!

于 2017-02-15T09:45:26.787 回答
68

如果您知道图像 (URL),则相关:

我破解这个问题的方式:

我创建了一个文件,其中包含一个存储图像和图像名称的对象:

export const ANIMAL_IMAGES = {
  dog: {
    imgName: 'Dog', 
    uri: require('path/to/local/image')
  },
  cat: {
    imgName: 'Cat on a Boat', 
    uri: require('path/to/local/image')
  }
}

然后我将对象导入到我想使用它的组件中,然后像这样进行条件渲染:

import { ANIMAL_IMAGES } from 'path/to/images/object';

let imgSource = null;

if (condition === 'cat') {
  imgSource = ANIMAL_IMAGES.cat.uri;
}

<Image source={imgSource} />

我知道这不是最有效的方法,但它绝对是一种解决方法。

希望能帮助到你!

于 2017-07-31T14:22:31.527 回答
38

例如,如果您正在寻找一种通过循环遍历图像和描述的 JSON 数组来创建列表的方法,那么这将适合您。

  1. 创建一个文件(保存我们的 JSON 数据库),例如 ProfilesDB.js:

const Profiles = [
  {
    id: '1',
    name: 'Peter Parker',
    src: require('../images/user1.png'),
    age: '70',
  },
  {
    id: '2',
    name: 'Barack Obama',
    src: require('../images/user2.png'),
    age: '19',
  },
  {
    id: '3',
    name: 'Hilary Clinton',
    src: require('../images/user3.png'),
    age: '50',
  },
];

export default Profiles;

  1. 然后在我们的组件中导入数据并使用 FlatList 循环遍历列表:

import Profiles from './ProfilesDB.js';

<FlatList
  data={Profiles}
  keyExtractor={(item, index) => item.id}
  renderItem={({item}) => (
    <View>
      <Image source={item.src} />
      <Text>{item.name}</Text>
    </View>
  )}
/>

祝你好运!

于 2019-02-22T23:33:25.060 回答
17

正如React Native 文档所说,在编译包之前需要加载所有图像源

因此,另一种使用动态图像的方法是使用 switch 语句。假设你想为不同的角色显示不同的头像,你可以这样做:

class App extends Component {
  state = { avatar: "" }

  get avatarImage() {
    switch (this.state.avatar) {
      case "spiderman":
        return require('./spiderman.png');
      case "batman":
        return require('./batman.png');
      case "hulk":
        return require('./hulk.png');
      default:
        return require('./no-image.png');
    }
  }

  render() {
    return <Image source={this.avatarImage} />
  }
}

查看零食:https ://snack.expo.io/@abranhe/dynamic-images

另外,请记住,如果您的图像在线,您没有任何问题,您可以这样做:

let superhero = "spiderman";

<Image source={{ uri: `https://some-website.online/${superhero}.png` }} />
于 2019-07-22T07:04:07.703 回答
15

首先,创建一个需要图像的文件 - 必须以这种方式加载 React 原生图像。

资产/index.js

export const friendsandfoe = require('./friends-and-foe.png'); 
export const lifeanddeath = require('./life-and-death.png'); 
export const homeandgarden = require('./home-and-garden.png');

现在导入您的所有资产

应用程序.js

import * as All  from '../../assets';

您现在可以将图像用作插值,其中 imageValue(来自后端)与命名的本地文件相同,即:'homeandgarden':

<Image style={styles.image} source={All[`${imageValue}`]}></Image>
于 2020-04-06T17:31:29.050 回答
9

这里的重要部分: 我们不能像 [require('item'+vairable+'.png')] 这样在 require 中连接图像名称

第 1 步:我们使用以下图像属性集合创建一个 ImageCollection.js 文件

ImageCollection.js
================================
export default images={
    "1": require("./item1.png"),
    "2": require("./item2.png"),
    "3": require("./item3.png"),
    "4": require("./item4.png"),
    "5": require("./item5.png")
}

第 2 步:在您的应用中导入图像并根据需要进行操作

class ListRepoApp extends Component {

    renderItem = ({item }) => (
        <View style={styles.item}>
            <Text>Item number :{item}</Text>
            <Image source={Images[item]}/>
        </View>
    );

    render () {
        const data = ["1","2","3","4","5"]
        return (
            <FlatList data={data} renderItem={this.renderItem}/>
        )
    }
}

export default ListRepoApp;

如果您需要详细说明,可以点击以下链接访问https://www.thelearninguy.com/react-native-require-image-using-dynamic-names

礼貌:https ://www.thelearninguy.com

于 2019-06-22T06:11:22.737 回答
6
import React, { Component } from 'react';
import { Image } from 'react-native';

class Images extends Component {
  constructor(props) {
    super(props);
    this.state = {
           images: {
                './assets/RetailerLogo/1.jpg': require('../../../assets/RetailerLogo/1.jpg'),
                './assets/RetailerLogo/2.jpg': require('../../../assets/RetailerLogo/2.jpg'),
                './assets/RetailerLogo/3.jpg': require('../../../assets/RetailerLogo/3.jpg')
            }
    }
  }

  render() {
    const {  images } = this.state 
    return (
      <View>
        <Image
                            resizeMode="contain"
                            source={ images['assets/RetailerLogo/1.jpg'] }
                            style={styles.itemImg}
                        />
     </View>
  )}
}
于 2019-07-03T15:50:04.467 回答
5

您可以使用

<Image source={{uri: 'imagename'}} style={{width: 40, height: 40}} />

显示图像。

从:

https://facebook.github.io/react-native/docs/images.html#images-from-hybrid-app-s-resources

于 2015-12-28T02:14:39.777 回答
4

使用要求动态图像

this.state={
       //defualt image
       newimage: require('../../../src/assets/group/kids_room3.png'),
       randomImages=[
         {
            image:require('../../../src/assets/group/kids_room1.png')
          },
         {
            image:require('../../../src/assets/group/kids_room2.png')
          }
        ,
         {
            image:require('../../../src/assets/group/kids_room3.png')
          }
        
        
        ]

}

当按下按钮时-(我选择 0-2 之间的图像随机数))

let setImage=>(){
//set new dynamic image 
this.setState({newimage:this.state.randomImages[Math.floor(Math.random() * 3)];
})
}

看法

<Image
        style={{  width: 30, height: 30 ,zIndex: 500 }}
        
        source={this.state.newimage}
      />
于 2020-06-26T14:44:25.697 回答
2

假设您有一个与我的功能相似的应用程序。您的应用程序大部分处于离线状态,并且您希望一个接一个地渲染图像。下面是在 React Native 0.60 版中对我有用的方法。

  1. 首先创建一个名为Resources/Images的文件夹并将所有图像放在那里。
  2. 现在创建一个名为Index.js的文件(位于 Resources/Images),它负责索引Resources/Images文件夹中的所有图像。

常量图像 = { 'image1': 需要('./1.png'), 'image2': 需要('./2.png'), 'image3': 需要('./3.png') }

  1. 现在在您选择的文件夹中创建一个名为 ImageView 的组件。可以创建函数式、类或常量组件。我使用了 Const 组件。该文件负责根据索引返回图像。
import React from 'react';
import { Image, Dimensions } from 'react-native';
import Images from './Index';
const ImageView = ({ index }) => {
    return (
        <Image
            source={Images['image' + index]}
        />
    )
}
export default ImageView;
  1. 现在从要动态呈现静态图像的组件中,只需使用 ImageView 组件并传递索引。

    < ImageView index={this.qno + 1} />

于 2020-04-22T16:18:37.140 回答
2

我知道这很旧,但我会在这里添加它,因为我在寻找解决方案时发现了这个问题。文档允许使用 uri:'Network Image'

https://facebook.github.io/react-native/docs/images#network-images

对我来说,我得到了动态工作的图像

<Image source={{uri: image}} />
于 2018-08-24T21:35:08.667 回答
2
 <StyledInput text="NAME" imgUri={require('../assets/userIcon.png')} ></StyledInput> 

<Image
            source={this.props.imgUri}
            style={{
              height: 30,
              width: 30,
              resizeMode: 'contain',
            }}
          />   

就我而言,我尝试了很多,但最终它在 StyledInput 中工作 了 StyledInput 组件名称 图像,如果你仍然不明白,请告诉我

于 2019-06-20T07:56:45.200 回答
1

在保存图像路径的地方创建一个常量,包括 require,然后在源中输入该常量的名称。

const image = condition ? require("../img/image1.png") : require('../img/image2.png');

<Image source={image} />
于 2021-03-04T08:02:04.037 回答
0

如果您有更多的文件,这是一个简单且真正动态的解决方案。

[不适用于Expo Managed]

虽然问题很老,但我认为这是更简单的解决方案,可能会有所帮助。但我请求原谅任何术语错误,如果我有任何错误,请纠正我。

除了使用REQUIRE 之外,我们还可以将URI与Android(和/或 iOS)的原生应用程序资产一起使用。在这里我们将只讨论安卓

URI 可以根据要求轻松操作,但通常仅用于网络/远程资产,但也适用于本地和本机资产。而 require 不能用于动态文件名和目录

脚步

  1. android/app/src/main/assets从您的App.js或包含的目录中打开文件夹index.js ,如果该assets文件夹不存在,请创建一个。
  2. 在里面创建一个名为images或任何NAME您选择的文件夹assets,然后将所有图像粘贴到那里。
  3. react-native.config.js在主应用程序文件夹中创建一个名为的文件,其中包含App.jsor index.js
  4. 将这些行添加到新的 js 文件中:

module.exports = {
  project: {
    ios: {},
    android: {},
  },
  assets: ['./assets/YOUR_FOLDER_NAME/'],
};

YOUR_FOLDER_NAME使用新创建的文件夹的名称images或任何给定的位置NAME

  1. 现在npx react-native link从主应用程序文件夹在您的终端中运行,这将链接/添加 android 包中的资产文件夹。然后重建调试应用程序。
  2. 从现在开始,您可以从android/app/src/main/assetsreact-native 应用程序内部访问所有文件。例如:
<Image
   style={styles.ImageStyle}
   source={{ uri: 'asset:/YOUR_FOLDER_NAME/img' + Math.floor(Math.random() * 100) + '.png' }}
/>
于 2021-09-11T09:38:51.437 回答
-2

你应该为此使用一个对象。

例如,假设我向 API 发出了 AJAX 请求,它返回了一个图像链接,我将其保存为imageLink

source={{uri: this.state.imageLink}}

于 2015-06-16T03:54:20.410 回答