【问题标题】:React Native require(image) returns numberReact Native require(image) 返回数字
【发布时间】:2019-02-23 04:57:29
【问题描述】:

我有一个带有一个组件 EventCard 的 js 文件,它包含事件名称、日期、事件图像等。如果事件图像不存在,我想加载一个占位符图像。现在该语句看起来像这样

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}}

在对占位符图像进行 require 时,我奇怪地得到 11,并且 react native 抛出错误说“uri 的值不能从 Double 转换为 String”。

非常感谢您的帮助。

谢谢

【问题讨论】:

    标签: javascript reactjs react-native require


    【解决方案1】:

    在内部,React Native 静态图像 require 解析为数字。

    我可以用 React Native typescript 类型声明来证明。

    // 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 之一。

    【讨论】:

      【解决方案2】:
      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',
        },
      });
      

      【讨论】:

        【解决方案3】:

        经过@Fawaz 和@Haider 的一些研究和一些帮助,我了解到需要返回一个数字。这意味着我们可以直接将数字与 source 一起使用而不是 require 并且它可以工作

        <Image source={11} />
        

        如果您有任何与该数字对应的图像,这应该会显示来自本地资源的图像。因此,当想要决定是显示服务器发送的 url 还是像我这样的本地资源时。我们可以使用@Fawaz 答案,它基本上插入一个 {uri: "image-link"} 或 require("image") 其中 require 将被解析为一个数字,当与 source 一起使用时,您将放置对象或数字根据文档的标准方法。

        【讨论】:

        • 我不相信这是真的。我有完全相同的情况,我收到错误:NSNumber 类型的 JSON 值“49”无法转换为有效的 URL。
        • 您有与该值对应的图像吗?请注意,我不是这方面的专家,我只是分享我的观察。
        • 这对我来说是一个愚蠢的错误!在修复了一些代码后,删除了 URI 部分,因为它是本地图像,它运行没有错误。但是没有图像渲染,我没有注意并试图加载 SVG 作为图像源。将它们换成 PNG 可以解决这个问题!
        • 因为这个问题我感到很头疼。最后,我发现你的回答对我很有帮助。你是最好的感谢。
        • 这是真的。在@types/react-native 中,ImageSourcePropType 可以是数字,ImageRequireSource 类型只是number 类型的别名。
        【解决方案4】:

        使用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。我以前也经历过!
        【解决方案5】:

        不要动态使用require。这篇文章的详细解释: React Native - Image Require Module using Dynamic Names

        【讨论】:

          【解决方案6】:

          你可以这样做

          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 的答案更优雅。
          【解决方案7】:

          根据documentation&lt;Image /&gt;source 属性只接受资源的路径(本地或远程)。在您的示例中可能如下所示:

          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,你的建议与我尝试的很接近,但显然不起作用。不过感谢您的努力。
          • 你是对的。我确实误解了这个问题,也没有意识到对象(即{ uri: '' })可以传递给source prop。
          • 我很高兴我的问题引起了一些兴趣,也可以帮助我和其他人。
          猜你喜欢
          • 2021-10-16
          • 1970-01-01
          • 2022-11-12
          • 2017-03-20
          • 2019-06-19
          • 2018-10-21
          • 2019-07-12
          • 2021-08-27
          • 2021-10-20
          相关资源
          最近更新 更多