【问题标题】:TypeError: Cannot read property after refresh or after manipulationTypeError:刷新或操作后无法读取属性
【发布时间】:2020-06-01 14:26:34
【问题描述】:

刷新后,有时在初始项目运行时出现以下错误:

TypeError: 无法读取未定义的属性“语句”

这真的很令人困惑,因为数据渲染得很好,似乎连接失败了。知道可能导致错误的原因吗?

删除statements.map 时没有其他错误

我使用这篇中型文章来启动并运行所有内容:Medium Article

index.js:

import React, { useState, useReducer } from 'react'
import { useQuery } from '@apollo/react-hooks'

// Custom layout
import Layout from "../components/layout"

import '../sass/styles.scss'

// Data Query
import STATEMENTS_QUERY from '../graphql/statements'

function StatementCall(context) {

  const { loading, error, data } = useQuery(STATEMENTS_QUERY, {});

  return (
    <Layout>
      <div className="container">
        <div className="row spaces">
          <div className="col-md-12">
            <p>Testing</p>
            {data.statements.data.map((statement, index) => (
              <div>
                <p>{statement.id}</p>
                <p>{statement.title}</p>
              </div>
            ))}
          </div>
        </div>
      </div>
    </Layout>
  )
}

export default StatementCall

graphql/statements.js:

import gql from 'graphql-tag';

const STATEMENTS_QUERY = gql`
  query {
      statements(filter: {destination: 1991}) {
        data {
          id
          title
          body
        }
      }
    }
`;

export default STATEMENTS_QUERY;

【问题讨论】:

  • 可能是因为api没有返回数据
  • 您可以在尝试渲染结果之前检查结果是否正在加载,例如if (loading) return &lt;p&gt;Loading ...&lt;/p&gt;;From the useQuery docs
  • @segFault 有趣的是我将它添加到函数中,它现在可以工作了,刷新时它不会中断

标签: javascript reactjs graphql next.js


【解决方案1】:

您可以在尝试渲染结果之前检查结果是否正在加载。

例子:

function StatementCall(context) {

  const { loading, error, data } = useQuery(STATEMENTS_QUERY, {});

  if (loading) {
    return <p>Loading...</p>;
  }

  if (error) {
    // Handle error?
    return <p>{error}</p>;
  }

  return (
    <Layout>
      <div className="container">
        <div className="row spaces">
          <div className="col-md-12">
            <p>Testing</p>
            {data.statements.data.map((statement, index) => (
              <div>
                <p>{statement.id}</p>
                <p>{statement.title}</p>
              </div>
            ))}
          </div>
        </div>
      </div>
    </Layout>
  )
}

检查example in useQuery docs

【讨论】:

  • 我认为这种方法的一个问题是它在加载时会显示什么?也许是 || (Foo>) 结构在最后显示以防万一会修复它。此外,也许不是检查加载,也许更简单的方法是 {data.statements && data.statements.data.map(... 所以它根本不会在测试标签之后显示任何数据。
猜你喜欢
  • 2021-06-13
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 2022-06-16
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多