useState对象集
我是ReactJS的新手,正在与Hooks合作。我想为对象设置状态。这是我的代码:
const StartPage = (props)=> { const [user,setUser] = useState('')
const [password,setPassword] = useState('')
const [info,setInfo] = useState({
email:''
]})
const onUserChange=(e)=>{
const user = e.target.value
setUser(user)
}
const onPasswordChange=(e)=>{
const password = e.target.value
setPassword(password)
}
const onSubmit=(e)=>{
e.preventDefault()
const myHeader = new Headers ({
'APIKey':'*****',
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*',
'Access-Control-Expose-Headers':'headers'
})
fetch(`[my_link_to_api]?username=${user}&password=${password}`,{
method:'GET',
credentials: 'omit',
headers:myHeader,
})
.then(response =>response.json())
.then(data =>{
if(data!==undefined){
setInfo({...info, data})
}
console.log(info)
})
.then(()=>{
console.log(info)
history.push({
pathname:'/dashboard',
state:info
})
})
.catch((e)=>{
console.log(e)
})
}
return (
<div>
<form onSubmit={onSubmit}>
<input type="text" placeholder="username" onChange={onUserChange}></input>
<input type="password" placeholder="password" onChange={onPasswordChange}></input>
<button>Login</button>
</form>
</div>
)
}
问题部分在这里:
我在这里声明对象的初始状态:
const [info,setInfo] = useState({ email:''
})
和这里:
.then(data =>{ if(data!==undefined){
setInfo({...info, data})
}
console.log(info)
})
它只是不工作。它不会设置信息和数据永不写入。如何将接收到的数据分配给该信息(因为控制台已记录并接收到该数据)?
回答:
setInfo
是异步的,在下一次渲染之前您不会看到更新后的状态,因此在执行此操作时:
if(data!==undefined){ setInfo({...info, data })
}
console.log(info)
您会info
状态更新 看到。
您可以使用useEffect
钩子(它告诉React您的组件在渲染后需要做一些事情)来查看的新值info
:
const StartPage = props => { const [user, setUser] = useState('');
...
useEffect(() => {
console.log(info);
}, [info]);
...
}
也正如其他人指出的那样,您可能希望data
在设置状态时进行破坏:(setInfo({...info, ...data
})这完全取决于您打算如何使用它),否则状态将如下所示:
{ email: ...
data: ...
}
以上是 useState对象集 的全部内容, 来源链接: utcz.com/qa/405907.html