Рендеринг реквизита, аполлона и JSX реквизита с функциями стрелок
Многие примеры того, как Аполлон включает в себя что-то вроде
<Mutation
mutation={YOUR_MUTATION}
update={(cache, { data }) => {
// do stuff to update Apollo store
}}
>
{ mutate => ( <UI mutate={mutate} /> ) }
</Mutation>
Эти два правила противоречат правилам ESLint, а также на практике. Мы также знаем, что реквизиты JSX не должны использовать.bind() - как избежать использования bind? JSX поддерживает создание новых функций стрелок на каждом рендере, это не очень хорошая практика.
- Как / где ты пишешь свой
update
обработчики? - Если цель состоит в том, чтобы сделать как можно больше "чистых" функций, как правильно прикрепить обработчик к
update
подпирать?
2 ответа
Создайте функцию обновления в компоненте, который вызывает Mutation
составная часть. Вот так:
class Root extends React.Component {
update = (cache, { data }) => {
// do stuff to update Apollo store
};
render() {
return (
<Mutation
mutation={YOUR_MUTATION}
update={this.update}
>
{mutate => (<UI mutate={mutate} />)}
</Mutation>
)
}
}
Таким образом, вы не создаете новую функцию при каждом рендеринге, только когда Root
компонент смонтирован.
РЕДАКТИРОВАТЬ:
Если update
это чистая функция, вы можете поместить ее вне объявления класса.
Проблема здесь заключается в новом обработчике каждого компонента повторного рендеринга, который может повлиять на производительность и привести к каскадному повторному рендерингу дочерних элементов.
Я думаю, что вы должны использовать один из следующих подходов:
1) Извлеките свою функцию в модуль global const, если внутри класса не нужен контекст
const handler = () => {//asdfasdf}
const component = () => {
return <Mutation
mutation={YOUR_MUTATION}
update={handler}
>
{ handler ) }
</Mutation>
}
2) Класс со стрелками
class Component extends React.Component {
update = (u) => this.props.update;
render () {
return <Mutation
mutation={YOUR_MUTATION}
update={this.update}
>
{ etc... }
</Mutation>
}
}