Javascript “固定”;无法从不同组件的函数体内部更新组件“;使用上下文在React本机应用程序中出现警告
我有一个简单的注册护士应用程序,几乎只有登录到目前为止。它使用Apollo GraphQL调用后端,并将用户令牌和名称存储在React上下文对象中。上下文对象具有user和setUser函数(在App.js中实例化)。登录屏幕在成功登录时从UserContext对象调用setUser 这一直运行良好,但今天我更新为React 16.3,并开始收到警告: 无法从其他组件的函数体内部更新组件 并列出了在收到成功响应时调用setUser函数的行 App.js使用useState跟踪用户和setUser函数,并将其放入一个对象中,以传递到UserContext中。提供程序:Javascript “固定”;无法从不同组件的函数体内部更新组件“;使用上下文在React本机应用程序中出现警告,javascript,reactjs,react-native,apollo,Javascript,Reactjs,React Native,Apollo,我有一个简单的注册护士应用程序,几乎只有登录到目前为止。它使用Apollo GraphQL调用后端,并将用户令牌和名称存储在React上下文对象中。上下文对象具有user和setUser函数(在App.js中实例化)。登录屏幕在成功登录时从UserContext对象调用setUser 这一直运行良好,但今天我更新为React 16.3,并开始收到警告: 无法从其他组件的函数体内部更新组件 并列出了在收到成功响应时调用setUser函数的行 App.js使用useState跟踪用户和setUser
export default function App(props) {
const [user, setUser] = useState(null)
const contextVal = { user: user, setUser: setUser }
return (
<ApolloProvider client={client}>
<UserContext.Provider value={contextVal}>
<View style={styles.container}>
{Platform.OS === 'ios' && <StatusBar barStyle="default" />}
<AppNavigator />
</View>
</UserContext.Provider>
</ApolloProvider>
);
}
我记得为了让这项工作正常进行,我必须在useEffect调用中包装“已经有一个用户”案例(它调用props.navigate),并且我发现其他帖子建议在useEffect中包装此代码将修复警告。但是,如果我将此代码包装在useEffect挂钩中,如下所示:
useEffect(() => {
if (data) {
setUser({
token: data.signin.token,
name: data.signin.user.name,
})
}
})
我得到一个错误而不是警告:
渲染的钩子比预期的少。这可能是由意外的提前返回语句引起的
任何帮助都将不胜感激 您需要将数据字段包括在useEffect正在使用的字段列表中:
useEffect(() => {
if (data) {
setUser({
token: data.signin.token,
name: data.signin.user.name,
})
}
}, [data])
您需要将数据字段包括在useEffect正在使用的字段列表中:
useEffect(() => {
if (data) {
setUser({
token: data.signin.token,
name: data.signin.user.name,
})
}
}, [data])
数据变量来自哪里?来自GraphQL调用返回的数据。在本例中,是用户名和令牌。数据变量来自何处?来自GraphQL调用返回的数据。在本例中,用户名和令牌。啊,是的,忘了提及这是我立即尝试的,遵循与上面的“if(user)”调用相同的模式。我得到了同样的“渲染更少的钩子”错误。我觉得这一定是一个问题,因为
setUser
来自App.js中的useState
调用,但我不知道如何设置上下文状态。(另一方面,我正在考虑将Apollo缓存用于我的全局状态和打包上下文。)啊,是的,忘了提到这是我立即尝试的,遵循与上面的“if(user)”useffect
调用相同的模式。我得到了同样的“渲染更少的钩子”错误。我觉得这一定是一个问题,因为setUser
来自App.js中的useState
调用,但我不知道如何设置上下文状态。(另一方面,我正在考虑将阿波罗缓存用于我的全局状态和打包上下文。)