React/Apollo fetchMore 正在重新加载整个页面
React/Apollo fetchMore reloading the whole page
我在尝试为我的网络应用程序上的数据列表执行分页/获取更多按钮时遇到问题。我的问题是,当我单击 fetchMore 按钮时,整个页面正在重新加载,老派风格,而我只想重新加载 'calculs' 的更新列表而不是查询的其余部分(用户...... ).
有没有办法限制 fetchMore 后更新的内容?不希望整个 DOM 被重新渲染。
我也试过发送一个特定的查询,只反映了我需要的,但我也遇到了错误。
这里是需要的代码部分:
export const query = gql`
query UserAndData($limit: Int!) {
user {
_id,
nom,
prenom,
email,
isAdmin
}
adminCalculations {
_id,
lastUpdated,
comments
}
adminUsers {
_id,
lastConnect,
nom,
prenom,
email,
societe
}
calculs(limit: $limit) {
_id,
userId,
date,
duration,
user {
email
}
}
count
}
`
class Admin extends Component {
state = {
limit : 100,
}
render() {
return(
<Query query={query} variables={{ limit : this.state.limit}} fetchPolicy="cache-and-network">
{({ loading, error, data, fetchMore }) => {
if (loading) return <p>Loading...</p>;
if (error) return <p>Error</p>;
console.log(data);
if (!data || (!data.user || !data.user.isAdmin)){
return (<Redirect to="/" />)
}
return(
<div className="admin">
(lot of coding and rendering users list, calculs lists, etc...)
<div className="bouton" onClick={() => {
fetchMore({
variables : { limit : this.state.limit + 100 },
updateQuery : (prev, { fetchMoreResult }) => {
if (!fetchMoreResult) return prev;
return Object.assign({}, prev, { calculs :
fetchMoreResult.calculs });
}
})
this.setState({ limit : this.state.limit + 100 })
}
}>Charger plus de calculs</div>
</div>
</div>
</div>
</div>
)
}}
</Query>
)
}
}
export default Admin;
实际上,我发现问题与我的查询有关。当我查询我的组件所需的全部数据时,我有一个
if(loading)
语句,每次刷新时整个页面都在重新加载,因此整个页面都呈现
<p>Loading...</p>
即使加载时间非常短 -> 这导致我的整个页面 "refreshed"
为了解决这个问题,我创建了一个子组件,其中还包含一个 Apollo 查询组件,但只包含我想要重新获取的查询。包含用户、adminCalculations 和 adminUsers 查询的父组件不会毫无意义地刷新,只有需要的子查询会重新获取和重新呈现。
我在尝试为我的网络应用程序上的数据列表执行分页/获取更多按钮时遇到问题。我的问题是,当我单击 fetchMore 按钮时,整个页面正在重新加载,老派风格,而我只想重新加载 'calculs' 的更新列表而不是查询的其余部分(用户...... ).
有没有办法限制 fetchMore 后更新的内容?不希望整个 DOM 被重新渲染。
我也试过发送一个特定的查询,只反映了我需要的,但我也遇到了错误。
这里是需要的代码部分:
export const query = gql`
query UserAndData($limit: Int!) {
user {
_id,
nom,
prenom,
email,
isAdmin
}
adminCalculations {
_id,
lastUpdated,
comments
}
adminUsers {
_id,
lastConnect,
nom,
prenom,
email,
societe
}
calculs(limit: $limit) {
_id,
userId,
date,
duration,
user {
email
}
}
count
}
`
class Admin extends Component {
state = {
limit : 100,
}
render() {
return(
<Query query={query} variables={{ limit : this.state.limit}} fetchPolicy="cache-and-network">
{({ loading, error, data, fetchMore }) => {
if (loading) return <p>Loading...</p>;
if (error) return <p>Error</p>;
console.log(data);
if (!data || (!data.user || !data.user.isAdmin)){
return (<Redirect to="/" />)
}
return(
<div className="admin">
(lot of coding and rendering users list, calculs lists, etc...)
<div className="bouton" onClick={() => {
fetchMore({
variables : { limit : this.state.limit + 100 },
updateQuery : (prev, { fetchMoreResult }) => {
if (!fetchMoreResult) return prev;
return Object.assign({}, prev, { calculs :
fetchMoreResult.calculs });
}
})
this.setState({ limit : this.state.limit + 100 })
}
}>Charger plus de calculs</div>
</div>
</div>
</div>
</div>
)
}}
</Query>
)
}
}
export default Admin;
实际上,我发现问题与我的查询有关。当我查询我的组件所需的全部数据时,我有一个
if(loading)
语句,每次刷新时整个页面都在重新加载,因此整个页面都呈现
<p>Loading...</p>
即使加载时间非常短 -> 这导致我的整个页面 "refreshed"
为了解决这个问题,我创建了一个子组件,其中还包含一个 Apollo 查询组件,但只包含我想要重新获取的查询。包含用户、adminCalculations 和 adminUsers 查询的父组件不会毫无意义地刷新,只有需要的子查询会重新获取和重新呈现。