Reactjs 使用已记忆的React组件重新绘制组件时出错
这是我的导航栏组件。导出一个备忘录Reactjs 使用已记忆的React组件重新绘制组件时出错,reactjs,react-memo,Reactjs,React Memo,这是我的导航栏组件。导出一个备忘录 import * as PropTypes from 'prop-types'; import Style from './Navbar.module.scss'; import NavbarItem from './NavbarItem'; import React from 'react'; /** * @param items * @param type */ export default function Navbar({ items }) {
import * as PropTypes from 'prop-types';
import Style from './Navbar.module.scss';
import NavbarItem from './NavbarItem';
import React from 'react';
/**
* @param items
* @param type
*/
export default function Navbar({ items }) {
return (
<nav className={Style.main}>
{items.map((item, i) => (
<NavbarItem name={item.name} url={item.url} items={item.items} key={item.name + i} />
))}
</nav>
);
}
export const MemoizedNavbar = React.memo(Navbar, true);
Navbar.propTypes = {
items: PropTypes.array.isRequired,
type: PropTypes.string,
};
import*作为“道具类型”中的道具类型;
从“/Navbar.module.scss”导入样式;
从“./NavbarItem”导入NavbarItem;
从“React”导入React;
/**
*@param项目
*@param类型
*/
导出默认函数导航栏({items}){
返回(
{items.map((item,i)=>(
))}
);
}
export const MemoizedNavbar=React.memo(Navbar,true);
Navbar.propTypes={
项目:需要PropTypes.array.isRequired,
类型:PropTypes.string,
};
使用导航栏的标题
import React, { Fragment, useContext } from 'react';
import Logo from './Logo';
import { MemoizedNavbar } from '../Navbar/Navbar';
import Style from './Header.module.scss';
import { ListContext } from '../../lib/Context/ListContext';
import BrandsHelper from '../../lib/List/BrandsHelper';
import { Items } from '../../config/SiteNavbar';
import Svg from '../Utils/svg';
const {useState} = require("react");
export default function Header({ brand }) {
const [lists, setLists] = useContext(ListContext);
const listData = lists.lists[lists.currentListId];
const [hamburgerMenuOpen, setHamburgerMenuOpen] = useState(false);
const handleHamburgerClick = () => {
setHamburgerMenuOpen(!hamburgerMenuOpen);
}
return (
<header className={Style.header}>
<section className={Style.section}>
<Logo brand={brandName} />
<MemoizedNavbar items={Items} />
<button className={Style.hamburgerButton} aria-label="Menu" onClick={handleHamburgerClick}>
<span className={Style.hamburgerButtonClickable} />
</button>
</section>
</header>
);
}
import React,{Fragment,useContext}来自'React';
从“./Logo”导入徽标;
从“../Navbar/Navbar”导入{MemoizedNavbar};
从“./Header.module.scss”导入样式;
从“../../lib/Context/ListContext”导入{ListContext};
从“../../lib/List/BrandsHelper”导入BrandsHelper;
从“../../config/SiteNavbar”导入{Items};
从“../Utils/Svg”导入Svg;
const{useState}=require(“react”);
导出默认函数头({brand}){
const[lists,setLists]=useContext(ListContext);
const listData=lists.lists[lists.currentListId];
const[HamburgerMinuOpen,setHamburgerMinuOpen]=useState(false);
常量handleHamburgerClick=()=>{
设置HamburgerMinuOpen(!HamburgerMinuOpen);
}
返回(
);
}
单击HambugerButton时,出现以下错误:
如果我不使用memonized组件,它就工作得很好
有什么不对劲吗
export const MemoizedNavbar = React.memo(Navbar, true);
第二个参数应该是一个函数,如:
function areEqual(prevProps, nextProps) {
/*
return true if passing nextProps to render would return
the same result as passing prevProps to render,
otherwise return false
*/
}
如果你不需要做任何特别的事情,只需要放弃第二个参数,然后做一个肤浅的比较
export const MemoizedNavbar = React.memo(Navbar);
谢谢我得到了
真的不是一个函数
,现在我明白它从哪里来了哈哈。我只想返回true,因为不需要比较任何东西,因为它们是静态数据。所以我认为比较它们只是浪费时间,可以做React.memo(Navbar,()=>true)代码>然后