Reactjs 如何使用<;碎片>;反应
我需要在我的React应用程序中获取当前用户的名称,因此我将数据从action/auth.js发送到Navbar.js,在Navbar中我得到了一个承诺,因此我需要用户获取数据。我设法将数据记录到console.log中。但是我不能使用它来向用户显示它。 下面是用于发送数据的my auth.js函数:Reactjs 如何使用<;碎片>;反应,reactjs,asynchronous,fragment,es6-promise,dispatch,Reactjs,Asynchronous,Fragment,Es6 Promise,Dispatch,我需要在我的React应用程序中获取当前用户的名称,因此我将数据从action/auth.js发送到Navbar.js,在Navbar中我得到了一个承诺,因此我需要用户获取数据。我设法将数据记录到console.log中。但是我不能使用它来向用户显示它。 下面是用于发送数据的my auth.js函数: export const get_user_data=()=>async dispatch=>{ if(localStorage.getItem('access')){ 常量配置={ 标题:{
export const get_user_data=()=>async dispatch=>{
if(localStorage.getItem('access')){
常量配置={
标题:{
“内容类型”:“应用程序/json”,
'Authorization':`JWT${localStorage.getItem('access')}`,
“接受”:“应用程序/json”
}
};
试一试{
const res=await axios.get(`${process.env.REACT\u APP\u API\u URL}/auth/users/me/`,config);
让name=res.data.first\u name+“”+res.data.last\u name;
返回名称;
}捕捉(错误){
返回错误;
}
}否则{
返回“其他访问”
}
};代码>我看到您正在使用redux和connect连接到您的状态。
如果在此之前使用过挂钩,则可能会更短、更干净:
const Navbar = () => {
const dispatch = useDispatch()
// Instead of using connect to get state, you can use the hook useSelector:
const isAuthenticated = useSelector(state => state.auth.isAuthenticated);
// No user to begin with
const [user, setUser] = useState(null);
// This will run once when the navbar renders for the first time
useEffect(() => {
get_user_data().then(fetchedUser => setUser(fetchedUser))
}, [])
function dispatchSomeAction() {
// Fire of action to redux
dispatch({ type: "logout" })
}
return (
<Fragment>
{user !== null && (<div>{user.name}</div>)}
<div>{isAuthenticated ? <p>Authenticated!</p> : <p>Not Authenticated</p>}</div>
<button onClick={dispatchSomeAction} >I will dispatch a action to redux</button>
</Fragment>
);
};
const导航栏=()=>{
const dispatch=usedpatch()
//您可以使用钩子useSelector,而不是使用connect获取状态:
const isAuthenticated=useSelector(state=>state.auth.isAuthenticated);
//一开始没有用户
const[user,setUser]=useState(null);
//当导航栏第一次渲染时,此操作将运行一次
useffect(()=>{
get_user_data()。然后(fetchedUser=>setUser(fetchedUser))
}, [])
函数dispatchSomeAction(){
//行动之火
分派({type:“注销”})
}
返回(
{user!==null&({user.name})}
{已验证?已验证!:未验证}
我将向redux发送一个操作
);
};
如果您正在使用redux,请阅读关于redux thunk的内容。它允许您执行异步操作,如API调用,并将返回的值存储在您的状态:)我看到您正在使用redux和connect连接到您的状态。
如果在此之前使用过挂钩,则可能会更短、更干净:
const Navbar = () => {
const dispatch = useDispatch()
// Instead of using connect to get state, you can use the hook useSelector:
const isAuthenticated = useSelector(state => state.auth.isAuthenticated);
// No user to begin with
const [user, setUser] = useState(null);
// This will run once when the navbar renders for the first time
useEffect(() => {
get_user_data().then(fetchedUser => setUser(fetchedUser))
}, [])
function dispatchSomeAction() {
// Fire of action to redux
dispatch({ type: "logout" })
}
return (
<Fragment>
{user !== null && (<div>{user.name}</div>)}
<div>{isAuthenticated ? <p>Authenticated!</p> : <p>Not Authenticated</p>}</div>
<button onClick={dispatchSomeAction} >I will dispatch a action to redux</button>
</Fragment>
);
};
const导航栏=()=>{
const dispatch=usedpatch()
//您可以使用钩子useSelector,而不是使用connect获取状态:
const isAuthenticated=useSelector(state=>state.auth.isAuthenticated);
//一开始没有用户
const[user,setUser]=useState(null);
//当导航栏第一次渲染时,此操作将运行一次
useffect(()=>{
get_user_data()。然后(fetchedUser=>setUser(fetchedUser))
}, [])
函数dispatchSomeAction(){
//行动之火
分派({type:“注销”})
}
返回(
{user!==null&({user.name})}
{已验证?已验证!:未验证}
我将向redux发送一个操作
);
};
如果您正在使用redux,请阅读关于redux thunk的内容。它允许您执行异步操作,如API调用,并将返回的值存储在您的状态:)Analysis中
您得到的行为是因为您试图显示一个承诺
。您需要等待Promise
解析后才能显示它。在这里,我将使用useState
和useffect
钩子来实现我所说的行为
解决方案
首先,您需要一个状态来保存userData
。从get\u user\u data
函数中的代码中,让我们假设我们谈论的data
是用户名。此状态的默认值将是空字符串
const [name, setName] = useState('');
然后,我将创建一个useffect
钩子,使用get\u user\u data
函数填充新创建的name
状态:
useEffect(() => {
get_user_data().then((data) => {
setName(data);
});
}, []);
当获取完成时,这个钩子将获取数据并设置名称
状态
然后我们需要在需要的地方使用这个名称
状态。该组件的行为是,当我们获取用户名时,它将显示”
,但一旦数据可用,UI将显示它。综上所述,我们有:
import React, { Fragment, useState, useEffect } from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { logout, get_user_data } from '../actions/auth';
const Navbar = ({ get_user_data,logout, isAuthenticated}) => {
const [name, setName] = useState('');
useEffect(() => {
get_user_data().then((data) => {
setName(data);
});
}, []);
const guestLinks = () => (
<Fragment>
<li className='nav-item'>
<Link className='nav-link' to='/login'>לכניסה</Link>
</li>
<li className='nav-item'>
<Link className='nav-link' to='/signup'>להרשמה</Link>
</li>
</Fragment>
);
const authLinks = () => (
<Fragment>
<li className='nav-item'>
<a className='nav-link' href='#!' onClick={logout}>ליציאה</a>
</li>
<li className='nav-item'>
<Link className='nav-link' to='/homepage'>העסק שלי</Link>
</li>
{<li className='nav-item'>
<Link className='nav-link'>ברוך הבא {get_name()}</Link>
</li>}
</Fragment>
);
return (
<nav className='navbar navbar-expand-lg navbar-light bg-light' lang="he" dir="rtl">
<Link className='navbar-brand' to='/'>החשמלאי</Link>
<button
className='navbar-toggler'
type='button'
data-toggle='collapse'
data-target='#navbarNav'
aria-controls='navbarNav'
aria-expanded='false'
aria-label='Toggle navigation'
>
<span className='navbar-toggler-icon'></span>
</button>
<div className='collapse navbar-collapse' id='navbarNav'>
<ul className='navbar-nav'>
<li className='nav-item active'>
<Link className='nav-link' to='/'>עמוד הבית <span className='sr-only'>(current)</span></Link>
</li>
{isAuthenticated ? authLinks() : guestLinks()}
</ul>
</div>
</nav>
);
};
const mapStateToProps = state => ({
isAuthenticated: state.auth.isAuthenticated
});
export default connect(mapStateToProps, { logout, get_user_data })(Navbar);
import React,{Fragment,useState,useffect}来自'React';
从'react router dom'导入{Link};
从'react redux'导入{connect};
从“../actions/auth”导入{logout,获取_user_data};
const Navbar=({get_user_data,logout,isAuthenticated})=>{
const[name,setName]=useState(“”);
useffect(()=>{
获取用户数据()。然后((数据)=>{
集合名(数据);
});
}, []);
const guestLinks=()=>(
לכניסה
להרשמה
);
常量authLinks=()=>(
העסק שלי
{
ברךבא{get_name()}
}
);
返回(
החשמלאי
-
עמוהבית(当前)
{isAuthenticated?authLinks():guestLinks()}
);
};
常量mapStateToProps=状态=>({
isAuthenticated:state.auth.isAuthenticated
});
导出默认连接(mapstatetops,{logout,get_user_data})(导航栏);
分析
您得到的行为是因为您试图显示一个承诺
。您需要等待Promise
解析后才能显示它。这里我将使用useState
和useffect