У меня есть файл js с одним компонентом EventCard, который принимает имя события, дату, изображение события и т. д. Если изображение события не существует, я хочу загрузить изображение заполнителя. Теперь это заявление выглядит так
constructor(props){
super(props);
let imgUrl = props.image ? props.image : require("../assets/images/image.jpg");
this.state = {image: imgUrl}
}
Я использую this.state внутри рендера для источника вроде
source = {{uri: this.state.image}}
Как ни странно, я получаю 11, когда выполняю требование для изображения-заполнителя, а собственный код реакции выдает ошибку, говоря, что «значение для uri не может быть преобразовано из Double в String».
Помощь очень ценится.
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласно документация, опора source для <Image /> принимает только путь к ресурсу (локальному или удаленному). Вот как это может выглядеть в вашем примере:
import React, { Component } from 'react';
import { Image } from 'react-native';
class EventCard extends Component {
constructor(props) {
super(props);
const imgUrl = props.image || require('../assets/images/image.jpg');
this.state = { image: imgUrl };
}
render() {
return (
<Image
source = {this.state.image}
/>
);
}
}
export default EventCard;
Ты прав. Я неправильно понял проблему, а также не понял, что объект (например, { uri: '' }) может быть передан в опору source.
Я рад, что мой вопрос вызвал интерес и помог мне и кому-то еще.
Вы можете просто сделать это
constructor(props){
super(props);
let imgUrl = props.image ? props.image : null
this.state = {image: imgUrl}
}
source = {imgUrl == null ? require("../assets/images/image.jpg") : this.state.image}
Спасибо за усилия, и это близко к тому, что я ищу, но ответ @Fawaz более элегантен.
Не используйте require динамически. Подробное объяснение в этом посте:
React Native - модуль требования к изображению с использованием динамических имен
Вам необходимо назначить источник изображения напрямую при использовании require.
constructor(props){
super(props);
let imgUrl = props.image ? { uri: props.image } : require("../assets/images/image.jpg");
this.state = { image: imgUrl };
}
а затем в вашем рендере:
source = {this.state.image}
Спасибо за усилия, это действительно работает. Раньше я не знал, что require возвращает число, и ваш ответ заставляет меня задуматься об этом.
Рад, что помог @KireetiK. Я испытал то же самое раньше!
После некоторого исследования и некоторой помощи от @Fawaz и @Haider я понял, что require возвращает число. Это означает, что мы можем использовать число напрямую с источником вместо требования, и это работает.
<Image source = {11} />
Это должно отображать изображение с вашего локального ресурса, если у вас есть изображение, соответствующее этому номеру. Поэтому, когда вы хотите решить, показывать ли URL-адрес, отправленный сервером, или локальный ресурс, как в моем случае. мы можем пойти с ответом @Fawaz, который в основном вставляет {uri: "image-link"} или require ("image"), где require будет преобразован в число, а при использовании с источником вы поместите либо объект, либо число, которые стандартные способы согласно документации.
Я не верю, что это правда. У меня точно такой же сценарий, и я получаю сообщение об ошибке: Значение JSON «49» типа NSNumber не может быть преобразовано в действительный URL-адрес.
У вас есть изображение, соответствующее этому значению? Обратите внимание, я не специалист в этом вопросе, я только делюсь своими наблюдениями.
Это была глупая ошибка с моей стороны! После исправления некоторого кода, удаления части URI, поскольку это локальный образ, он работал без ошибок. Однако без рендеринга изображения я не обращал внимания и пытался загрузить SVG в качестве источника изображения. Замена их на PNG, конечно, исправила!
Из-за этой проблемы у меня болела голова. Наконец, я нашел ваш ответ, который мне очень помог. Спасибо тебе самое лучшее.
Это правда. В @types/react-nativeImageSourcePropType может быть числом, а тип ImageRequireSource - это просто псевдоним типа number.
Определенно не рекомендуется передавать числовые литералы в исходную опору, поскольку они могут измениться, если вы добавите в свой код дополнительные требования.
You can try this,
import React, {Component} from 'react';
import {StyleSheet,ImageBackground} from 'react-native';
import bgSrc from './images/bgfrm.png';
export default class Wallpaper extends Component {
constructor(props){
super(props);
let imgUrl = props.image ? props.image :bgSrc;
this.state = {image: imgUrl};
}
render() {
return (
<ImageBackground style = {styles.picture} source = {this.state.image}>
{this.props.children}
</ImageBackground>
);
}
}
const styles = StyleSheet.create({
picture: {
flex: 1,
width: null,
height: null,
resizeMode: 'cover',
},
});
Внутренне статическое изображение React Native require разрешается как число.
Я могу доказать это с помощью объявления типа TypeScript React Native.
// your file
import { ImageSourcePropType } from 'react-native';
// @types/react-native
/**
* @see https://facebook.github.io/react-native/docs/image.html#source
*/
export type ImageSourcePropType = ImageURISource | ImageURISource[] | ImageRequireSource;
...
export type ImageRequireSource = number;
Тип ImageRequireSource - это просто тип number.
И это может быть один из ImageSourcePropType.
Эй, leitdeux, то, что вы предлагаете, близко к тому, что я пробовал, и это явно не работает. Тем не менее, спасибо за усилия.