【问题标题】:TypeError: undefined is not an object (evaluating 'data[imageKey].urls'TypeError: undefined is not an object (评估 'data[imageKey].urls'
【发布时间】:2021-02-09 09:01:11
【问题描述】:

尝试使用钩子在函数式中重写类组件。我重写了方法,但是敲掉了我不传输数据的错误,我不明白如何传输。错误说

undefined 不是对象(评估 `data[imageKey].urls`)。

我通过imgsource={{ url: modalImage }}渲染图片却出现错误

import React, { Component, useEffect, useState, useCallback } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    TouchableWithoutFeedback,
    Dimensions,
    Modal,
    ScrollView,
    ActivityIndicator,
} from 'react-native';

import ImageElement from './ImageElement'

const ImageListWithHooks = (props) => {

    useEffect(() => {
        fetch('https://api.unsplash.com/photos/?client_id=cf49c08b444ff4cb9e4d126b7e9f7513ba1ee58de7906e4360afc1a33d1bf4c0')
            .then((response) => response.json())
            .then((json) => setData(json))
            .catch((error) => console.log(error))
            .finally(() => setLoading(false));
    }, []);

    const [loading, setLoading] = useState()
    const [data, setData] = useState([]);
    const [modalVisible, setModalVisible] = useState(false)
    const [modalImage, setModalImage] = useState(props.imgsource)

     const setModal = ((visible, imageKey) => {
        setModalImage({ modalImage: visible ? data[imageKey].urls.raw : null })
        setModalVisible({ modalVisible: visible })
    })

    let images = data.map((val, key) => {

        return <TouchableWithoutFeedback key={key}
            onPress={() => { setModal(key) }}>
            <View style={styles.imagewrap}>
                <ImageElement
                    author={{ url: val.user.profile_image.small }} // фото автора
                    imgsource={{ url: val.urls.small }} // работа автора
                    authorNameProp={val.user.name}   // имя автора
                ></ImageElement>
            </View>
        </TouchableWithoutFeedback>
    });
    return (
        <ScrollView>
            <View style={styles.container}>
                <Modal
                    style={styles.modal}
                    animationType={'fade'}
                    transparent={true}
                    visible={modalVisible}
                    onRequestClose={() => { }}
                >
                    <View style={styles.modal}>
                        <Text style={styles.text}
                            onPress={() => { setModal(true) }}>Close</Text>
                        <View>
                            <Text style={styles.spinner}>Loading... <ActivityIndicator /></Text>
                        </View>
                        <ImageElement
                            imgsource={{ url: modalImage }}
                        ></ImageElement>
                    </View>
                </Modal>
                {images}
            </View>
        </ScrollView>
    );
}

【问题讨论】:

  • 我最近是否帮助您编写了一些看起来非常相似的代码?您在 onPress={() =&gt; { setModal(key) }} 中有一个错误,您将 key 传递给 visible 参数,而 imageKey 在您的 setModal 回调中未定义。我想我记得以前的代码中有一个类似的问题。 data[undefined] 产生 undefined 并且您无法访问 urls 属性。
  • 因此,在我编写类组件时,在前面的代码中也出现了类似的错误。到目前为止,我不明白如何纠正这个错误。
  • 我检查了您的响应数据,数组中的所有元素似乎都具有urls.raw 属性。您是否尝试解决我上面指出的问题?您应该始终将visible imageKey 参数传递给setModal
  • 所以我尝试解决调用 setModal 时会打开一个模态窗口的问题。我不太明白我必须如何始终如一地传达论点。
  • 你的图像元素周围有一个按钮,它只传递一个 key (onPress={() =&gt; { setModal(key) }}),而模态中的另一个按钮只传递一个布尔值 visible (onPress={() =&gt; { setModal(true) }}。你'已经定义setModal 来使用visibleimageKey 参数。如果您可以再次描述您希望用户与这两个按钮交互时所需的行为,我可以建议一个更有针对性的解决方案。如果我有猜测一下,您希望模态在按下图像时打开/可见,并在按下模态的关闭按钮时关闭/不可见,是吗?

标签: reactjs react-native


【解决方案1】:

问题

  • setModal 处理程序imageKey 中未定义
  • imageKey 未定义时,data[imageKey] 解析为 data['undefined'],而 data['undefined'] 本身未定义
  • 您无法访问未定义对象/值的属性

您已经定义了一个 setModal 处理程序来使用两个参数,visibleimageKey

const setModal = ((visible, imageKey) => {
  setModalImage({ modalImage: visible ? data[imageKey].urls.raw : null });
  setModalVisible({ modalVisible: visible });
});

但不一致地向它传递参数。您创建一个按钮数组来打开一个模式并将图像键传递给visible 参数,这实际上是数组索引。索引0 为假,所有非零索引均为真。

<TouchableWithoutFeedback
  key={key}
  onPress={() => { setModal(key) }} // <-- pass only 
>
  ...
</TouchableWithoutFeedback>

setModal 永远不会收到有效的图像密钥,因此 data[imageKey] 未定义,您无法访问未定义值的 urls 属性,因为它不是对象。

您还将错误的布尔值传递给模式中“关闭”按钮中的处理程序。

<Modal
  ...
  visible={modalVisible}
  ...
>
  ...
  <Text
    style={styles.text}
    onPress={() => { setModal(true) }} // <-- true sets modalVisible true
  >
    Close
  </Text>
  ...

解决方案

当您想为visible 参数打开模态传递true,为imageKey 参数打开key

<TouchableWithoutFeedback
  key={key}
  onPress={() => setModal(true, key)} // <-- pass true and index key 
>
  ...
</TouchableWithoutFeedback>

当您想要关闭 false 的模态传递 visible 参数时。这里的关键是无关紧要的,因为您没有在处理程序中使用它访问任何内容并将模态图像状态设置回null

<Modal
  ...
  visible={modalVisible}
  ...
>
  ...
  <Text
    style={styles.text}
    onPress={() => setModal(false)} // <-- false sets modalVisible false
  >
    Close
  </Text>
  ...

【讨论】:

  • 你解释的很清楚。我似乎已经修复了错误,但是当我想创建模式窗口时调用 onPress 不起作用。这里我尝试申请cancel const [modalVisible, setModalVisible] = useState(false)。但它不能正常工作。但是当 const [modalVisible, setModalVisible] = useState() 打开一个模态窗口但不加载图像数据时 [imageKey] .urls.raw. 不渲染图片。嗯
猜你喜欢
  • 2023-03-30
  • 2021-04-09
  • 2016-09-25
  • 2020-09-28
  • 2021-01-06
  • 2020-06-11
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多