2017-01-04 3 views
0

В моей папке «img» у меня есть 5 папок: («Америка», «Европа», «Азия», «Африка», «Австралия»). Каждая из этих папок содержит несколько изображений города (например, в папке Европы будут размещены London.jpg, Paris.jpg, Rome.jpg и т. Д.)Загрузить изображение динамически, основанное на значении реквизита в реакции-native?

Теперь мой редуктор возвращает мне 2 реквизита. Один представляет собой континент, а другой - город, который принадлежит континенту, хранящемуся в предыдущей опоре.

Что я хочу достичь - это динамически загружать изображение города.

что-то вроде этого:

var icon = (this.props.myContinent && this.props.myCity) ? 
     require('./img/'+{this.props.myContinent}+'/'+{this.props.myCity}+'.png'); 

<Image source={icon} /> 

Я прочитал this и this и они дали мне идею. Но я все еще не могу это решить.

ответ

0

Ваш код не работает, потому что имя изображения в require должен быть известен статически. Согласно docs:

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

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

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

Хотя это немного неудобно, это довольно легко реализовать. В вашем случае, я бы следующее:

const images = { 
    america: { 
     caracas: require('images/america/caracas.png'), 
     newyork: require('images/america/newyork.png') 
    }, 
    europe:{ 
     london: require('images/america/london.png'), 
     paris: require('images/america/paris.png') 
     rome: require('images/america/rome.png') 
    }, 
    asia:{ 
     // And so on... 
    } 
} 

Затем ваш icon инициализации должен выглядеть следующим образом:

var icon = (this.props.myContinent && this.props.myCity) ? images[this.props.myContinent][this.props.myCity] : null; 

И в render вы можете сделать что-то вроде этого. Механизм «& &» просто есть, чтобы проверить, если icon равно нулю:

{icon && <Image source={icon} />} 
+0

Это немного неудобно, у меня сотни городов. Но это работает – splunk

+0

Я согласен с вами, если у вас много изображений, это немного боль. Возможно, вы можете автоматизировать создание объекта «images» с помощью сценария узла, который рекурсивно ищет файлы изображений и выводит объект. – martinarroyo

0

Проблема заключается в том, что вы не используете тройное состояние должным образом. Вы используете ? без :. используйте некоторое изображение, если условие не выполняется.

Написать это так:

var icon = (this.props.myContinent && this.props.myCity) ? 
    require(`./img/${this.props.myContinent}/${this.props.myCity}.png`) 
    : require('./img/defaultImage.png'); 

<Image source={icon}/> 
+0

Я получаю эту ошибку: Требуя неизвестный модуль «./img/Europe/London.jpg». Если вы уверены, что модуль существует, попробуйте перезапустить упаковщик или запустить «npm install». – splunk

+0

Я думаю, его не удалось найти изображение, проверьте структуру папок. –

+0

Я пробовал с: require ('./ img/Europe/London.jpg'), и он показывает изображение, после чего я попробовал с требованием ('./ img /' + this.props.myContinent + '/ London.jpg') и он дает: Требуется неизвестный модуль «./img/Europe/London.jpg». Если вы уверены, что модуль существует ... – splunk

1

Вы можете создать иконку компонента с объектом путей к изображениям, а затем в контейнер просто поставить название города в своем роде опору.

const paths = { 
    'paris': require('./img/europe/paris.png'), 
    'london': require('./img/europe/london.png'), 
} 


export default function Icon({ kind }) { 
    return (
    <Image 
     source={paths[kind]} 
    /> 
); 
} 

Затем в контейнере что-то вроде

<Icon kind={this.props.city} /> 
+0

Реабилитация - это ключ к реактору, и это будет хорошо работать. Просто нужно передать континент. – G0dsquad