【问题标题】:Initially fetch data and pass props to another component最初获取数据并将道具传递给另一个组件
【发布时间】:2020-03-19 00:59:15
【问题描述】:

老实说,我已经为此困惑了一个多星期。我已经从头到尾阅读了 Next.js 文档,并在网上搜索了几个小时。我显然遗漏了一些东西,如果有人可以看一下,我将不胜感激。

加载 Index.js 时,它会(通过)express 向我的数据库发送一个请求,并返回一个 json 响应。目的是让我的 ProductList 组件将此响应(已通过道具传递给它) .map() 到我的个人产品中。

使用下面的代码,当我最初加载另一个页面然后链接到它的客户端时,我可以让我的 index.js 呈现产品。但是,如果我最初加载此页面,我无法让 Index.js 加载我的产品。

[Json 浏览量][1] [1]:https://i.stack.imgur.com/3c6hf.png

index.js

import React from 'react'
import NavBar from '../components/Navbar/Navbar';
import fetch from 'isomorphic-unfetch';

import '../styles/styles.css';

import ProductList from '../components/ProductList/ProductList';

const Index = (props) => {

    return (
        <div>
            <NavBar />
            <h1>Products</h1>
            <ProductList products={props.products} />

        </div>
    );
};

Index.getInitialProps = async () => {

    const res = await fetch('http://localhost:3000/');
    const data = await res.json()
    return {products: data}

}

export default Index;

ProductList.js

import ProductTile from '../ProductTile/ProductTile';

class ProductList extends React.Component {
    render(){
        return(
            <div className = "md:flex">

            {
                this.props.products.map(product => {
                    return (
                    <Link href={`/product?product_ID=${product.product_ID}`}>
                    <a><ProductTile product = {product} key={product.product_ID}/></a>
                    </Link>
                )})

            }

            </div>
        )
    }
}

export default ProductList;

server.js

const express = require('express');
const next = require('next');

require('dotenv').config()

const port = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

const cors = require('cors');
const bodyParser = require('body-parser');
const morgan = require('morgan');

const pool = require('../lib/db');

//routers
const productsRouter = require('./routes/products');
const usersRouter = require('./routes/users');


app.prepare().then(() => {
  const server = express()
  server.use(cors());
  server.use(morgan('dev'));
  server.use(bodyParser.json());

  server.get('/', (req, res, next) => {
    pool.query('SELECT * FROM products', function (error, results, fields) {
      if (error) throw error;
      //console.log(results);
      res.send(results);
    });
  })

/* Routers for product router and user router here

*/

  server.use((err, req, res, next) => {
    if (!err.status) {
      err.status = 500;
    }
    res.status(err.status).send(err.message);
  });

  server.listen(port, err => {
    if (err) throw err
    console.log(`> Ready on http://localhost:${port}`)
  })
})

【问题讨论】:

  • 控制台没有错误吗?在getInitialProps 中记录data 会记录什么?您是否正确查看了终端中的日志(因为它是服务器渲染的)?
  • 你是否安装了 React Dev Tools 浏览器扩展,这样你就可以检查你的组件的 props 了?
  • 嘿@yachaka,感谢您的回复。 1.我收到以下错误:“警告:列表中的每个孩子都应该有一个唯一的“关键”道具。”,如果我 SSR 一个辅助页面(“/cart”)然后回到主页(“/” )。但是,因为如果我直接去家(“/”),什么都不会呈现,所以我没有收到这个错误。
  • @yachaka 是的,我有 React 开发工具,并且道具正在正确传递(据我所知),而且我有不同的键。
  • 关于子键的警告是因为您将key 属性放在&lt;ProductTile /&gt; 组件上,但您应该将其放在&lt;Link /&gt; 组件上(最外层)

标签: javascript reactjs e-commerce next.js


【解决方案1】:

嗯...根据您的server.js,我会说它来自这个。 index.js 在哪个文件夹中?它响应哪条路线?最终,它可能会出现在您的路由器代码中。

您是否看到请求进入并记录在您的服务器中?你能把它记录在你的index.js服务器路由中吗?

【讨论】:

  • Index.js 在 pages 文件夹中。我认为你已经援引了合理化。可能是因为我的获取请求与我的根页面位于同一端点。因此,当加载初始页面时,在 next.js 发送模块客户端之前,它会看到对数据库的 get 请求,并且该 json 响应“击败”模块客户端?
  • 啊,原来如此。我将 getinitialprops 请求更改为“localhost:3000/initialproducts”,并将我的 get 请求服务器端更改为相应的端点。非常感谢伙计!我已经坚持了一周!
  • 啊,太好了,这通常很简单
猜你喜欢
  • 1970-01-01
  • 2019-04-13
  • 2020-03-22
  • 1970-01-01
  • 2019-01-31
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
相关资源
最近更新 更多