#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 в префикс, это поможет здесь отобразить изображение при рендеринге