如何更改状态 属性 的值?
How to change th value of a state property?
我正在制作一个获取数据的小应用程序,显示在 DOM 中,并选择一个显示所选用户信息的项目,我通过名为 UserState 的状态管理器处理所有这些,其中我还添加了显示用户的方法。然后作为一个组件,我有 UserList 和 UserProfile。
这是应该如何工作,捕获 1
UserState.js
import React, {useState} from 'react';
import UserContext from './UserContext';
import axios from 'axios';
function UserState(props) {
const initialState = {
users:[],
selectedUser:null
}
const [state, setState] = useState(initialState)
const getUsers = async() =>{
const res = await axios.get("https://reqres.in/api/users")
const data = res.data.data
setState({users:data,
selectedUser:null})
}
const getProfile = async (id) => {
const res = await axios.get("https://reqres.in/api/users/"+id)
const {data} = await res.data;
console.log('Item Selected:',data)
console.log(setState({selectedUser:data}))
}
return (
<UserContext.Provider
value={{
users:state.users,
selectedUser: state.selectedUser,
getUsers,
getProfile
}}
>
{props.children}
</UserContext.Provider>
)
}
export default UserState
我通过 Hook useContext 导出 That state 及其方法,当我尝试选择用户时问题开始,控制台显示以下错误。
UserList.js
import React,{useContext,useEffect} from 'react'
import UserContext from "../context/User/UserContext"
function UserList(props) {
const userContext = useContext(UserContext)
useEffect(() => {
userContext.getUsers();
},[])
return (
<div>
<h1>UserList</h1>
{userContext.users.map(user=>{
return(
<a
key={user.id}
href="#!"
onClick={()=> userContext.getProfile(user.id)}
>
<img src={user.avatar} alt="" width="70"/>
<p>{user.first_name} {user.last_name}</p>
<p>{user.email}</p>
</a>)
}): null}
</div>
)
}
export default UserList
Profile.js
import React,{useContext} from 'react'
import UserContext from '../context/User/UserContext'
function Profile() {
const {selectedUser} = useContext(UserContext)
return (
<>
<h1>Profile</h1>
{selectedUser ?
(
<div>
<h1>Selected Profile</h1>
{/* <img
src={selectedUser.avatar}
alt=""
style={{width:150}}
/> */}
</div>
):(<div>
No User Selected
</div>)}
</>
)
}
export default Profile
控制台错误
我尝试更改 selectedUser 的值,但每次控制台都显示该错误。
在你的 getProfile 函数中,你应该像那样使用 setState。
setState({...state, selectedUser:data })
如果您使用 setState({selectedUser:data })
,则 users
将从状态中删除。
您的代码的异步部分似乎有问题。最初,您没有 state.users
对象,因此当您尝试在像 {userContext.users.map(user=>{...
这样的行中使用 state.users
对象的属性时,没有要映射的内容,并且由于映射使用长度 属性,你得到了那个错误。在尝试映射之前,您应该首先检查该组件是否具有 userContext.users
属性 并且长度是否大于或等于 1。
您使用 useState
挂钩的方式也有点奇怪,这让事情有点混乱。通常在使用 useState
钩子时,每个元素都有自己的状态,而不是设置一个状态来处理多个元素。在这一个中,您将设置两个单独的状态,一个称为 users
和一个称为 selectedUser
并独立设置它们。否则你可能会有一些奇怪的重新渲染。
顺便说一句,React 错误代码非常具有描述性。它告诉您 state.users
未定义,它无法访问未定义的 属性 映射,并且它位于 UserList.js 组件的第 13 行。所有这些都是真的。
我正在制作一个获取数据的小应用程序,显示在 DOM 中,并选择一个显示所选用户信息的项目,我通过名为 UserState 的状态管理器处理所有这些,其中我还添加了显示用户的方法。然后作为一个组件,我有 UserList 和 UserProfile。
这是应该如何工作,捕获 1
UserState.js
import React, {useState} from 'react';
import UserContext from './UserContext';
import axios from 'axios';
function UserState(props) {
const initialState = {
users:[],
selectedUser:null
}
const [state, setState] = useState(initialState)
const getUsers = async() =>{
const res = await axios.get("https://reqres.in/api/users")
const data = res.data.data
setState({users:data,
selectedUser:null})
}
const getProfile = async (id) => {
const res = await axios.get("https://reqres.in/api/users/"+id)
const {data} = await res.data;
console.log('Item Selected:',data)
console.log(setState({selectedUser:data}))
}
return (
<UserContext.Provider
value={{
users:state.users,
selectedUser: state.selectedUser,
getUsers,
getProfile
}}
>
{props.children}
</UserContext.Provider>
)
}
export default UserState
我通过 Hook useContext 导出 That state 及其方法,当我尝试选择用户时问题开始,控制台显示以下错误。
UserList.js
import React,{useContext,useEffect} from 'react'
import UserContext from "../context/User/UserContext"
function UserList(props) {
const userContext = useContext(UserContext)
useEffect(() => {
userContext.getUsers();
},[])
return (
<div>
<h1>UserList</h1>
{userContext.users.map(user=>{
return(
<a
key={user.id}
href="#!"
onClick={()=> userContext.getProfile(user.id)}
>
<img src={user.avatar} alt="" width="70"/>
<p>{user.first_name} {user.last_name}</p>
<p>{user.email}</p>
</a>)
}): null}
</div>
)
}
export default UserList
Profile.js
import React,{useContext} from 'react'
import UserContext from '../context/User/UserContext'
function Profile() {
const {selectedUser} = useContext(UserContext)
return (
<>
<h1>Profile</h1>
{selectedUser ?
(
<div>
<h1>Selected Profile</h1>
{/* <img
src={selectedUser.avatar}
alt=""
style={{width:150}}
/> */}
</div>
):(<div>
No User Selected
</div>)}
</>
)
}
export default Profile
控制台错误
我尝试更改 selectedUser 的值,但每次控制台都显示该错误。
在你的 getProfile 函数中,你应该像那样使用 setState。
setState({...state, selectedUser:data })
如果您使用 setState({selectedUser:data })
,则 users
将从状态中删除。
您的代码的异步部分似乎有问题。最初,您没有 state.users
对象,因此当您尝试在像 {userContext.users.map(user=>{...
这样的行中使用 state.users
对象的属性时,没有要映射的内容,并且由于映射使用长度 属性,你得到了那个错误。在尝试映射之前,您应该首先检查该组件是否具有 userContext.users
属性 并且长度是否大于或等于 1。
您使用 useState
挂钩的方式也有点奇怪,这让事情有点混乱。通常在使用 useState
钩子时,每个元素都有自己的状态,而不是设置一个状态来处理多个元素。在这一个中,您将设置两个单独的状态,一个称为 users
和一个称为 selectedUser
并独立设置它们。否则你可能会有一些奇怪的重新渲染。
顺便说一句,React 错误代码非常具有描述性。它告诉您 state.users
未定义,它无法访问未定义的 属性 映射,并且它位于 UserList.js 组件的第 13 行。所有这些都是真的。