我已经在这方面工作了大约两天,我将继续努力,但我想可能是时候得到一些指导了,同时我也会继续努力.这是我的第一个Reaction项目,我有点困惑.我一直在网上学习课程,我一直在学习我的导师关于通过使用函数组件解构来接收props 的例子,我一次又一次地跟踪并重写,但我总是收到错误"在props 验证中缺失".我正在使用ESLint.

我真的很喜欢编程,我不是学得最快的人,但我想知道我做错了什么.

教师的代码示例根本没有使用.props,所以我很困惑.我知道有不同的方式来接受props ,所以我特别困惑于通过解构来接受props .感谢您的指导.我参考了这些文章以及许多堆栈溢出问题:

https://www.npmjs.com/package/prop-types. https://legacy.reactjs.org/docs/components-and-props.html. 一百零二 https://dev.to/colocodes/react-class-components-vs-function-components-23m6

import PageNav from "../components/PageNav";
import "./Work.module.css";

const galleryData = [
    {
        name: "Pixel Art 1",
        description: "Blah blah blah",
        openModal: false,
    },
    {
        name: "Pixel Art 2",
        description: "Blah blah bla",
        openModal: false,
    },
    {
        name: "Pixel Art 3",
        description: "Blah bah blah",
        openModal: false,
    },
];

export default function PixelArt() {
    return (
        <main className="workPageGrid">
            <PageNav />
            <div className="galleryList">
                <GalleryList />
            </div>
        </main>
    );
}

function GalleryList() {
    const galleries = galleryData;
    console.log(galleries);

    const numGallery = galleries.length;
    console.log(numGallery);

    return (
        <main className="galleryList">
            <h2>wtf</h2>

            {numGallery > 0 ? (
                <ul className="galleries">
                    {galleries.map((gallery) => (
                        <Gallery galleryObj={gallery} key={gallery.name} />
                    ))}
                </ul>
            ) : (
                <p>fml :)</p>
            )}
        </main>
    );
}

function Gallery({ galleryObj }) {
    console.log(galleryObj);

    if (galleryObj.openModal) return null;

    return (
        <li className={`gallery ${galleryObj.openModal ? "open-modal" : ""}`}>
            {" "}
            <div>
                <h2>{galleryObj.name}</h2>
                <p>{galleryObj.description}</p>
            </div>
        </li>
    );
}

具体地说,EsLint引发的错误是:

galleryObj
galleryObj.openModal
galleryObj.name
galleryObj.description
are missing in props validation eslint(react/prop-types)

推荐答案

教师可能没有在他们的项目中使用ESLint,或者正在使用ESLint但没有配置react 规则.

如果您没有安装ESLint,则允许编译该代码,就可以很好地工作.您正在使用的ESLint规则(如react/prop-types)正试图鼓励最佳实践.

在这种情况下,该规则特别要求接受props 的每个组件都使用react props 类型功能.实际上,这是可选的.正是ESLint规则使它成为必需的,并阻止代码编译,因为它不符合该ESLint规则试图强制执行的最佳实践.

在组件上声明props 类型意味着更难误用组件,因 for each props 的数据类型(包括props 是否是可选的)在运行时由该props 类型配置进行验证.这意味着如果有人(在本例中,作为唯一的开发人员,也就是您)不正确地使用组件,他们会收到这样说的错误,而不是一些不确定的错误行为.

在你的例子中,只有Gallery组件接受prop,具体来说,它接受galleryObj prop,这是一个包含namedescriptionopenModal键的对象.前两个应该是字符串,最后一个应该是布尔值.所以我们可以这样定义prop类型:

// Add new import line
import { PropTypes } from "prop-types"; 

// ... Existing code

function Gallery({ galleryObj }) {
    console.log(galleryObj);

    if (galleryObj.openModal) return null;

    return (
        <li className={`gallery ${galleryObj.openModal ? "open-modal" : ""}`}>
            {" "}
            <div>
                <h2>{galleryObj.name}</h2>
                <p>{galleryObj.description}</p>
            </div>
        </li>
    );
}

Gallery.propTypes = {
    galleryObj: PropTypes.shape({
        name: PropTypes.string.isRequired,
        description: PropTypes.string.isRequired,
        openModal: PropTypes.bool.isRequired,
    }).isRequired,

}

注如果您还没有prop-types NPM包,则需要将其添加到您的项目依赖项中.

重要的是要补充一点,也可以考虑每个衬垫规则的权衡,并决定在您的情况下是否值得付出额外的努力(如果不值得,则将其禁用).在您是唯一的开发人员的情况下,默认规则集可能过于热心;但同时,它可能会让您从学习的Angular 了解应该考虑的事情.

Javascript相关问答推荐

JS生成具有给定数字和幻灯片计数的数组子集

如何修复内容安全策略指令脚本-SRC自身错误?

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

docx.js:如何在客户端使用文档修补程序

Rehype将hashtag呈现为URL

如何在mongoose中链接两个模型?

我们如何从一个行动中分派行动

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

如何根据当前打开的BottomTab Screeb动态加载React组件?

实现JS代码更改CSS元素

不能将空字符串传递给cy.containes()

为什么我的getAsFile()方法返回空?

使用带有HostBinding的Angular 信号来更新样式?

按什么顺序接收`storage`事件?

Docent.cloneNode(TRUE)不克隆用户输入

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

JavaScript -复制到剪贴板在Windows计算机上无效

无法使用npm install安装react-dom、react和next

未找到用于 Select 器的元素:in( puppeteer 师错误)

如何在加载页面时使锚定标记成为焦点