AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79597219
Accepted
Isaiah Desrosiers
Isaiah Desrosiers
Asked: 2025-04-29 04:07:05 +0800 CST2025-04-29 04:07:05 +0800 CST 2025-04-29 04:07:05 +0800 CST

Existe algum comportamento useEffect e useState que explique por que apenas uma dessas instâncias funciona?

  • 772

Estou usando useEffectpara buscar dados. Esses dados são passados ​​para um estado e, em seguida, usados ​​como prop para um componente renderizar/preencher adequadamente. Aqui está o código que funciona:

const [projects, setProjects] = useState([]);

useEffect(() => {
  const q = query(collection(db, "projects"), orderBy("update", "desc"));
  const unsubscribe = onSnapshot(q, (QuerySnapshot) => {
    const fetched = [];
    QuerySnapshot.forEach((doc) => {
      fetched.push({ ...doc.data(), id: doc.id });
    });
    const sortedProjects = fetched.sort((a, b) => a.update - b.update);
    setProjects(sortedProjects);
  });
  return () => unsubscribe;
}, []);

O código acima busca os dados corretamente e os passa para um componente que, por sua vez, usa o map para exibir uma lista dos projetos. Para simplificar, eu queria ver se conseguiria fazer o mesmo com os dados do currículo. Aqui está o código para isso:

const [edu, setEducation] = useState([]);

useEffect(() => {
  const q = query(
    collection(db, "resume/resume/education"),
    orderBy("startDate")
  );
  const unsubscribe = onSnapshot(q, (QuerySnapshot) => {
    const fetched = [];
    QuerySnapshot.forEach((doc) => {
      fetched.push({ ...doc.data(), id: doc.id });
    });
    const sortedEdu = fetched.sort(
      (a, b) => a.startDate.nanoseconds - b.startDate.nanoseconds
    );
    setEducation(sortedEdu);
  });
  return () => unsubscribe;
}, []);

Este, por algum motivo, não funciona. Verifiquei se os dados estão sendo recuperados (e estão), e o useEffecte useStateparecem estar funcionando como deveriam. Até adicionei um login no componente e, de fato, os dados aparecem dessa extremidade, mas ainda estou recebendo um erro de mapa, dizendo que o array está indefinido e impedindo a renderização do React. Também sei que esses componentes funcionam quando tento inserir dados diretamente. O que pode estar acontecendo para causar isso?

Eu literalmente copiei e colei os valores e, em seguida, ajustei, e ainda tenho o mesmo problema. Para esclarecer, aqui está o componente em questão:

export const ResumeItemLister = ({ items, sectionTitle }) => {
  return (
    <div>
      <h2 className="text-xl text-left">{sectionTitle}</h2>
      <hr />
      <table>
        {items.map(({ title, location, date, bullets }) => (
          <tr className="pt-10">
            <div className="grid grid-cols-3">
              <td className="text-left">{date}</td>
              <td className="col-span-2">
                <div className="text-left">
                  {title ? (
                    <p>
                      <bold className="font-bold">{title}</bold>, {location}
                    </p>
                  ) : (
                    <p>{location}</p>
                  )}
                  <ul>
                    {bullets.map((text) => (
                      <li className="list-disc list-inside"> {text}</li>
                    ))}
                  </ul>
                </div>
                <br />
              </td>
            </div>
          </tr>
        ))}
      </table>
    </div>
  );
};

Isso funciona, desde que eu defina explicitamente os itens no componente pai. Usando o estado obtido, no entanto, obtenho:

Uncaught TypeError: Cannot read properties of undefined (reading 'map')

Entendo que isso significa que itens não estão definidos, mas, como mencionado, não é o caso. Qualquer ajuda é muito apreciada.

javascript
  • 1 1 respostas
  • 67 Views

1 respostas

  • Voted
  1. Best Answer
    Drew Reese
    2025-04-29T04:23:43+08:002025-04-29T04:23:43+08:00

    Você tem alguns arrays mapeados em ResumeItemLister. O primeiro é a itemspropriedade principal, que, como você verificou, é um array definido, e o segundo é uma bulletspropriedade de cada itemselemento do item mapeado.

    Geralmente, você vai querer garantir que seu código proteja contra acessos "acidentais" em referências potencialmente indefinidas.

    Exemplos:

    • Usando ?.o operador de encadeamento opcional ( )

      {bullets?.map((text) => (
        <li className="list-disc list-inside">{text}</li>
      ))}
      
    • Usando a cláusula de guarda convencional

      {bullets && bullets.map((text) => (
        <li className="list-disc list-inside">{text}</li>
      ))}
      

    Eu provavelmente sugeriria renderizar a lista não ordenada somente se item.bulletsela existir e tiver itens de lista para renderizar:

    {!!bullets?.length && (
      <ul>
        {bullets.map((text) => (
          <li className="list-disc list-inside">{text}</li>
        ))}
      </ul>
    )}
    

    Código completo:

    export const ResumeItemLister = ({ items, sectionTitle }) => {
      return (
        <div>
          <h2 className="text-xl text-left">{sectionTitle}</h2>
          <hr />
          <table>
            {items.map(({ title, location, date, bullets }) => (
              <tr className="pt-10">
                <div className="grid grid-cols-3">
                  <td className="text-left">{date}</td>
                  <td className="col-span-2">
                    <div className="text-left">
                      {title ? (
                        <p>
                          <bold className="font-bold">{title}</bold>, {location}
                        </p>
                      ) : (
                        <p>{location}</p>
                      )}
                      {!!bullets?.length && (
                        <ul>
                          {bullets.map((text) => (
                            <li className="list-disc list-inside">{text}</li>
                          ))}
                        </ul>
                      )}
                    </div>
                    <br />
                  </td>
                </div>
              </tr>
            ))}
          </table>
        </div>
      );
    };
    
    • 1

relate perguntas

  • classificação de mesclagem não está funcionando - código Javascript: não é possível encontrar o erro mesmo após a depuração

  • método select.remove() funciona estranho [fechado]

  • Sempre um 401 res em useOpenWeather () - react-open-weather lib [duplicado]

  • O elemento de entrada não possui atributo somente leitura, mas os campos ainda não podem ser editados [fechado]

  • Como editar o raio do primeiro nó de um RadialTree D3.js?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve