小道具を介して受信した配列に基づいて子のコレクションをレンダリングする親コンポーネントがあります。
import React from 'react';
import PropTypes from 'prop-types';
import shortid from 'shortid';
import { Content } from 'components-lib';
import Child from '../Child';
const Parent = props => {
const { items } = props;
return (
<Content layout='vflex' padding='s'>
{items.map(parameter => (
<Child parameter={parameter} key={shortid.generate()} />
))}
</Content>
);
};
Parent.propTypes = {
items: PropTypes.array
};
export default Parent;
新しいものitem
が追加されるたびに、すべての子が再レンダリングされ、それを回避しようとしています。他の子が再レンダリングされたくないので、最後に追加された子をレンダリングしたいだけです。
だから、私は子供でReact.memoを試してみましたが、おそらくcode
プロパティか何かで比較します。問題は、等価関数が呼び出されないことです。
import React from 'react';
import PropTypes from 'prop-types';
import { Content } from 'components-lib';
const areEqual = (prevProps, nextProps) => {
console.log('passed here') // THIS IS NEVER LOGGED!!
}
const Child = props => {
const { parameter } = props;
return <Content>{parameter.code}</Content>;
};
Child.propTypes = {
parameter: PropTypes.object
};
export default React.memo(Child, areEqual);
何かアイデアはありますか?
1
小道具が変更されるまで何も記録しません。親の小道具を微調整してみてください。
—
優しいユーザー、
import `import Child from '../Child'`にエラーがあります。それが原因かどうかは不明です。
—
Afia
子コンポーネントの不要な再レンダリングを防止する場合は、それぞれに一意のキーを与える必要があります。Reactにはキーを扱う非常にデリケートな方法があり、コンポーネントのキーが変更された場合、Reactはそれを完全に再レンダリングします。毎回新しいキーを生成すると、親のプロップが変更されるたびにReactがすべてを再レンダリングします。
—
コンスタンティン
@konstantinあなたは天才です!! 鍵生成を外してみたら、魅力的でした!! :D等価fnが呼び出され、比較を行うことができました。ありがとう!! これを回答として追加して、正しいものとして投票できるようにできますか?
—
Joana Deluca Kleis
私が助けてくれてうれしい:)、今すぐ追加します
—
Konstantin