gpt4 book ai didi

javascript - 服务器端在 React 中使用 Next.js 加载全局组件

转载 作者:行者123 更新时间:2023-11-29 20:49:19 25 4
gpt4 key购买 nike

事实上我找不到任何人问这个问题可能意味着我没有完全理解某些东西或者我正在使用错误的关键字进行搜索所以如果这是一个问题请不要咬我的头愚蠢的问题。

我正在粘贴代码的相关部分,但如果您想要完整示例的 repo ,here it is .完整的问题将在底部。


这是我的文件夹结构:

server.js
/components
Layout.js
/pages
contact.js

server.js

// tells next which page to load
server.get("/contact/:id", (req, res) => {
const actualPage = "/contact"
const queryParams = {id: req.params.id}
app.render(req, res, actualPage, queryParams)
})

// api uri for grabbing contacts from the database
server.get("/api/contact/:id", (req, res) => {
Contact.findOne({first_name: req.params.id}, (error, contact) => {
if (error) return next(error)
res.status(200).json(contact)
})
})

pages/contact.js

const Contact = props => (
<Layout>
<h1>{props.contact.first_name} {props.contact.last_name}</h1>
</Layout>
)

// a static async call passes fetched data into the props
Contact.getInitialProps = async function (context) {
const {id} = context.query
const res = await fetch(`http://localhost:3000/api/contact/${id}`)
const contact = await res.json()
return {contact: contact}
}

components/Layout.js

const Layout = (props) =>
<div>
<div>
<Link href="/contact/John">
<a>John</a>
</Link>
<Link href="/contact/Jed">
<a>Jed</a>
</Link>
<Link href="/contact/Fred">
<a>Fred</a>
</Link>
</div>
{props.children}
</div>

我正在尝试弄清楚是否可以动态查询数据库以构建数据库中文档的导航。我能想到的唯一方法是用每个组件重新渲染整个导航,但这似乎非常不必要。同样,如果您想尝试一下代码,here's my example repo .

最佳答案

我能想到的方法之一是使用 custom app.js并添加 componentDidMount 方法(它只触发一次),您可以在其中获取所有联系人,将其存储在 app.js 状态中并将其传递给页面和组件。

_app.js

import React from 'react';
import App, { Container } from 'next/app';

export default class MyApp extends App {
static async getInitialProps({ Component, router, ctx }) {
let pageProps = {};

if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx);
}

return { pageProps };
}

// store contacts in the state
state = {
contacts: undefined
};

componentDidMount() {
// get contacts and store them in the _app.js state
fetch('some-api/all-contacts-endpoint').then(contacts => {
this.setState({ contacts });
});
}

render() {
const { Component, pageProps } = this.props;

return (
<Container>
<Component {...pageProps} contacts={this.state.contacts} />
</Container>
);
}
}

pages/contact.js

// contacts will be inside props here
const Contact = props => (
<Layout contacts={props.contacts}>
<h1>
{props.contact.first_name} {props.contact.last_name}
</h1>
</Layout>
);

// a static async call passes fetched data into the props
Contact.getInitialProps = async function(context) {
const { id } = context.query;
const res = await fetch(`http://localhost:3000/api/contact/${id}`);
const contact = await res.json();
return { contact: contact };
};

components/Layout.js

const Layout = ({ contacts = [] }) => (
<div>
<div>
{contacts.map(contact => (
<Link key={contact.id} href={`/contact/${contact.id}`}>
<a>{contact.name}</a>
</Link>
))}
</div>
{props.children}
</div>
);

希望这对您有所帮助!

关于javascript - 服务器端在 React 中使用 Next.js 加载全局组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com