许多关于Apollo如何涉及
的例子<Mutation
mutation={YOUR_MUTATION}
update={(cache, { data }) => {
// do stuff to update Apollo store
}}
>
{ mutate => ( <UI mutate={mutate} /> ) }
</Mutation>
这两条规则在ESLint规则和实践中都存在冲突。我们也知道JSX props should not use .bind() - how to avoid using bind? JSX道具在每个渲染上实例化新箭头函数都不是好习惯。
update
处理程序?update
道具的正确方法是什么?答案 0 :(得分:0)
在调用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 :(得分:0)
这里的问题是每个组件重新渲染的新处理程序,它会影响性能并导致子级重新渲染。
我认为你应该使用以下方法之一:
1)如果不需要
中的类上下文,则将函数解压缩到模块全局constconst 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>
}
}