Форматирование HTML-данных уценки в компоненте Gatsby с использованием статического запроса

Я пытаюсь отобразить html-информацию из файла уценки, используя компонент со статическим запросом в GatsbyJS. Когда я распечатываю данные, я получаю необработанный HTML с тегами.

Текущий результат

Я хотел бы отобразить заголовок уценки и текст HTML под ним.

components/contact.js

    import React from "react"
import { Link, StaticQuery, graphql } from "gatsby"

const Cont = ({ data }) => (
  <section className="home-banner">
    <h1 className="title">
      {data}
    </h1>
    <div className="description">
      {data}
    </div>
  </section>
)

export default function ContText() {
  return(
    <StaticQuery
      query={graphql`
        query MyQuery {
          markdownRemark(frontmatter: {template: {eq: "contact-page"}}) {
            html
            frontmatter {
              title
            }
          }
        }`
      }

      render={ data  => {

        return(
          <Cont

                data={data.markdownRemark.html}

          />
        )
       }
      }
    />
  )
}

Есть ли способ, которым я могу отображать заголовок и текст с помощью одного компонента, и как я могу изменить необработанный HTML на более чистые текстовые данные, как на обычных страницах.

 index-page.js

import React from "react"
import { graphql, Link } from "gatsby"
import Img from "gatsby-image"

import Layout from "../components/layout"
import BlogListHome from "../components/blog-list-home"
import SEO from "../components/seo"
import Cont from "../components/contact"

export const pageQuery = graphql`
  query HomeQuery($id: String!){
        markdownRemark(id: { eq: $id }) {
      id
      html
      frontmatter {
        title
        tagline
        featuredImage {
          childImageSharp {
            fluid(maxWidth: 480, maxHeight: 380, quality: 80, srcSetBreakpoints: [960, 1440]) {
              ...GatsbyImageSharpFluid
            }
            sizes {
              src
            }
          }
        }
        cta {
          ctaText
          ctaLink
        }
      }
    }
  }
  `

const HomePage = ({ data }) => {
  const { markdownRemark } = data // data.markdownRemark holds your post data
  const { frontmatter, html } = markdownRemark
  const Image = frontmatter.featuredImage ? frontmatter.featuredImage.childImageSharp.fluid : ""
    return (
        <Layout>
      <SEO/>
      <div className="home-banner grids col-1 sm-2">
        <div>
          <h1 class="title">{frontmatter.title}</h1>
          <p class="tagline">{frontmatter.tagline}</p>
          <div className="description" dangerouslySetInnerHTML={{__html: html}}/>
        </div>
        <div>
          {Image ? (
            <Img
              fluid={Image}
              alt={frontmatter.title + ' - Featured image'}
              className="featured-image"
            />
          ) : ""}
        </div>
      </div>
      <div>
      <Cont/>
      </div>
      <BlogListHome/>
      <div>
      <h1> Recomendations go hear!</h1>
      </div>
        </Layout>
    )
}

export default HomePage

В настоящее время я подумываю о создании двух компонентов, один для маленького противника, но не имеет значения, если я не могу изменить HTML. Спасибо всем заранее.


person Eduards Birznieks    schedule 10.08.2020    source источник


Ответы (1)


Вы правильно извлекаете свои данные. Ваш GraphQL выглядит хорошо и правильно собирает все данные из файла уценки.

Что вам не хватает, так это dangerouslySetInnerHTML в вашем HTML-теге. dangerouslySetInnerHTML - это замена React использованию innerHTML в DOM браузера. Итак, применительно к вашему коду:

<h1 className="title" dangerouslySetInnerHTML={{ __html: data }} />

Примечание: то же самое относится и к <div>. Поскольку вы ничего не оборачиваете внутри, вы можете самостоятельно закрыть свой <h1>

Именование происходит потому, что, как правило, это может быть рискованно, поскольку оно подвергает ваших пользователей атаке межсайтового скриптинга (XSS). В идеале вы должны сопоставить каждый ответ data и отобразить один или другой проанализированный тег в зависимости от него, но на данный момент, как и в 95% случаев, он будет работать, как ожидалось, без какого-либо риска для пользователей.

Дополнительную информацию можно найти в официальной документации React.

person Ferran Buireu    schedule 10.08.2020