- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚刚开始探索 React Hooks。我想创建一个 API 获取组件,将其导入另一个组件 - 以便我可以在其他组件中重用该 API 获取组件。
发生的事情是我设置了初始状态值:
API.js
import { useState, useEffect } from "react";
export const useUserFetch = () => {
const [users, setUsers] = useState({
loading: true,
error: false,
data: [],
});
然后在 useEffect 中执行异步获取:
useEffect(() => {
async function fetchUserQuery() {
await fetch('http://jsonplaceholder.typicode.com/users')
.then(response => {
console.log('API RESPONSE: ', response)
if (response.status === 200 && response.status < 400) {
response.json().then((respData) => {
setUsers({ loading: false, error: false, data: respData })
})
} else {
response.json().then(err => {
setUsers({ loading: false, error: err, data: [] })
})
}
}).catch(err => {
setUsers({ loading: false, error: err, data: [] })
})
}
fetchUserQuery()
}, [])
如果响应状态为 200(左右),则更改我的状态数组以包含响应的更新值。错误处理也一样。获取完成后,我检查并返回加载、错误和数据的值(以及控制台记录这些值):
if (users.loading) {
console.log('API LOADING: ', users.loading)
return "Loading..."
}
if (users.error) {
console.log('API ERROR: ', users.error)
return "Error..."
}
if (users.data) {
console.log('API DATA: ', users.data)
return users;
}
如您所见,最后检查的是数据,如果有数据,则控制台记录 API DATA 并返回数据。问题是,在返回数据之前,控制台输出数据显示用户数组(它有效,请参阅下面的包含控制台日志)。但是,当我将 Api.js 导入 Contacts.js 并尝试输出数据时,它仍然显示用户状态的初始值。
Contacts.js:
import { useEffect, useState } from 'react'
import { useUserFetch } from '../Api';
const Users = () => {
const [userData, setUserData] = useState(useUserFetch());
console.log('CONTACT STATE: ', userData)
useEffect(() => {
async function fetchUserState() {
const userJsonData = await userData
setUserData(userJsonData)
}
fetchUserState()
}, [])
if (userData.loading) return "Loading...";
if (userData.error) return userData.error.message
if (userData.data) return JSON.stringify(userData.data)
return true
};
export default Users
以下是控制台显示的内容(按确切顺序):
API LOADING: true
Contacts.js:7 CONTACT STATE: Loading...
Api.js:14 API RESPONSE: Response {type: "cors", url: "http://jsonplaceholder.typicode.com/users", redirected: false, status: 200, ok: true, …}
Api.js:42 API DATA: (10) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
Contacts.js:7 CONTACT STATE: Loading...
所以我的第一个问题;这是 setState 异步的问题吗?如果是这样,我该如何处理这个问题以确保当我返回用户状态时,我的 Contacts.js 获得更新的值。或者它是任一文件中我的 useEffect 中的异步?或者是其他东西?我只是想了解一下新的 Hooks,并在将来探索 Redux/MobX 或 Context API。
最佳答案
根据docs ,
How does a custom Hook get isolated state? Each call to a Hook gets isolated state. Because we call [custome hook](modified word, in docs it is a hook name from example) directly, from React’s point of view our component just calls useState and useEffect.
正如我们所知,我们可以在一个组件中多次调用 useState 和 useEffect,并且它们将完全独立。
由于状态是隔离的,因此您必须对自定义 Hook 有一个单独的引用,将其作为第二个参数传递给 useEffect
,以便正确获取状态,
const App = () => {
const [userData, setUserData] = useState(useUserFetch());
let users = useUserFetch(); //Get seperate reference
console.log('CONTACT STATE: ', userData)
useEffect(() => {
async function fetchUserState() {
const userJsonData = await users //get data
setUserData(userJsonData)
}
fetchUserState()
},[users]) //Pass as dependency
if (userData.loading) return "Loading...";
if (userData.error) return userData.error.message
if (userData.data) return JSON.stringify(userData.data)
return true
};
关于reactjs - React Hooks,setState 的更新值显示另一个组件中的初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129934/
我有一个 MvvmCross MvxSpinner在 Android 中绑定(bind)。用户选择一个值并反射(reflect)在我的属性 MealTypeSelected . 微调器允许用户选择膳
我有一个带有某种类型函数指针的公共(public)变量的表单,如下所示: {...} interface type TExternalFunction = function(var x : TAn
this question中的答案对我理解如何在 IBAction 方法中检索步进器值很有帮助(我投了赞成票),但我仍然不理解在我第一次加载 View 时如何获取步进器的初始值。 我想将初始值设置为
Apple 文档指出: The willSet and didSet observers of superclass properties are called when a property is
我正在将 ColdFusion 应用程序转换为 C#(我是 CF n00b)。 我有一个脚本执行 cfquery,然后执行 cfloop 的结果,它似乎试图将当前行与其下一行进行比较。它似乎试图确保它
我在为 antd 动态表单设置初始值时遇到问题。有什么方法可以在动态中初始化值吗?它需要使用 getFieldDecorator 注册字段。但对于动态字段,该字段之前没有注册。 我收到这个错误:不能在
是否可以动态地为 forms.FileField() 赋予初始值? 最佳答案 我不确定,如果这就是你想要的,但是…… 显然,您不能为文件输入设置初始数据(这意味着您将文件发送给用户)。 Django
我对 Django 表单中 DateTimeField 的初始值没有什么问题。 我在 forms.py 中有声明 class FaultForm(forms.ModelForm): ...
如何使用代码设置 slider 初始值?我知道如何在属性检查器中执行此操作。我想在我的应用程序启动时使用“UserDefault”作为初始值,当我的应用程序第一次启动时,我想将初始值设置为“1.0”
我有一个 RadioButton其 IsChecked 的元素属性绑定(bind)到 MyProperty在 ViewModel . Binding有模式OneWayToSource由于某些原因,它会
我有一个ViewModel类,看起来像这样: class EditUserViewModel( private val initUser: User, ) : ViewModel() {
有人可以帮我解决我的问题吗,问题是我希望我输入到文本字段的第一个初始值只是从 1 到 9 的数字,我正在使用小数垫,所以我也不希望我的初始值是小数点,但在第一个值(仅从 1 t0 9 开始的数字)之后
我正在使用 NSFetchedResultsController 从 CoreData 获取数据并加载包含四个部分的 TableView 。当应用程序第一次运行时,它可以完美地工作,将 plist 加
使用 primeNg 下拉组件,我试图用初始值初始化下拉列表,但没有成功,我使用的是响应式(Reactive)方法。 我检查了 primeNg 文档和演示 - 几乎所有示例都使用模板驱动,我希望模型驱
如何在 ASP.NET 中设置数据绑定(bind)下拉列表的初始值? 例如,我想要这些值,但要显示的第一个值应该是 -- Select One ---,且值为空。 最佳答案 我想你想做的是这样的:
我知道我不能给 BehaviorSubject一个 Observable 值,但我需要一种方法来解决这个问题。在应用程序初始化时,我正在获取当前用户(如果存在),我需要提供 BehaviorSubje
这是我在这里的第一篇文章,所以我希望它是全面的。 我正在使用 AngularJs,并且我使用 Angular 指令添加了一个 JqueryUI slider 。我找到了很多关于如何做到这一点的例子,但
如何有效地为大型数组分配一个公共(public)初始值?例如,如果我有一个 100 x 100 x 100 的整数数组,其中所有初始值都应为零。 在 matlab 中我会简单地写: array = z
我正在为 iOS 应用程序创建一个 Pebble 配套应用程序。我已经使用一些初始值设置了我的 AppSync: Tuplet initial_values[] = { TupletC
有件事我迟到了: const [object, setObject] = useState(new SomeObject()); 在这里,我们在每次重新渲染上构造一个SomeObject实例。然后,如
我是一名优秀的程序员,十分优秀!