javascript - 如何使用 React 在 Next.js 中导出 const 值?
问题描述
我正在尝试将一个从 BlogPost.jsconst
调用的值导出views
到 blog.js。
这是BlogPost.js
import React from 'react';
import useSWR from 'swr';
import format from 'comma-number';
import {
useColorMode,
Heading,
Text,
Flex,
Box,
Badge,
Link,
Tooltip
} from '@chakra-ui/react';
import fetcher from '../lib/fetcher';
const BlogPost = (frontMatter) => {
const {
title,
modality,
summary,
image,
brand,
lastPublishedOn,
firstCreatedOn
} = frontMatter;
const { colorMode } = useColorMode();
const secondaryTextColor = {
light: 'gray.700',
dark: 'gray.400'
};
const slug = frontMatter.__resourcePath
.replace('Blog\\', '')
.replace('.mdx', '');
const { data } = useSWR(`/api/page-views?id=${slug}`, fetcher);
const views = data?.total;
//console.log('views ', views); //This is the one I am trying to export.
return (
<>
<Flex
width="100%"
align="flex-start"
justifyContent="space-between"
flexDirection={['column', 'row']}
>
<Box alignItems="flex-start" mt={4} ml={0} mb={2}>
...
</Box>
</Flex>
<Flex width="100%" align="flex-start" justifyContent="flex-start">
<Box alignItems="flex-start" mb={12}>
...
</Box>
</Flex>
</>
);
};
//export {views}; //IF I did this here, I get `Export 'views' is not defined ERROR.`
export default BlogPost;
然后,在 中blog.js
,我做到了;
import BlogPost, {views} from '../components/BlogPost';
但是,这会引发'Export 'views' is not defined` 错误。
你能帮忙重写一下吗?目标是获取views
const 中可用的值blog.js
,而不是使用这种语法或任何东西。
谢谢。
解决方案
我需要注意的是,用代码示例回答这个问题并不能帮助您提高开发技能。因为组件结构看起来不正确。这就是为什么您在将数据传递到外部时遇到问题的原因。
这种用法对我来说看起来并不干净。该views
值是动态值。所以,分享它exporting
是没有意义的。而且,这个BlogPost
组件是为显示帖子或获取它们而设计的,还是两者兼而有之?我认为您需要将使用分开来获得更清洁的解决方案BlogsRoute
,例如小时候:BlogPosts
. 我将调用端点BlogsRoute
,将数据传递给BlogPosts
并仅渲染它,最后,我可以views
在任何我想要的地方共享。
我假设您试图将views
数据导出到BlogPost
. (如果不是,我的意思是,如果您试图将这些views
数据传递给不相关的路由或组件,您应该选择像 ReactContext 或 Redux 这样的数据存储,这是另一个需要回答的问题)
示例 1:
const BlogPostsRoute = () => {
const { data } = useSWR(`/api/page-views?id=${slug}`, fetcher);
// use data.total as whatever you want here
...
// now, BlogPost only get views data from outside and doesn't need to control/export data
return <BlogPost views={data ? data.total : []}/>
}
另一种解决方案可能是将回调函数传递给BlogPost
组件onViewsFetched
,并在 onSuccess 之后调用它。我相信 SWR 应该有一个onSuccess
功能作为选项。
示例 2:
const BlogPost = (frontMatter) => {
const { onViewsFetched /*, other props... */ } = frontMatter;
...
const { data } = useSWR(`/api/page-views?id=${slug}`, fetcher, { onSuccess: onViewsFetched });
最后,您可以BlogPost
在父组件中再次使用:
const BlogPostsRoute = () => {
return <BlogPost onViewsFetched={(data, key, config) => {
// this is the place you can use data?.total
...
} />
}
推荐阅读
- makefile - OpenWRT。Makefile 目标模式不包含“%”
- python - Ev3dev Python 更改 LineLeader Sensormode
- linux - 在 Google Cloud Shell 中自定义环境
- javascript - JavaScript html5 视频
- gradle - 如何从 Gradle 中的私有 Gitlab Maven 项目注册表存储库声明依赖项?
- java - 不使用 Docker 命令将文件从主机复制到 Docker 容器
- asp.net-mvc - ASP MVC - “个人帐户身份验证”项目数据库存储在哪里?
- webhooks - Zapier WebHook 从 CloudCMA 获取信息
- python - 如何根据两列在熊猫数据框中自定义排序?
- javascript - 如何在非单页面中的页面Vue之间共享数据