Reactjs 如何使用<;碎片>;反应

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')){ 常量配置={ 标题:{

我需要在我的React应用程序中获取当前用户的名称,因此我将数据从action/auth.js发送到Navbar.js,在Navbar中我得到了一个承诺,因此我需要用户获取数据。我设法将数据记录到console.log中。但是我不能使用它来向用户显示它。 下面是用于发送数据的my auth.js函数:

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