当前位置: 首页 > 知识库问答 >
问题:

Gatsby在运行时替换静态查询数据

叶明辉
2023-03-14

我刚来盖茨比

查询本身非常适合在构建时获取数据,并将其作为道具传递给呈现每个菜单项的菜单组件。但是,在运行时,我希望再次从数据库中提取数据,并让它更新数据,例如,如果有价格变化,等等。

我知道我可以重建整个项目,但我希望这是一个后备方案。

如何让查询将数据发送到Menu组件,然后[再次发送数据?]当DB调用完成时。

当前未按预期工作的代码:

index.jsx

import React, { useEffect } from "react"

import Layout from "../components/layout"
import SEO from "../components/seo"

import Menu from '../components/menu'
import { graphql } from "gatsby"

import firebase from "gatsby-plugin-firebase"
const IndexPage = (props) => {



  useEffect(() => {
    // use this hook to make db call and re-render menu component with most up to date data

    var db = firebase.firestore();
    let docs = []
    db.collection(`public/menu/${process.env.restaurantId}`).get().then(val => {

      val.forEach(doc => {
        docs.push({ node: doc.data() })
      });
      console.log('docs', docs)
      props.data.allMenuItem.edges = docs;  // i have no idea what i'm doing
    })


  }, [])


  return (
    <Layout>
      <SEO title="Home" />
      <Menu menuItems={props.data.allMenuItem.edges}></Menu>
    </Layout>
  )
}

// use this query for prerendering menu items
export const query = graphql`
query MyQuery   {
  allMenuItem {
    edges {
      node {
        available
        name
        group
      }
    }
  }
}
`;

export default IndexPage

共有1个答案

公良信然
2023-03-14

您不应该修改React属性;任何可以更改的值都应该是组件状态的一部分。请参见我可以在React中更新组件的道具。js?

然而,下面的代码应该可以做到这一点。创建一个状态,并将属性值作为默认值。然后在客户端加载数据后更新它。

const IndexPage = props => {
  const [menuItems, setMenuItems] = useState(props.data.allMenuItem.edges.map(({node}) => node))

  useEffect(() => {
    // use this hook to make db call and re-render menu component with most up to date data
    let db = firebase.firestore()

    db.collection(`public/menu/${process.env.restaurantId}`)
      .get()
      .then(setMenuItems)
  }, [])

  return (
    <Layout>
      <SEO title="Home" />
      <Menu menuItems={menuItems}></Menu>
    </Layout>
  )
}

请注意,我已经切换到使用您从fiRecovery获得的数据格式(没有节点),而不是盖茨比的格式,因此您需要修改您的Menu组件,以避免额外的嵌套级别(具有节点)如果使用此代码。

 类似资料:
  • 问题内容: 我想“试运行” Hibernate HQL查询。那就是我想知道Hibernate将从给定的HQL查询中执行哪些实际的SQL查询,而无需实际针对实际数据库执行HQL查询。 我可以访问表的hibernate映射,HQL查询字符串,数据库的方言。如果需要,我也可以访问数据库。 现在,如何找到Hibernate可以从HQL生成的所有SQL查询,而无需实际对任何数据库执行查询?有什么工具吗? 请

  • 问题内容: 我想“试运行” Hibernate HQL查询。那就是我想知道Hibernate从给定的HQL查询中执行什么实际的SQL查询,而无需实际对真实数据库执行HQL查询。 我可以访问表的休眠映射,HQL查询字符串,数据库的方言。如果需要,我也可以访问数据库。 现在,如何找出Hibernate可以从HQL生成的所有SQL查询,而无需实际对任何数据库执行查询呢?有什么工具吗? 请注意,可以从一个

  • 问题内容: 在我的应用程序中,我必须用自定义的QLineEdit替换所有QLineEdit元素。为此,有不同的解决方案: 修改从pyuic4生成的py文件,然后用我的一个LineEdit替换所有QLineEdit对象。该解决方案并不是真正的最佳解决方案,因为每次运行pyuic4时,我都会丢失对所做的修改,并将其保存到生成的输出文件中。 编写一个新类,在我的窗口或对话框中递归搜索QLineEdit小

  • 使用spark或任何其他大数据框架是否有更有效的方法来实现这一点?目前,我使用的是sparkSQL,数据存储在拼花格式(200GB)中

  • 我在oracle服务器上有一个错误,但我不明白为什么它不工作。我使用oracle sql developer软件。 该查询是: TestVue中的值。第2行:' 46.08 ','-46.47 ',' 1084.05 ',' 66500 ',...“测试视图”是检查返回没有空值的行的视图 当我执行查询时,总是出现一个错误,它说: ORA-01722:无效号码01722.00000-"无效号码"*原

  • 我一直在尝试一个应用程序,其中我使用AsyncTask从sqlite表中检索数据。它有时工作起来没有那么多问题。但是当它失败时,Logcat看起来像这样 07-24 16:06:20.477: E/AndroidRuntime(950): 致命异常: 异步任务 #1 07-24 16:06:20.477: E/AndroidRuntime(950): java.lang.RuntimeExcept