React Context API,Hook 加载两次。一次没有数据,一次有数据
Posted
技术标签:
【中文标题】React Context API,Hook 加载两次。一次没有数据,一次有数据【英文标题】:React Context API, Hook loading twice. Once without the data and once with the data 【发布时间】:2020-05-15 16:02:58 【问题描述】:我正在构建一个带有烧瓶后端的内部反应应用程序,该后端将用户详细信息存储在烧瓶会话中。
我的烧瓶应用使用 ADAL 包来处理 Azure Active Directory 用户身份验证。
为了将用户详细信息输入我的 react 应用程序,我进行了 fetch 调用,并且可以毫无问题地获取数据。
在我的 react 应用程序中,我第一次尝试使用 Hooks、createContext、useContext、useState 和 UseState,由于某种原因,该应用程序看起来像是两次加载了我的标头挂钩。一次没有数据,一次有数据
我在这里创建了一个问题示例 https://codesandbox.io/s/new-react-context-api-ei92k 它在 console.log 中显示了 Header 触发了两次。
有没有办法避免这种情况?
【问题讨论】:
为避免这种情况,您的App
不应呈现AppSessionContext.Provider
,直到您在您的状态中设置user
。
那么这可能与我使用 useEffect 的方式有关吗?
我知道你已经明白了。专业提示:您不需要将返回值分配给变量,您可以在最终的return
之前只使用if (!loaded) return 'Loading'
。
感谢实现,我仍然感觉到它的渲染两次,但也许这就是它的方式
会渲染两次,自然效果是立即渲染,状态更新后再渲染。以前版本的 React 允许在初始渲染之前触发 loadUser
,但为了支持渲染后效果,它已被弃用。
【参考方案1】:
这不是问题
const App = () =>
const [user, setUser] = useState();
useEffect(() =>
loadProfile().then(user => setUser(user));
, []);
console.log(user); // you can log here
您将获得两次用户对象,因为在第一次渲染中您没有用户数据,第二次您从 loadProfile()
获得用户数据。
【讨论】:
如果您有任何疑问,请告诉我以上是关于React Context API,Hook 加载两次。一次没有数据,一次有数据的主要内容,如果未能解决你的问题,请参考以下文章
React/React Context API:使用 useEffect() 钩子时等待上下文值
使用带有 useReducer() 钩子的 React Context API 有啥优点和缺点?
React Context Hook vs 将数据直接引入组件
[React] Improve developer experience for accessing context with a custom React hook