<Person
...
clicked={() => this.personSelectedHandler(person.id)}
/>
Это определит новую ссылку на функцию для props.clicked
при каждом повторном рендеринге родительской функции. Это приведет к тому, что реквизиты для Person
будут меняться при каждом рендеринге, в результате чего Person
также будет повторно рендериться.
Поскольку вы не используете id
в personSelectedHandler
, вы можете просто пропустить аргумент и сохранить постоянную ссылку на функцию:
clicked={this.personSelectedHandler}
Если вам в конечном итоге понадобится контекст id
, вы можете рассмотреть возможность использования состояния родителей для достижения того, чего вы хотите, вместо этого, если вы действительно хотите избежать повторного рендеринга .
Вы также можете преобразовать Person
в (чистый) компонент класса и обработать обратный вызов из этого компонента.
Наконец, если нажатие приходит к толчку, и вы обязательно должны использовать эту встроенную функцию стрелки, вы можете переопределить функцию сравнения React.memo
, которая примерно аналогична определению componentShouldUpdate
для компонентов класса. Из документов:
function MyComponent(props) {
/* render using props */
}
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 default React.memo(MyComponent, areEqual);
Возможно, есть другой способ, которым я не знаю, как сделать эту работу, но, надеюсь, это поможет вам понять проблему, чтобы найти альтернативные решения. Здесь также есть некоторые идеи и обсуждения: Почему бы JSX-реквизитам не использовать функции стрелок или связывание?