React Native - модуль Image Require з використанням динамічних імен


85

Зараз я будую тестовий додаток за допомогою React Native. Наразі модуль Image працює нормально.

Наприклад, якщо у мене було зображення з іменем avatar, наведений нижче фрагмент коду чудово працює.

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

Але якщо я змінив його на динамічний рядок, я отримую

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

Я отримую помилку:

Потрібен невідомий модуль "зображення! Аватар". Якщо ви впевнені, що модуль є, спробуйте перезапустити пакувальник.

Очевидно, що це надуманий приклад, але назви динамічних зображень важливі. React Native не підтримує імена динамічних зображень?

Реагуйте на рідну помилку з назвою динамічного зображення


1
Я зіткнувся з аналогічною проблемою з Vue, відповідь тут stackoverflow.com/questions/40491506 / ...
Alonad

Відповіді:


70

Це висвітлено в документації в розділі " Статичні ресурси ":

Єдиним дозволеним способом посилання на зображення в наборі є буквальне написання 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} />

Однак вам також потрібно пам’ятати про додавання зображень до набору xcassets у вашому додатку в Xcode, хоча, здається, з вашого коментаря ви це вже зробили.

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


1
куди слід додати зображення, я використовую рідну реакцію для android у папці, що малюється?
coderzzz18,

2
Посилання вище неправильне, стаття зараз знаходиться на facebook.github.io/react-native/docs/images.html
app_sciences

46
привіт, як це зробити, якщо мені потрібні сотні зображень?
chanjianyi

1
@chanjianyi Я перебуваю на тій же ситуації :-(
штат Міссурі

1
"Require" для мене не працює на пристроях IOS. Будь-яка ідея, чому?
Артур Медейрос,

57

Це працювало для мене:

Я створив користувальницький компонент зображення, який приймає логічну форму, щоб перевірити, чи є зображення з Інтернету чи передається з локальної папки.

// 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')як реквізит. Це працює!


5
Ця відповідь заслуговує більшої поваги. Це абсолютно працює, коли ви оголошуєте оператор require і передаєте як проп. Щиро дякую за ваше просте пояснення, я лише бажаю, щоб інші були настільки ж ясними.
dazziola

1
Реквізит робить чудеса. Це повинно бути зазначено в офіційних документах.
dasmikko

1
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`)} />
Пабло,

1
У батьківському компоненті я маю <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 }} /> ); } }
Walter Monecke

2
Чистий геній, це саме те , що я шукав :)
Sumit Sahoo

52

АКТУАЛЬНО, ЯКЩО ВИ ЗНАЛИ ЗОБРАЖЕННЯ (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} />

Я знаю, що це не найефективніший спосіб, але це, безумовно, обхідний шлях.

Сподіваюся, це допоможе!


3
Охайне рішення для обробки відомого набору зображень
Теді Канджіратханкал

1
@TedyKanjirathinkal Я рада, що це допомогло!
Вальтер Монеке

1
Дякую, це буде корисно
Truca

@WalterMonecke: я отримую ціле значення, якщо ми робимо так
sabir

24

Якщо ви шукаєте спосіб створити список, переглядаючи масив 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>
  )}
/>

Удачі!


3
Дякую, це спрацювало для мене після стільки розчарувань!
херуколь

11

Як говорить React Native Documentation , перед складанням набору потрібно завантажити всі ваші джерела зображень

Отже, ще одним способом використання динамічних зображень є використання оператора 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` }} />

7

По-перше, створіть файл із необхідним зображенням - React native images повинен бути завантажений таким чином.

активи / 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');

Тепер імпортуйте всі свої активи

App.js

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

Тепер ви можете використовувати своє зображення як інтерпольоване значення, де imageValue (надходить із серверної бази) збігається з іменованим локальним файлом, тобто: 'homeandgarden':

<Image style={styles.image} source={All[`${imageValue}`]}></Image>

Приємне рішення, це мені дуже допомогло! Tks.
Фрила

Не хвилюйся! Не міг знайти хорошого рішення тут, тому придумав своє власне :) Радий, що допоміг.
HannahCarney

5

Важлива частина тут: Ми не можемо зв’язати ім’я зображення всередині вимоги типу [require ('item' + vavable + '. Png')]

Крок 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


5
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>
  )}
}


2

Для використання динамічного зображення потрібно

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

1

Я знаю, що це старе, але я збираюся додати це тут, оскільки знайшов це запитання, шукаючи рішення. Документи дозволяють використовувати uri: "Мережеве зображення"

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

Для мене я отримав зображення, які динамічно працюють із цим

<Image source={{uri: image}} />

1
 <StyledInput text="NAME" imgUri={require('../assets/userIcon.png')} ></StyledInput> 

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

у моєму випадку я спробував так багато, але, нарешті, це працює Зображення імені компонента StyledInput всередині StyledInput, якщо ви все ще не розумієте, дайте мені знати


1

Скажімо, якщо у вас є програма, яка має подібні функції, як моя. Там, де ваш додаток здебільшого офлайн, і ви хочете відтворювати зображення одне за одним. Тоді нижче - підхід, який працював у мене у React Native версії 0.60.

  1. Спочатку створіть папку з назвою Ресурси / Зображення та розмістіть там усі свої зображення.
  2. Тепер створіть файл Index.js (у Resources / Images), який відповідає за індексацію всіх зображень у папці Reources / Images .

const Images = {'image1': require ('./ 1.png'), 'image2': require ('./ 2.png'), 'image3': require ('./ 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} />


-2

Для цього слід використовувати об’єкт.

Наприклад, припустимо, що я зробив запит AJAX до API, і він повертає посилання на зображення, яке я збережу, щоб вказати як imageLink:

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


3
для динамічних посилань на шлях до зображення це не працює: var img = "../img/icons/"+img_name+"_selected.png"; <br/> <Image source={{uri: img}} resizeMode={'contain'} />
Роберт Томас G IV,

3
хак для цього, якщо ви знаєте, що всі варіанти img_name будуть рухатися таким шляхом:var images = { 'first': require('../first.png'), 'second': require('../second.png') } <Image source={{uri:images[img_name]}} resizeMode={'contain'} />
Габріель Лупу

2
Зверніть увагу, що для пропозиції @GabrielLupu: Ви таким чином розподіляєте всі зображення в пам'яті. Це залежить від кількості зображень та їх розмірів, однак у вас, ймовірно, виникатимуть помилки в пам'яті.
Lashae,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.