【问题标题】:Gatsby React query GraphQLGatsby React 查询 GraphQL
【发布时间】:2020-03-23 04:16:28
【问题描述】:

我正在尝试帮助正在构建一些结合GatsbyStrapi 的网站的朋友。我对两者都没有经验......

它是用 React 制作的前端,它用 GraphQL 调用后端。

他有两个组成部分:<EstateSearch><FeaturedEstates><EstateSearch> 应该从后端获取数据,然后过滤并水合<FeaturedEstates> 组件。

通常我会使用 React Context API 来跨组件存储获取的数据,但我一直在阅读 here 可以在构建时运行时触发查询/em>。但是在their example 中,他们使用 Axios 库从外部获取数据,而不是从后端获取数据。

代码

EstateSearch.js

import React, { useRef, useState } from "react";
import { graphql } from 'gatsby';
import './style.scss';

export const query = graphql`
  query inmuebles {
    allStrapiInmuebles(filter: {dormitorios: { eq: 2}}) {
      edges {
        node {
          id
          nombre
        }
      }
    }
  }
`;

const EstateSearch = props => {
  const [ isRent, setIsRent ] = useState(true);
  const [ isSale, setIsSale ] = useState(false);
  const state = useRef('');
  const [ cities, setCities  ] = useState([]);
  const city = useRef('');
  const zone = useRef('');
  const rooms = useRef(0);
  const bathrooms = useRef(0);
  const priceFrom = useRef(0);
  const priceTo = useRef(0);

  console.log(props.data);

  return (
    <div className="estateSearch">
      <h3>Estate Search</h3>
      <form onSubmit={submitForm}>
        <button
          type="button"
          className={`rentButton ${!!isRent ? 'activeButton' : ''}`}
          onClick={e => handleButton('rent')}
        >Alquiler</button>
        <button
          type="button"
          className={`saleButton ${!!isSale ? 'activeButton' : ''}`}
          onClick={e => handleButton('sale')}
        >Venta</button>

        <select className="city" ref={zone}>
          ...
        </select>

        <select className="city">
          <option value="" >Lorem</option>
          <option value="">Ipsum</option>
        </select>

        <select name="city" className="city" ref={city}>
          <option value="" >City</option>
          <option value="">Lorem</option>
        </select>

        <div className="rooms">
          <input type="number" name="rooms" min="0" placeholder="Rooms" ref={rooms} />
        </div>
        <div className="bathroom">
          <input type="number" name="bathroom" min="0" placeholder="Bathrooms" ref={bathrooms} />
        </div>
        <div className="priceFrom">
          <input type="number" name="priceFrom" min="0" placeholder="Price from" ref={priceFrom} />
        </div>
        <div className="priceTo">
          <input type="number" name="priceTo" min="0" placeholder="Price to" ref={priceTo} />
        </div>
        <div className="search">
          <input type="submit" value="Search" className="search" />
        </div>
      </form>
    </div>
  );

  function handleButton(type) {
    if (type === 'rent') {
      setIsRent(true);
      setIsSale(false);
    } else {
      setIsRent(false);
      setIsSale(true);
    }
  }

  function submitForm(e) {



    e.preventDefault();
  }
}

export default EstateSearch;

FeaturedEstates.js

import React from 'react'
import { Link, graphql } from 'gatsby'
import Layout from '../components/layout'
import Cover from '../components/Cover'
import FeaturedEstates from '../components/FeaturedEstates/featuredEstates'
import ServicesItems from '../components/ServicesItems/services'
import EstateCard from '../components/EstateCard/estateCard'

const IndexPage = ({ data }) => (
  <Layout>

    <Cover />

    <FeaturedEstates>
      {data.allStrapiInmuebles.edges.map(document => {
          const inmueble = document.node;
          let precio;
          let operacion;

          switch (inmueble.operacion) {
            case 'Alquiler':
              precio = `$${inmueble.precioAlquiler}`;
              operacion = inmueble.operacion;
              break;
            case 'Venta':
              precio = `U$S${inmueble.precioVenta}`;
              operacion = inmueble.operacion;
              break;
            default:
              precio = `$${inmueble.precioAlquiler} / U$S${inmueble.precioVenta}`;
              operacion = 'Alquiler / Venta';
          }

          return (
            <li key={document.node.id}>
                  <EstateCard 
                      key={inmueble.id}
                      imagen={inmueble.imagendestacada.publicURL}
                      rooms={inmueble.dormitorios} 
                      bathrooms={inmueble.banios}  
                      garage={inmueble.estacionamiento} 
                      area={inmueble.superficieConstruida}
                      titleBar={inmueble.nombre}
                      estateTipe={inmueble.tipo}
                      transactionTipe={operacion}
                      refCode="0178"
                      priceCard={precio}
                      Button= {<Link to={`/${inmueble.id}`}>Ver Mas</Link>}
                    />
              </li>
          );
      })}  
    </FeaturedEstates>

    <ServicesItems /> 

  </Layout>
)

export default IndexPage;

export const query = graphql`  
query IndexQuery {
  allStrapiInmuebles {
    edges {
      node {
        id
        nombre
        dormitorios
        banios
        superficieConstruida
        operacion
        tipo
        estacionamiento
        precioVenta
        precioAlquiler
        imagendestacada {
          publicURL
        }
      }
    }
  }
}

`

我想无论如何我都必须使用 Context API,但是当某些用户搜索某些内容时,我应该如何从同一个 Gatsby 服务器获取数据?任何 cmets 都表示赞赏。

【问题讨论】:

  • 这里的实际问题是什么?需要进一步澄清。语句数据中的“后端”是 GraphQL 查询的还是来自外部服务器的东西?
  • 我认为,如果您阅读整个问题,您会得到“这里的问题”。

标签: javascript reactjs graphql gatsby strapi


【解决方案1】:

您将无法在生产环境中访问 Gatsby 商店。作为静态站点生成器,它会生成静态文件 :)

如果您确实需要在运行时进行实时数据交互,您将需要像常规 React 应用程序一样查询实时服务器。

【讨论】:

  • 所以......在一个常规的 React 应用程序中,我将实现 Apollo React 来查询服务器。我还应该这样做吗?
  • 当然,任何适合您的用例的东西,我都会在构建期间使用它来采购以保持一致性。还要查看 Gatsby 文档中的仅限客户端的路由。
猜你喜欢
  • 2021-05-28
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2020-02-05
  • 2018-06-16
  • 2019-11-22
  • 2019-04-02
  • 2019-06-22
相关资源
最近更新 更多