Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “固定”;无法从不同组件的函数体内部更新组件“;使用上下文在React本机应用程序中出现警告_Javascript_Reactjs_React Native_Apollo - Fatal编程技术网

Javascript “固定”;无法从不同组件的函数体内部更新组件“;使用上下文在React本机应用程序中出现警告

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

我有一个简单的注册护士应用程序,几乎只有登录到目前为止。它使用Apollo GraphQL调用后端,并将用户令牌和名称存储在React上下文对象中。上下文对象具有user和setUser函数(在App.js中实例化)。登录屏幕在成功登录时从UserContext对象调用setUser

这一直运行良好,但今天我更新为React 16.3,并开始收到警告:

无法从其他组件的函数体内部更新组件

并列出了在收到成功响应时调用setUser函数的行

App.js使用useState跟踪用户和setUser函数,并将其放入一个对象中,以传递到UserContext中。提供程序:

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
调用,但我不知道如何设置上下文状态。(另一方面,我正在考虑将阿波罗缓存用于我的全局状态和打包上下文。)