javascript - React:为什么一次只有一个 onclick 组件有效而其他组件失败?
问题描述
刚开始我的 React 学习曲线,如果我无法解释,请随时要求澄清。这个问题可能看起来很长,但这只是为了更好地理解的代码。
这是我使用路由器的 app.js,配置文件路径出现问题。
function App() {
return (
<Router>
<div className="App">
<Switch>
<Route exact path="/">
<h2>Welcome to jatin</h2>
<AnonymousUserApi />
<LoginButton />
<SignupButton />
</Route>
<Route exact path="/profile">
<Profile />
<LoginUserApi />
<History />
<LogoutButton />
</Route>
</Switch>
</div>
</Router>
);
}
一旦使用 auth0 对用户进行身份验证,用户就可以看到,但问题是如果我先单击组件,然后历史组件将不起作用,如果我先单击历史组件,loginuserAPi 组件将不起作用。
在这两个组件中,我为发送回数据的两个组件调用了不同的后端 API(它们没有问题)。
另外:- 用户可以随时点击这些组件,它们不会被使用一次。 更新:-单击第一个组件后,当我尝试单击另一个组件时,它总是显示未定义。对于第二个组件,我也看到了 cors/preflight 问题,即使在 express 中启用了 cors
我的 loginuserAPI 组件
import React, { useState } from 'react';
import { useAuth0 } from '@auth0/auth0-react';
var jwt = require('jsonwebtoken');
const LoginUserApi = () => {
const [orgURL, setorgURL] = useState('');
const [responseData, setresponseData] = useState('');
const { getAccessTokenSilently, user, isAuthenticated } = useAuth0();
let token;
const callSecureApi = async () => {
try {
token = await getAccessTokenSilently();
let decodedToken = jwt.decode(token, { complete: true });
console.log(token);
const response = await fetch(
'https://my api endpoint',
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
// sending subclaim as userId to backend Axios request!
body: JSON.stringify({
longURL: orgURL,
userId: decodedToken.payload.sub,
}),
}
);
const respData = await response.json();
console.log(respData);
setresponseData(respData.convertedURL);
console.log('jatin', responseData);
} catch (error) {
alert(error.error);
}
};
const submit = (e) => {
e.preventDefault();
console.log('clicked');
if (!orgURL) {
alert('URL cannot be empty');
}
};
return (
<div className="container">
<form onSubmit={submit}>
<div className="mb-3">
<label htmlFor="title">Enter your URL</label>
<input
type="text"
value={orgURL}
onChange={(e) => {
setorgURL(e.target.value);
}}
className="form-control"
id="title"
aria-describedby="emailHelp"
placeholder="Enter Your URL"
/>
</div>
<button
type="submit"
onClick={callSecureApi}
className="btn btm-sm btn-success"
>
Trimify
</button>
</form>
{orgURL && (
<div className="mt-5">
<h6 className="muted">Result</h6>
<div className="container-fluid">
<div className="row">
<p>{responseData}</p>
</div>
</div>
</div>
)}
</div>
);
};
export default LoginUserApi;
我的历史组件。
import React, { useState } from 'react';
import { useAuth0 } from '@auth0/auth0-react';
var jwt = require('jsonwebtoken');
const History = () => {
const [historyOfUser, setHistory] = useState([]);
const { getAccessTokenSilently, user, isAuthenticated } = useAuth0();
let token;
const callHistoryApi = async () => {
try {
token = await getAccessTokenSilently();
let decodedToken = jwt.decode(token, { complete: true });
console.log(token);
const response = await fetch(
'https://history-enpoint-api',
{
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ userId: decodedToken.payload.sub }),
}
);
const respData = await response.json();
console.log(respData);
setHistory(respData.URLS);
console.log('jatin', historyOfUser);
} catch (error) {
alert(error.error);
}
};
return (
<>
<button onClick={callHistoryApi} className="btn btm-sm btn-success">
History
</button>
<div>
{historyOfUser.map((history) => <div key={history.originalURL}>{history.converted}</div> )}
</div>
</>
);
};
export default History;
简而言之,从后端获取数据的多个组件如何共存?
解决方案
当您作为在后端调用 api 的前端做出反应时,如果 api 正在缓存响应,则会出现这种情况。
如果 api 是受保护的 API,它需要某种对特定资源的排他性权限,那么如果 API 正在缓存它对另一个资源的响应,它将导致错误
推荐阅读
- excel - 如何遍历每个切片器项目,但不包括那些没有数据的项目 - 在 VBA 中?
- linux - 如何使用 sed 将字符串替换为数字?
- node.js - 如何使用 nodemailer 从 squirrelmail 发送邮件?
- java - 一项活动可以失去其意图附加功能吗?
- wordpress - Wordpress 和 ACF 插件 - 帖子编辑器停止工作/崩溃
- c++ - 从串行到 omp:没有加速
- node.js - Twilio 需要什么样的 Twiml XML 来进行基本的双向调用?
- .htaccess - 重定向时如何在源 URL 上排除尾部斜杠?
- r - 将图形和表格链接到多个输入的问题
- python - Python 自动从 Anaconda Notebook 下载文件