将 required() 图像作为道具传递时出错

Posted

技术标签:

【中文标题】将 required() 图像作为道具传递时出错【英文标题】:Error passing required() Image as a prop 【发布时间】:2018-01-31 03:43:19 【问题描述】:

我有一个名为 data.js 的文件,我在其中导出了一个对象,其中一个元素是图像。看起来是这样的:

var data = [
  
    "id": 1,
    "Category": "Category Title",
    "Image": require("../images/comingsoon.png"),
    "Summary": ""
  ,

然后在另一个组件中,我导入数据变量并使用 FlatList 将 data.Image 作为道具传递给另一个组件。

<FlatList
   style=margin:5
   numColumns=2
   data=this.state.data
   renderItem=(item) => item
/>

item 看起来像这样:

<CategoryItem key=item.id Image=item.Image Category=item.Category/>

然后我像这样在 CategoryItem 中使用 Image 道具:

<Image source=this.props.item.Image style=styles.CategoryImage>

而且效果很好!... 但我想像这样简单地将 Item 作为道具传递给 CategoryItem:

<CategoryItem key=item.id item=item/>

一旦进入 CategoryItem,我会这样做:

  render()
    const Category, Image = this.props.item;

并通过执行来调用图像

<Image source=Image style=styles.CategoryImage>

但是,当我这样做时,应用程序崩溃并显示Image 是一个数字。

在记录item 的样子后,我发现require()ing 将图像转换为数字,它应该通过简单地传递它来工作,它崩溃了。有什么想法吗?

【问题讨论】:

你真的在使用 RequireJS 吗?如果不是,您应该删除该标签,因为 RequireJS 是一个特定的产品。如果您使用的是 RequireJS,那么您的问题需要编辑以提供解释您如何使用它的上下文(不,单个 require 调用是不够的),因为没有理由相信它实际上是您的问题的一个因素. 【参考方案1】:

问题在于局部变量 Image 正在隐藏名为 Image 的组件。

您的代码经过简化后可能如下所示:

import  Image  from 'react-native';

class CategoryItem extends React.Component 
  render() 
    const  Category, Image  = this.props;
    return <Image source=Image />
  

&lt;Image /&gt; 声明不是像您期望的那样引用组件,而是引用 Image 属性。

这很容易通过重命名变量来解决:

class CategoryItem extends React.Component 
  render() 
    const  Category, Image: imageSource  = this.props;
    return <Image source=imageSource />
  

错误告诉您组件是 number 的原因是 React Native 资产导入如何工作的实现细节。当您使用 require('path.jpg') 导入图像时,React Native 会为该图像分配一个唯一的数字 ID 并返回它而不是图像路径描述符。出于性能原因,这有利于性能,因此它可以传递一个数字,而不是为每个渲染传递一个原生 javascript 桥的描述符,这样序列化和编组成本更低。

附带说明一下,在 lowerCamelCase 中声明组件 props 是一种常见的 React 做法,因此您将使用 &lt;CategoryItem image= /&gt; 代替 &lt;CategoryItem Image= />。这只是一个约定,但在这种情况下,它可以避免这个错误。

【讨论】:

感谢您出色而清晰的解释。我没有意识到我的错误。 嘿,我有一个组件,我将图像作为道具传递,其他道具导航,我想在 react-navigation 中获取我作为道具传递的图像,我如何处理这些? &lt;PopularFood img=require('../../assets/food-2.png') navigate=() =&gt; this.props.navigation.navigate('Itme', image: this.props.img, // not work!! ); /&gt;@jevakallio

以上是关于将 required() 图像作为道具传递时出错的主要内容,如果未能解决你的问题,请参考以下文章

将图像作为道具传递给 Next.js 中的样式化组件

在 React TS 中将道具传递给孩子时出错

如何将 imageUrl 作为道具传递?

如何将 Django 变量传递给 Vue 道具

Vite / Vue 3:使用图像源作为道具时“未定义要求”

将组件作为道具传递时在 Flow 中键入 React 组件