使用 memoized React 组件重新绘制组件时出错
Error in Component re draw with memoized React component
这是我的导航栏组件。导出记忆的。
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 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>
);
}
当我点击 HambugerButton 时,出现以下错误:
如果我不使用 Memoized 组件,它工作得很好。
有什么问题吗?
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
*/
}
如果您不需要做任何特别的事情,只需删除第二个参数,React 将进行浅比较。
export const MemoizedNavbar = React.memo(Navbar);
这是我的导航栏组件。导出记忆的。
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 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>
);
}
当我点击 HambugerButton 时,出现以下错误:
如果我不使用 Memoized 组件,它工作得很好。
有什么问题吗?
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
*/
}
如果您不需要做任何特别的事情,只需删除第二个参数,React 将进行浅比较。
export const MemoizedNavbar = React.memo(Navbar);