javascript - 反应:元素类型无效:需要一个字符串(对于内置组件)
问题描述
我正在用 React 和 Sanity 构建一个博客,到目前为止一切都很好,但是现在当我尝试为每个博客添加 SinglePost 页面时,代码很好,但是当我转到帖子并单击时,我被重定向到 SinglePost 页面并得到了这个错误。
错误:元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记从定义组件的文件中导出组件,或者您可能混淆了默认导入和命名导入。
检查SinglePost
. ▶ 22 个堆栈帧被折叠。(匿名函数)src/components/SinglePost.js:31
错误我得到 https://i.stack.imgur.com/qfEF4.jpg
我的单个帖子组件看起来像这样
import React , { useState, useEffect }from "react";
import { useParams } from 'react-router-dom'
import sanityClient from "../client.js"
import imageUrlBuilder from "@sanity/image-url";
import { BlockContent } from "@sanity/block-content-to-react"
const builder = imageUrlBuilder(sanityClient);
function urlFor(source) {
return builder.image(source)
}
export default function SinglePost() {
const [singlePost, setSinglePost] = useState(null);
const { slug } = useParams();
useEffect(() => {
sanityClient.fetch(`*[slug.current == "${slug}"] {
title,
_id,
slug,
mainImage{
asset->{
_id,
url
}
},
body,
"name": author->name,
"authorImage": author->image
}`)
.then((data) => setSinglePost(data[0]))
.catch(console.error);
}, [slug]);
if (!singlePost) return <div>Loading....</div>
return (
<main className="bg-gray-200 min-h-screen p-12">
<article className="container shadow-lg mx-auto bg-green-100 rounded-lg">
<header className="relative">
<div className="absolute h-full w-full flex items-center justify-center p-8">
<div className="bg-white bg-opacity-75 rounded p-12">
<h1 className="cursive text-3xl lg:text-6xl mb-4">
{singlePost.title}
</h1>
<div className="flex justify-center text-gray-800">
<img src={urlFor(singlePost.authorImage).url()}
alt={singlePost.name}
className="w-10 h-10 rounded-full"
/>
<p className="cursive flex items-center pl-2 text-2xl">
{singlePost.name}
</p>
</div>
</div>
</div>
<img src={singlePost.mainImage.asset.url}
alt={singlePost.title}
className="w-full object-cover rounded-t"
style={{height: "400px"}}
/>
</header>
<div className="px-16 lg:px-48 py-12 lg:py-20 prose lg:prose-xl max-w-full">
<BlockContent blocks={singlePost.body} projectId="abmvfbq5" dataset="production"/>
</div>
</article>
</main>
)
}
我现在没有发现代码有任何问题,任何人都可以通过查看错误来帮助我并告诉我有什么问题吗?谢谢
解决方案
我在代码中看到两件事暗示了一个问题。没有看到你client.js
很难说。
useEffect(() => {
// string interpolation for ${slug} needs to be surrounded by ticks and not double string quotations
sanityClient.fetch(`*[slug.current == "${slug}"] {
title,
_id,
slug,
mainImage{
asset->{
_id,
url
}
},
body,
"name": author->name,
"authorImage": author->image
}`) <----- did you mean to send an entire function as an argument?
.then((data) => setSinglePost(data[0]))
.catch(console.error);
}, [slug]);
推荐阅读
- weblogic - 如何重新格式化 v$session.osuser?
- android - 存储与实体相同类型类型的列表
- ruby - 通过 ruby 脚本执行 Google Apps 脚本(`check_status': notFound: 未找到请求的实体。(Google::Apis::ClientError)
- c# - 我应该在 Xamarin 多平台应用程序中使用什么来制作滚动列表?
- reactjs - SortBy 功能不会按 asc 或 desc 对产品进行排序
- javascript - 如何修复:“来自提取的未定义响应”Javascript
- vue.js - 在开发模式下构建时指定资产输出目录
- python - 使用来自文件 excel 序列项 0 中的数组数据的 nltk 进行错误标记:预期的 str 实例,找到列表
- css - CSS font-face - 何时使用多个 src 描述符
- c# - .NET Core Difference between Hosted Service and Singleton Service