【问题标题】:Next.js - Cannot read property 'map' of undefinedNext.js - 无法读取未定义的属性“地图”
【发布时间】:2017-05-16 06:08:23
【问题描述】:

我知道关于这个错误有很多问题,我已经完成了所有我能找到的。

我认为这可能与缺少 getInitialState 有关,但我不确定如何实现它。

我正在尝试在文件夹中创建文本文件的动态列表,通过 frontMatter 模块从文件本身中提取信息。

import React from 'react'
import frontMatter from 'front-matter'
import fs from 'fs'

import { getFileList } from '../util/utils'

export default class DList extends React.Component {
  static async getInitialProps () {

    return getFileList('./static/filecontainer/').then((files) => {
      const linkParams = files.nameList.map((fileName, i) => {
        const content = fs.readFileSync(files.pathList[i], 'utf-8')
        const meta = frontMatter(content)
        return {
          name: fileName,
          title: meta.attributes.title,
          date: meta.attributes.date,
          description: meta.attributes.description,
        }
      })
      return {
        linkParams: linkParams
      }
    })
  }

    render () {
      return (
        <div id="listContainer">
            {
              this.props.linkParams.map((el, i) => {
                return (
                  <div className="itemBlock">
                    <div id="nameBlock"><div id='tFileTitle'>{el.title}</div><div id='tFileDate'>{el.date}</div></div>
                    <div id="descriptBlock"><p className='tFileInfo'>{el.description}</p></div>
                  </div>
                )
              })
            }
        </div>
      )
    }
  }

这是getFileList 函数:

import yaml from 'js-yaml'

export async function getFileList (dirname) {
  return new Promise((resolve, reject) => {
    fs.readdir (dirname, (error, files) => {
      if (error) {
        reject(error);
      } else {
        files.reverse()
        resolve({
          pathList: files.map( el => dirname + el ),
          nameList: files.map( el => el.slice(0, -3) )
        })
      }
    })
  })
}

所以我的想法是创建一个小框来显示所有信息,然后我可以将这些信息导入到主页上它自己的 div 中。

import Header from '../components/Header'
import DList from '../components/DList'

export default () => (
  <div>
    <Header />
    <div id="contentWrap">
      <div id="leftContent"><DList /></div>
      <div id="rightContent"></div>
    </div>
  </div>
)

【问题讨论】:

  • "getFileList 函数可以在这里找到:pastebin.com/T8uCWSTk" 欢迎来到 Stack Overflow!您问题的全部内容必须在您的问题中in,而不仅仅是链接。链接腐烂,使问题及其答案对未来的人们毫无用处,人们不应该离开现场来帮助你。将minimal reproducible example 放入 问题中,最好使用 Stack Snippets(&lt;&gt; 工具栏按钮)使其可运行。更多:How do I ask a good question?(我已经把它放在你的问题中了。)
  • “Next.js - 无法读取未定义的属性 'map'” 在您的第一个引用代码块中有两次对 .map 的调用。哪一个导致错误?!
  • 所以,.map 的四个实例中哪个实例失败了

标签: javascript reactjs next.js


【解决方案1】:

您的 DList render 函数正在使用 this.props.linkParams.map。您对DList使用 只是&lt;DList /&gt;,它根本没有设置任何属性,所以this.props.linkParamsundefined。当您使用DList (&lt;DList linkParams={/*...*/} /&gt;) 时,您需要将linkParams 作为属性传递,或者如果没有linkParams 属性,则让render 处理它。

我认为这可能与缺少 getInitialState 有关

不,状态和属性是不同的东西。 state 是组件的状态,由组件管理。 props 是用户传递给组件的属性。

【讨论】:

  • 啊,所以我不能让 getFileList 在 DLink 类中创建 linkParams?
  • @AdenLaken:可以,但是您可能希望将其存储为状态,并且如果您要异步填充状态(正如我认为的那样?),您会想要render 处理它还没有this.state.linkParams 的可能性。
  • 我明白了,我将如何将其存储为状态?不知道需要多大的解释,所以如果您知道任何教程或示例,我很乐意自己尝试学习。
  • @AdenLaken:看看State and Lifecycle docs,然后是Lifting state up tutorial。 :-)
猜你喜欢
  • 2023-01-19
  • 2023-02-17
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多