【问题标题】:Can't loop throught State on React JS with map() method无法使用 map() 方法在 React JS 上循环状态
【发布时间】:2021-07-18 07:01:45
【问题描述】:

我在通过带有对象的数组进行映射时遇到问题,我找不到问题所在,但我认为它是因为异步,但我希望你看看它。

我收到两条错误消息,我不知道它们是否相关:

  1. TypeError: Cannot read property 'map' of null
  2. 1 Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
import {useState, useEffect} from 'react';

// import styled from 'styled-components';

export default function Admin() {
    const [quotes, setQuotes] = useState(null);

    const get_all_quotes = async () => {
        const {data, error} = await supabase
            .from('quotes_en')
            .select('quote')
        console.log(data);
        if (error) console.table(error)
        setQuotes(data)
    }
    useEffect(() => {
        get_all_quotes()
    }, [])

    return (
        <div>
{quotes.map(({id, quote}) => {
                        return <p key={id}>{quote}</p>
                    })
                    }
        </div>
    )
}

【问题讨论】:

  • quotes 初始状态为null,无法映射。 session 是什么?
  • 是的会话是检查是否有人登录,但这没关系,我删除它谢谢
  • @DrewReese 那么解决方法和方法是什么?
  • 如果状态未完成,我喜欢提前返回。例如。 if (!quotes) return (&lt;div&gt;Loading...&lt;/div&gt;); return (.....。如果不需要加载指示器,也可以只返回 null,因此在这里保持初始状态为 null 是合乎逻辑的。
  • 我喜欢提前返回有几个原因,1. 使用空数组仍然会导致无意义的渲染,2. 如果您确实想要实现加载指示器,它会很好而且很干净。 3. 使用 null 您还可以免费获得更多状态 jnfo,这里的空默认数组打破了这一点。

标签: javascript reactjs use-state


【解决方案1】:

问题

初始quotes状态值为null,因此无法映射。

const [quotes, setQuotes] = useState(null);

解决方案

提供有效的初始状态,我建议使用空数组 ([])。

const [quotes, setQuotes] = useState([]);

现在您将拥有可以映射到初始渲染的有效quotes 状态。 Array.prototype.map 可以安全地处理空数组。

{quotes.map(({id, quote}) => {
  return <p key={id}>{quote}</p>
})}

【讨论】:

    【解决方案2】:

    正如@DrewReese 所说,您可以将 state 的初始值设置为空数组,也可以选择有条件地显示引号:

        {quotes && quotes.map(({id, quote}) => {
            return <p key={id}>{quote}</p>
        })
    

    这段代码的作用是检查引号是否有任何值,如果只有,它将调用 quotes.map() 函数。

    更新: 我们还可以使用可选链,它比条件链更具可读性(如上所示的短路)。

    {quotes?.map(({id, quote}) => {
         return <p key={id}>{quote}</p>
     })
    

    上面的代码所做的是检查是否有引号,如果只有引号,它会调用 map 函数。如果 "quotes" 未定义,或者为 null 或任何其他虚假值,它将返回虚假值并停止执行。

    这些解决方案的优点是,即使在任何情况下,引号都没有数组,它也不会导致任何问题,但不会执行该代码。 感谢@DrewReese 提供此解决方案。

    【讨论】:

    • 可选链也可以,即quotes?.map(.....)
    • 是的...可选链接比短路更具可读性。谢谢(你的)信息。我会更新我的解决方案。
    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多