React Native - 使用动态名称的图像需要module

IT技术 javascript react-native jsx
2021-02-04 03:36:51

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

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

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

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

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

我收到错误:

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

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

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

6个回答

这包含在“静态资源部分下的文档中

引用包中图像的唯一允许方法是在源中逐字写入 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

“需要”对我来说不适用于 IOS 设备。知道为什么吗?
2021-03-11 03:36:51
上面的链接不正确,文章现在在facebook.github.io/react-native/docs/images.html
2021-03-16 03:36:51
嗨,如果我有数百张图片需要怎么办?
2021-03-18 03:36:51
我应该在哪里添加图像,我在 drawable 文件夹中使用 react native for android?
2021-03-23 03:36:51
@chanjianyi 我也是这种情况:-(
2021-03-29 03:36:51

这对我有用:

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

// 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')作为props发送有用!

class CustomImage extends Component { constructor(props) { super(props); } render() { return ( <Image source={this.props.imageName} resizeMode="contain" style={{ height: 24, width: 24 }} /> ); } } <CustomImage fromWeb={false} imageName={require(`../../images/phone-${item.status}.png`)} />
2021-03-12 03:36:51
道具的工作奇迹。这应该在官方文档中说明。
2021-03-16 03:36:51
在父组件中我有 <CustomImage fromWeb={false} imageName={require(../../assets/icons/${el.img}.png)} /> 和这个在子组件中class CustomImage extends Component { constructor(props) { super(props); } render() { return ( <Image source={this.props.imageName} resizeMode="contain" style={{ height: 24, width: 24 }} /> ); } }
2021-03-17 03:36:51
这个答案值得更多赞扬。当您声明 require 语句并作为 prop 传递时,它绝对有效。非常感谢您的简单解释,我只希望其他人也能如此清楚。
2021-03-20 03:36:51
纯粹的天才,这正是我正在寻找的:)
2021-03-20 03:36:51

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

我解决这个问题的方式:

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

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 };

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

import { images } from 'relative/path';

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

<Image source={imgSource} />

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

希望能帮助到你!

处理一组已知图像的简洁解决方案
2021-03-21 03:36:51
@WalterMonecke:如果我们这样做,我会得到整数值
2021-03-30 03:36:51

例如,如果您正在寻找一种通过遍历图像和描述的 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>
  )}
/>

祝你好运!

如果有更多的图像文件,那么实现它的逻辑是什么?我无法为所有这 50 张图像手动编写代码。我能够列出所有图像并导出所有图像,但它是节点 js 代码。
2021-03-15 03:36:51
@CrackerKSR,你说得对。此解决方案通常最适用于一些图像。
2021-03-24 03:36:51
这正是我正在寻找的。我正在我的应用程序中创建一个本地“数据”文件,我需要访问图像。我已经尝试过 <Image source={require(item.img)} /> 但是它不起作用所以在尝试了你提供的解决方案后它对我有用。谢谢!
2021-04-06 03:36:51

正如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` }} />