React Native - 使用动态名称的图像需求模块

Sha*_*ssy 65 javascript jsx react-native

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

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

<Image source={require('image!avatar')} />
Run Code Online (Sandbox Code Playgroud)

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

<Image source={require('image!' + 'avatar')} />
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Requiring unknown module "image!avatar". If you are sure the module is there, try restarting the packager.

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

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

Col*_*say 49

这将在" 静态资源 " 部分的文档中介绍:

引用捆绑中图像的唯一允许方法是在源中逐字写入require('image!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} />
Run Code Online (Sandbox Code Playgroud)

但是,您还需要记住将您的图像添加到Xcode中的应用程序中的xcassets捆绑包中,尽管从您的评论中可以看出您已经完成了.

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

  • 嗨,如果我有数百张图片需要怎么办? (18认同)
  • 上面的链接不正确,文章现在在 https://facebook.github.io/react-native/docs/images.html (2认同)
  • @chanjianyi 我也是这种情况:-( (2认同)

BK7*_*BK7 45

这对我有用:

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

// 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} />
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这个答案值得更多的赞赏。当您声明require语句并作为道具传递时,它绝对有效。非常感谢您的简单解释,我只希望其他人也能这么清楚。 (3认同)
  • 在父组件中,我有 `&lt;CustomImage fromWeb={false} imageName={require(`../../assets/icons/${el.img}.png`)} /&gt;` ,并且在子组件中`类 CustomImage 扩展组件 { 构造函数(props){ super(props); } render() { return ( &lt;Image source={this.props.imageName} resizeMode="contain" style={{ height: 24, width: 24 }} /&gt; ); } }` (2认同)
  • 纯粹的天才,这正是我正在寻找的:) (2认同)

Wal*_*cke 28

相关的,如果你有已知的图像(URLS):

我通过这个问题破解了我的方式:

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

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

export { images };
Run Code Online (Sandbox Code Playgroud)

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

import { images } from 'relative/path';

if (cond === 'cat') {
  let imgSource = images.cat.uri;
}

<Image source={imgSource} />
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你!

  • 处理一组已知图像的简洁解决方案 (3认同)

Abr*_*dez 16

正如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} />
  }
}
Run Code Online (Sandbox Code Playgroud)

检查小吃:https : //snack.expo.io/@abranhe/dynamic-images

另外,请记住,如果您的图像在线没有任何问题,您可以执行以下操作:

let superhero = "spiderman";

<Image source={{ uri: `https://some-website.online/${superhero}.png` }} />
Run Code Online (Sandbox Code Playgroud)


Han*_*ney 14

首先,创建一个需要图像的文件 - 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');
Run Code Online (Sandbox Code Playgroud)

现在导入您的所有资产

应用程序.js

import * as All  from '../../assets';
Run Code Online (Sandbox Code Playgroud)

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

<Image style={styles.image} source={All[`${imageValue}`]}></Image>
Run Code Online (Sandbox Code Playgroud)


Mos*_*emi 10

例如,如果您正在寻找一种通过遍历图像和描述的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;
Run Code Online (Sandbox Code Playgroud)

  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>
   }
/>
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • 谢谢,在经历了这么多挫折之后,这对我有用! (3认同)

小智 8

这里的重要部分: 我们不能像 [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")
}
Run Code Online (Sandbox Code Playgroud)

第 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;
Run Code Online (Sandbox Code Playgroud)

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

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


Roy*_*l.O 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>
  )}
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用

<Image source={{uri: 'imagename'}} style={{width: 40, height: 40}} />
Run Code Online (Sandbox Code Playgroud)

显示图像。

从:

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