- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 react-router-dom
构建一个 React 应用程序并从我的 Django Rest Framework 后端获取数据,一旦数据被获取,我导航到另一个链接,数据保存到 window
并在内部保存 inside state 被删除。我如何在客户端中保存这些数据?
代码如下:
路由器
import React, { Component } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import AuthHeader from './authheader';
import { BlogData, BlogDetail } from '../components/blog';
export default class AuthRouter extends Component {
constructor(props) {
super(props);
this.state = {
isLoggedIn: false,
authtoken: '',
}
}
handler = (token) => {
this.setState({
isLoggedIn: true,
authtoken: token,
})
}
/**
* ! Render the Route props inside of the
* ! BlogData component
*/
render () {
return (
<Router>
<div>
{/* <Header /> */}
{/* <Route path='/home' exact component={WrappedHorizontalLoginForm} /> */}
{/* <Route path='/about' exact component={AuthHeader} /> */}
<AuthHeader
action={this.handler}
token={this.state.isLoggedIn && this.state.authtoken}
/>
<Route
path='/blog'
exact
render={(props) => <BlogData {...props}
token={this.state.isLoggedIn && this.state.authtoken}
/>} />
<Route
path='/blog/:id'
exact
render={(props) => <BlogDetail {...props}
token={this.state.isLoggedIn && this.state.authtoken}
/>} />
</div>
</Router>
);
}
}
Authheader
组件最终将 props 传递给 LoginFormOrUserComponent
:
import React, { Component } from 'react';
import axios from 'axios';
import Button from 'react-bootstrap/Button';
import Form from 'react-bootstrap/Form';
import { localhost, authtoken } from '../backendUrlConstants';
import Col from 'react-bootstrap/Col';
export default class LoginFormOrUserComponent extends Component {
constructor(props) {
super(props);
this.state = {
isLoggedIn: false,
authtoken: null,
username: '',
password: '',
}
// if (this.props.token) {
// this.setState({ authtoken: this.props.token })
// this.setState({ isLoggedIn: true })
// }
}
// componentDidMount (props) {
// if (this.props.token) {
// this.setState({ authtoken: this.props.token })
// this.setState({ isLoggedIn: true })
// }
// }
passAuthTokenToParentClass = () => {
const { authtoken } = this.state;
if (authtoken) {
this.props.action(authtoken)
}
}
handleUsernameChange = (e) => {
this.setState({ username: e.target.value })
}
handlePasswordChange = (e) => {
this.setState({ password: e.target.value })
}
handleSubmit = (e) => {
console.log(e)
const username = this.state.username;
const password = this.state.password;
axios.post(`${localhost}${authtoken}`, { username, password })
.then(res => {
this.setState({ authtoken: res.data.token })
this.setState({ isLoggedIn: true })
this.passAuthTokenToParentClass()
})
// TODO: Catch the error if the username and password
// TODO: are incorrect.
}
renderLoginFormOrUserComponent = () => {
if (this.state.isLoggedIn === false) {
return <Form className="mr-auto" >
<Form.Row>
<Col xs={4}>
<Form.Control placeholder="Username" onChange={this.handleUsernameChange} />
</Col>
<Col xs={4}>
<Form.Control placeholder="Password" onChange={this.handlePasswordChange} />
</Col>
</Form.Row>
<Button variant="dark" onClick={this.handleSubmit} >Submit</Button>
</Form>
}
return <Button variant="dark" >Account</Button>
}
render () {
return (
this.renderLoginFormOrUserComponent()
);
}
}
下面是 BlogData
和 BlogDetail
组件:
import React, { Component } from 'react';
import axios from 'axios';
import { localhost } from '../backendUrlConstants';
import { Link } from 'react-router-dom';
import { Card } from 'react-bootstrap';
export class BlogData extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
}
}
getUrl () {
return this.props.location.pathname
}
componentDidMount () {
const uri = this.getUrl()
axios.get(`${localhost}${uri}`)
.then(res => {
const data = res.data;
this.setState({ data })
})
}
render () {
return (
<ul>
{this.state.data.map(
data => <li key={data.id} >
<Link to={`/blog/${data.id}`} >{data.url}</Link>
</li>
)}
</ul>
)
}
}
export class BlogDetail extends BlogData {
constructor(props) {
super(props)
this.state = {
blogObject: {}
}
}
componentDidMount () {
const uri = this.getUrl()
axios.get(`${localhost}${uri}`)
.then(res => {
const data = res.data;
this.setState({ blogObject: data })
})
}
render () {
const { blogObject } = this.state;
return (
<Card style={{ width: "18rem" }} >
<Card.Img variant="top" src={blogObject.blog_picture_context} />
<Card.Body>
<Card.Title>{blogObject.blog_name}</Card.Title>
<Card.Text>{blogObject.blog_post}</Card.Text>
</Card.Body>
</Card>
)
}
}
此外,这里的上下文是我的本地主机 Django 服务器的 url:
export const localhost = 'http://127.0.0.1:8000';
export const login = '/api-auth/login/';
export const authtoken = '/authtoken/';
一旦我从后端获取数据,一旦我导航到另一个页面,我就会丢失它。显然我在这里缺少一些东西。
最佳答案
使用 Hook ,您可以在导航到通常会刷新状态的新 URL/链接时轻松传递数据。无需使用本地存储或类似的东西。
例如,我有一个管理仪表板,其中包含用户的嵌套路由,我希望用户的 url 成为用户 id,我想将用户 id 传递给新 url 并能够在其中使用它新组件。
我的嵌套路由文件如下所示:
import React from 'react';
import { Index, SignIn, SignUp } from '../onepirate/';
import { Admin, Event, CheckoutPath, Profile, Tickets, CheckoutComplete } from '../screens/';
import AdminDashboard from '../components/admin/AdminDashboard';
import UserAccount from '../screens/admin/user-components/UserAccount'
import Users from '../screens/admin/Users';
const adminRoutes = {
"/dashboard": () => <AdminDashboard />,
"/events": () => <Event />,
"/users": () => <Users />,
"/users/:userId": ({ userId }) => <UserAccount userId={userId} />,
}
export default adminRoutes;
如您所见,我从/users 组件传递用户 ID,并将其作为属性通过路由发送。同时,用户 ID 将动态地包含在 URL 中。
然后将路由器导入到应该处理路由的组件中:
import { useRoutes, useRedirect, navigate } from 'hookrouter';
export default function Admin() {
// this function allows your to redirect from one URL to another
useRedirect('/admin', '/admin/dashboard');
return (
<main className={classes.content}>
<Container>
{router}
</Container>
</main>
</div>
);
}
然后作为示例从我的用户组件导航到 users/:userID
import { useRoutes, useRedirect, navigate } from 'hookrouter';
const User = props => {
const classes = useStyles();
return (
<Container>
<Paper className={classes.root}>
<TextField
id="outlined-search"
label="Search field"
type="search"
className={classes.textField}
margin="normal"
variant="outlined"
onChange={props.search}
/>
<Table className={classes.table}>
<TableHead className={classes.tableHead}>
<TableRow className={classes.tableHead}>
<TableCell className={classes.tableHead} align="">Id</TableCell>
<TableCell className={classes.tableHead} align="">Email</TableCell>
<TableCell className={classes.tableHead} align="">First Name</TableCell>
<TableCell className={classes.tableHead} align="">Last Name</TableCell>
<TableCell className={classes.tableHead} align="">Info</TableCell>
</TableRow>
</TableHead>
<TableBody>
{props.data.map((user, index) => (
<TableRow key={index}>
<TableCell align="right">{user.id}</TableCell>
<TableCell align="right">{user.email}</TableCell>
<TableCell align="right">{user.firstname}</TableCell>
<TableCell align="right">{user.lastname}</TableCell>
// be sure to pass the user id in the navigate() function
<TableCell><AccountBoxIcon onClick={() => (navigate("/admin/users/" + user.id))}></AccountBoxIcon></TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Paper>
</Container>
)
}
export default User;
然后在 UserAccount 组件中链接到我们的路由文件并将用户 ID 传递给,我们可以看到控制台传递的数据将 props 记录在 useEffect(组件将挂载等效) Hook 中。
//用户帐户组件:
useEffect(() => {
// userId we sent as prop through route
console.log(props.userId);
// ... do cool things
}, []);
关于javascript - react 路由器 : Data fetched using axios doesn't save when navigating to new route,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58907665/
我正在尝试将我的 xcode 应用程序存档到 Itunes,但我得到了 following errors : 1.) “配置文件不支持推送通知。” 2.) “配置文件不包含 aps-environme
我正在尝试为我们的组织构建一个 Web 应用程序,它将使用我们的 O365 进行身份验证。在尝试使用管理员帐户连接到域时,我遇到了这个错误,其中提到 admin..onmicrosoft.com(全局
当我尝试构建 MUAI 项目时,它给出错误“该项目不知道如何运行配置文件 sample.WinUI”。项目已构建但无法运行。我使用的是 Visual Studio 2022 Preview(17.0
当某项包含在列表中时,有一个查询要搜索,但当某项不在列表中时,则没有查询。 此查询查找在给定列表 cdiffnums 中没有 ContactNum 的 customer 对象。我该怎么做才能仅返回此列
我们有一个黑盒第三方 Java 程序,可以从某个位置获取输入文件并制作 PDF。每次输入时,它都会将 list 文件放在同一位置,这需要我们以受控方式提供文件。 list (或 .xen/.que)是
我看到这个has选择器,hasnt 选择器在哪里?我想查找不包含图像的表格。 最佳答案 类似$("table:not(:has(img))")? 关于jQuery: "Doesn' t 有“选择器?,
为什么?这让我发疯??? $(document).ready(function () { $('#slides1').bxSlider({ prev_
我是 kubernetes 的新手。 我无法使用 kubectl 进行部署,但我可以在 kubernetes 仪表板上看到所有部署。我该如何解决这个问题? user@master:~$ kubectl
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 6 年前。 HTML JS
我有两个数组,一个包含字符串值,另一个包含整数值,尽管这可能很愚蠢,但我陷入了困境,我需要一点帮助,我想遍历两者,如果 arr1 包含 arr2 中不存在的项目,它将被推送到 newArray 这是我
我一直在尝试为我的网站安装一个 PHP 脚本,设置所有内容,通过脚本附带的 phpMyAdmin 导入 SQL 文件,但我面对的是一个空白页面,错误如下所示: File /home/user/publ
我正在努力将站点的服务器从 PHP 5.2.17 升级到 5.5,以使其在未来的升级中保持新鲜,并安装其他需要 PHP 5.4+ 的软件。 数据库有一个我正在测试的表,其中有许多列在初始 INSERT
我一直收到这个错误: Object doesn't support this property or method 每当我在 IE7 和 IE8 中运行我的代码时。这是它停止的代码: _renderU
我想使用正则表达式排除某些单词。 输入文本: aaa1234 cc bbb1234 c1234 cc dd aacc cccc ccadf cc 输出文本: aaa1234 bbb1234 c1234
我有一个名为 adjust_status 的存储函数和一个包含 status 列的表 users。 select adjust_status(status) as adjusted_status
我有一个表,其中有一列由插入前触发器填充,该列设置为 NOT NULL 并且没有DEFAULT VALUE。 当我执行 INSERT TABLE 而不传递此列时,我收到错误:1364 - Field
这个问题已经有答案了: Modify the value of each textfield based on original value using jQuery (3 个回答) 已关闭去年。 使
我正在阅读 this , 它说 @keyframes rules don't cascade, so animations never derive keyframes from more than
编辑:我解决了问题,请参阅答案中的链接。 我正在使用 XMLHttpRequest AJAX API 将来自不同网站的数据发送到我们在 PythonAnywhere 中的服务器。奇怪的事情发生了:根据
我已经阅读了 Linux 调用 dlopen() 和 dlsym() 的文档,它们分别打开一个动态库并在库中加载一个符号。 这些调用似乎等同于 Windows 的 LoadLibrary() 和 Ge
我是一名优秀的程序员,十分优秀!