React TypeError:无法读取未定义的属性“getDates”

Posted

技术标签:

【中文标题】React TypeError:无法读取未定义的属性“getDates”【英文标题】:React TypeError: Cannot read property 'getDates' of undefined 【发布时间】:2020-02-10 14:06:19 【问题描述】:

今天我决定更新我的 react 项目的依赖项,我的组件 Home 不再工作了,我实际上正在使用 apollo 客户端和 apollo react hooks,这是 mi Home 组件文件:

function Home(props) 
    const 
        loading,
        data:  getPosts: posts 
     = useQuery(FETCH_POSTS_QUERY);

    return (
        <Grid columns=3 stackable=true className=loading ? 'loading' : ''>
            <Grid.Row className='page-title'>
                <h1>Recent Posts</h1>
            </Grid.Row>
            <Grid.Row>
                user && (
                    <Grid.Column>
                        <PostForm user=user />
                    </Grid.Column>
                )
                loading ? (
                    <Loading />
                ) : (
                    posts &&
                    posts.map(post=> (
                        <Grid.Column key=post._id style= marginBottom: 20 >
                            <PostCard post=post />
                        </Grid.Column>
                    ))
                )
            </Grid.Row>
        </Grid>
    );

我在浏览器中收到此错误: “TypeError: 无法读取未定义的属性 'getPosts'”

我正在尝试用这个小代码变体来修复它:

function Home(props)
    let posts = '';
    const  user  = useContext(AuthContext);
    const  loading, data  = useQuery(FETCH_POSTS_QUERY);

    if (data) 
        posts = data.getPosts;
    

一切正常,但如果我添加一个更新阿波罗缓存的新帖子,该缓存会正确更新旧帖子和新帖子,但前端没有显示它,只显示旧帖子,直到我手动刷新页面.

编辑: 这是来自PostForm 组件的代码,我也更新了Home 组件,添加了PostForm

function PostForm(props) 
    const  values, handleChange, handleSubmit  = useForm(createPostCallback, 
        title: 'Example Title',
        body: ''
    );

    const [createPost] = useMutation(CREATE_POST_MUTATION, 
        variables: values,
        update(dataProxy, result) 
            const data = dataProxy.readQuery(
                query: FETCH_POSTS_QUERY
            );
            data.getPosts = [result.data.createPost, ...data.getPosts];
            dataProxy.writeQuery(
                query: FETCH_POSTS_QUERY,
                data
            );
            values.body = '';
        
    );

    function createPostCallback() 
        createPost();
    

知道如何解决第一个代码问题吗? 在此先感谢队友!

【问题讨论】:

useQuery 是一个承诺吗? 它是一个 Apollo-react-hook,像这样:import useQuery from '@apollo/react-hooks'; const loading, data: getDates: dates = useQuery(FETCH_POSTS_QUERY); 【参考方案1】:

我修复了将数据定义为对象时的相同错误 只是通过添加= 来更改以下代码

const 
  loading,
  data:  getPosts: posts  = 
 = useQuery(FETCH_POSTS_QUERY);

【讨论】:

【参考方案2】:

apollo 中的读写缓存查询以不可变的方式工作。为了做到这一点,你必须使用一个新变量,你正在使用数据来写入缓存。 尝试这样做:

  const [createPost] = useMutation(CREATE_POST_MUTATION, 
    variables: values,
    update (proxy, result) 
      const data = proxy.readQuery(
        query: FETCH_POSTS_QUERY
      )
      const new_post = result.data.createPost //here's the new var
      proxy.writeQuery(
        query: FETCH_POSTS_QUERY,
        data:  getPosts: [new_post, ...data.getPosts]  // here you're using that var to write the cache
      )
      values.body = ''
    
  )

【讨论】:

完美!效果如丝般顺滑,感谢您的帮助! 很高兴为您提供帮助!【参考方案3】:

我会采用您的 if 声明并将其设置在 useEffect 中,以便检查 如果数据是真实的 onLoad,那么您可以在数据更改时同步它。

const [posts, setPosts] = useState([]);
useEffect(() => 
  if (data) 
    setPosts(data.getPosts);
  
,[data])

if (posts.length === 0) 
  return <h3>No posts as of yet</h3>

【讨论】:

感谢您的回复,我已经尝试过您的建议:let posts = ''; const user = useContext(AuthContext); const loading, data = useQuery(FETCH_POSTS_QUERY); useEffect(() =&gt; if (data) posts = data.getPosts; , [data]); 但它呈现警告:"./src/Pages/Home.js 第 18:12 行:从 React Hook useEffect 内部对 'dates' 变量的赋值将在每次之后丢失渲染。” "要随着时间的推移保留该值,请将其存储在 useRef Hook 中并将可变值保留在 '.current' 属性中。否则,您可以直接在 useEffect react- 中移动此变量hooks/exhaustive-deps" 你能 console.log data.getPosts 吗?这给了你什么? 嗯,您是否尝试将其设置为本地状态而不是后变量? const [post, setPost] = useState('') 然后setPosts(data.getPosts)

以上是关于React TypeError:无法读取未定义的属性“getDates”的主要内容,如果未能解决你的问题,请参考以下文章

React - TypeError:无法读取未定义的属性“img”

TypeError:无法读取未定义的属性“长度”(React,heroku)

未处理的拒绝(TypeError):在 React 中使用 useRef 时无法读取未定义的属性(读取“值”)

React Native - TypeError:无法读取未定义的属性“干净”

TypeError:无法读取 React 未定义的属性“标题”

REACT JS:TypeError:无法读取未定义的属性“参数”