Рендеринг локальных изображений из базы данных

#react-native #react-image

#react-native #react-image

Вопрос:

Я делаю подборщик стран с флагами. Названия стран и названия изображений флагов поступают из базы данных, вот так (пример):

 dataSource: [
{
  id: 1,
  name: "Afghanistan",
  image: '../assets/flags/af.png'
},
{
  id: 2,
  name: "Bahrain",
  image: '../assets/flags/ba.png'
},
{
  id: 3,
  name: "Canada",
  image: '../assets/flags/ca.png'
}]
 

Затем я отправляю этот источник данных в свой компонент

                         <CountryPickerFlags
                          dataSource={this.state.dataSource}
                        />
 

Затем в компонентном плоском списке (renderItem) Я так и делаю:

   _renderItemListValues(item, index) {
      var image_uri = {uri: item.image} ;   
      
      console.log(JSON.stringify(image_uri));
        
    return (
    
      <TouchableOpacity
        activeOpacity={1}
        style={styles.listRowClickTouchStyle}
        onPress={() => this._setSelectedIndex(item.id, item.name)}
      >
        <View style={[styles.listRowContainerStyle,{ flexDirection:'row', justifyContent: 'center', alignItems: 'center'}]} >
          <Image source={image_uri} />
          <Text style={styles.listTextViewStyle}>{item.name}</Text>
        </View>
      </TouchableOpacity>
    );
  }
 

Но флаг не отображается….
Если я жестко закодирую изображение (с помощью require), оно будет работать…

   <Image source={require("../assets/flags/af.png")} />
 

Как я могу это сделать?

Ответ №1:

Перейдите в assets папку, создайте файл prepareImages.js и вставьте в него следующее:

 const fs = require("fs");
const files = fs.readdirSync("./assets/flags").filter(x => x.includes("png"));
const ex = "{n"  
files.map(x => `"../assets/flags/${x}": require("./${x}"),`).join("n")   "}";
const res = "export default "   ex;
fs.writeFileSync("./assets/flags/index.js", res);
 

Это создаст index.js файл, в котором будет находиться подобный объект:

 "../assets/flags/af.png": require("./af.png"),
 

Импортируйте изображения из этого файла, в котором вы визуализируете Image компонент.

 import images from "../assets/flags/images";
 

Рендеринг источника изображения таким образом:

 <Image source={images[image_uri]} />
 

Комментарии:

1. Как мне «выполнить» prepareImages.js ?

2. Перейдите в папку assets и запустите node prepareImages.js

3. Спасибо! Сработало! Но с помощью этой системы, которую вы мне предлагаете, как мне объединить данные из базы данных с этим импортом изображений, чтобы отправить их в компонент… Компонент будет общим, поэтому я не смогу импортировать туда изображения…

4. Я не понимаю, что вы хотите сделать

5. Я сделал это ….Источник данных: [ { id: 1, название: «Афганистан», изображение: images[‘../assets/flags/af.png’]},

Ответ №2:

Добавьте требование к вашему набору данных, например

 dataSource: [ { ..., image: require('../assets/flags/af.png')}]
 

Комментарии:

1. да, но теоретически источник данных поступает из базы данных, должен ли я также указать «require» в базе данных?

2. Да, если вы добавите require в префикс, это поможет здесь отобразить изображение при рендеринге