在将数据作为 React 中的道具发送之前需要将数据提取到数组中
Need to fetch data into array BEFORE sending it as a prop in React
我正在从 API 调用中获取用户权限。我获得权限并将它们推送到一个数组,该数组将作为道具发送到另一个组件。 fetch_permissions 函数 returns 正是我所需要的,但它似乎并没有在发送不完整数据之前等待函数完成。这是我的代码:
// src/components/NavBar.js
import React from "react";
import { useAuth0 } from "../react-auth0-spa";
import { Link } from "react-router-dom";
import AccessControl from './accessControl';
const NavBar = () => {
const { isAuthenticated, loginWithRedirect, logout, getTokenSilently } = useAuth0();
const userPermissions =[];
//fetch permissions
async function fetch_permissions(){
try {
const token = await getTokenSilently();
const response = await fetch("/permissions", {
headers: {
Authorization: `Bearer ${token}`
}
});
const permissions = await response.json();
console.log(permissions);
for (let i = 0; i < permissions.length; i++) {
let permission = permissions[i];
userPermissions.push(permission);
}
console.log(userPermissions);
} catch (error) {
console.error(error);
}
};
fetch_permissions();
return (
<div>
{/* Links to show regardless of login state */}
<Link to="/">Home</Link>
{/* Links to show when logged in */}
{isAuthenticated && (
<span>
<Link to="/profile">Profile</Link>
{console.log(userPermissions)}
<AccessControl userPermissions={userPermissions} allowedPermissions={["admin:admin"]} protectedResource={<Link to="/administration">Admin</Link>} />
<Link to="/external-api">External API</Link>
<button onClick={() => logout()}>Log out</button>
</span>
)}
{/* Show if not logged in */}
{!isAuthenticated && (
<button onClick={() => loginWithRedirect({})}>Log in</button>
)}
</div>
);
};
export default NavBar;
我知道这与 javascript 异步有关,但我想不出另一种方法来实现这一点。当页面在浏览器中加载时,控制台日志是乱序的,并且 fetch_permissions 中的数据与作为 prop 发送之前记录的数据完全不同(见附件)。我需要做什么来解决这个问题?
您需要添加两个挂钩:useState
和 useEffect
。
用 useState
初始化 userPermissions
数组。然后,在 useEffect
内,获取您的数据并使用更新程序函数更新 userPermissions
。这将触发重新渲染并将最新值传递给子组件。
您可以在此处找到更多相关信息,以及处理加载和错误状态的信息:How to fetch data with React Hooks?
const [userPermissions, setUserPermissions] = React.useState([]);
React.useEffect(() => {
async function fetchPermissions() {
try {
// ...
const permissions = response.json();
setUserPermissions(permissions);
} catch (error) {
// ...
}
}
fetchPermissions();
}, []);
我正在从 API 调用中获取用户权限。我获得权限并将它们推送到一个数组,该数组将作为道具发送到另一个组件。 fetch_permissions 函数 returns 正是我所需要的,但它似乎并没有在发送不完整数据之前等待函数完成。这是我的代码:
// src/components/NavBar.js
import React from "react";
import { useAuth0 } from "../react-auth0-spa";
import { Link } from "react-router-dom";
import AccessControl from './accessControl';
const NavBar = () => {
const { isAuthenticated, loginWithRedirect, logout, getTokenSilently } = useAuth0();
const userPermissions =[];
//fetch permissions
async function fetch_permissions(){
try {
const token = await getTokenSilently();
const response = await fetch("/permissions", {
headers: {
Authorization: `Bearer ${token}`
}
});
const permissions = await response.json();
console.log(permissions);
for (let i = 0; i < permissions.length; i++) {
let permission = permissions[i];
userPermissions.push(permission);
}
console.log(userPermissions);
} catch (error) {
console.error(error);
}
};
fetch_permissions();
return (
<div>
{/* Links to show regardless of login state */}
<Link to="/">Home</Link>
{/* Links to show when logged in */}
{isAuthenticated && (
<span>
<Link to="/profile">Profile</Link>
{console.log(userPermissions)}
<AccessControl userPermissions={userPermissions} allowedPermissions={["admin:admin"]} protectedResource={<Link to="/administration">Admin</Link>} />
<Link to="/external-api">External API</Link>
<button onClick={() => logout()}>Log out</button>
</span>
)}
{/* Show if not logged in */}
{!isAuthenticated && (
<button onClick={() => loginWithRedirect({})}>Log in</button>
)}
</div>
);
};
export default NavBar;
我知道这与 javascript 异步有关,但我想不出另一种方法来实现这一点。当页面在浏览器中加载时,控制台日志是乱序的,并且 fetch_permissions 中的数据与作为 prop 发送之前记录的数据完全不同(见附件)。我需要做什么来解决这个问题?
您需要添加两个挂钩:useState
和 useEffect
。
用 useState
初始化 userPermissions
数组。然后,在 useEffect
内,获取您的数据并使用更新程序函数更新 userPermissions
。这将触发重新渲染并将最新值传递给子组件。
您可以在此处找到更多相关信息,以及处理加载和错误状态的信息:How to fetch data with React Hooks?
const [userPermissions, setUserPermissions] = React.useState([]);
React.useEffect(() => {
async function fetchPermissions() {
try {
// ...
const permissions = response.json();
setUserPermissions(permissions);
} catch (error) {
// ...
}
}
fetchPermissions();
}, []);