React Native require (изображение) возвращает число

У меня есть файл 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».

Помощь очень ценится.

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
18
0
11 805
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Согласно документация, опора 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;

Эй, leitdeux, то, что вы предлагаете, близко к тому, что я пробовал, и это явно не работает. Тем не менее, спасибо за усилия.

Kireeti K 19.09.2018 08:31

Ты прав. Я неправильно понял проблему, а также не понял, что объект (например, { uri: '' }) может быть передан в опору source.

leitdeux 19.09.2018 08:44

Я рад, что мой вопрос вызвал интерес и помог мне и кому-то еще.

Kireeti K 19.09.2018 08:47

Вы можете просто сделать это

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 более элегантен.

Kireeti K 19.09.2018 08:33

Не используйте 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 возвращает число, и ваш ответ заставляет меня задуматься об этом.

Kireeti K 19.09.2018 08:35

Рад, что помог @KireetiK. Я испытал то же самое раньше!

Fawaz 19.09.2018 08:36

После некоторого исследования и некоторой помощи от @Fawaz и @Haider я понял, что require возвращает число. Это означает, что мы можем использовать число напрямую с источником вместо требования, и это работает.

<Image source = {11} />

Это должно отображать изображение с вашего локального ресурса, если у вас есть изображение, соответствующее этому номеру. Поэтому, когда вы хотите решить, показывать ли URL-адрес, отправленный сервером, или локальный ресурс, как в моем случае. мы можем пойти с ответом @Fawaz, который в основном вставляет {uri: "image-link"} или require ("image"), где require будет преобразован в число, а при использовании с источником вы поместите либо объект, либо число, которые стандартные способы согласно документации.

Я не верю, что это правда. У меня точно такой же сценарий, и я получаю сообщение об ошибке: Значение JSON «49» типа NSNumber не может быть преобразовано в действительный URL-адрес.

Stephen Tetreault 15.10.2018 23:02

У вас есть изображение, соответствующее этому значению? Обратите внимание, я не специалист в этом вопросе, я только делюсь своими наблюдениями.

Kireeti K 16.10.2018 10:23

Это была глупая ошибка с моей стороны! После исправления некоторого кода, удаления части URI, поскольку это локальный образ, он работал без ошибок. Однако без рендеринга изображения я не обращал внимания и пытался загрузить SVG в качестве источника изображения. Замена их на PNG, конечно, исправила!

Stephen Tetreault 16.10.2018 18:15

Из-за этой проблемы у меня болела голова. Наконец, я нашел ваш ответ, который мне очень помог. Спасибо тебе самое лучшее.

Halil İbrahim Özdoğan 07.01.2020 11:19

Это правда. В @types/react-nativeImageSourcePropType может быть числом, а тип ImageRequireSource - это просто псевдоним типа number.

MJ Studio 14.09.2020 07:29

Определенно не рекомендуется передавать числовые литералы в исходную опору, поскольку они могут измениться, если вы добавите в свой код дополнительные требования.

ICW 15.06.2021 21:19
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.

Другие вопросы по теме