javascript - React - 将用户添加到收藏夹列表
问题描述
我有一个简单的用户列表,其中包含以下 api 的一些详细信息:https ://gorest.co.in/public-api/users ,我想将选定的用户添加到收藏夹列表中。我正在使用 react-router 在页面之间导航。React 可以做到这一点,还是我还需要 Redux?
我在这里有一个完整的现场示例,其中包含用户页面和收藏夹。
下面是用户列表的代码:
import React from "react";
import axios from "axios";
import NavLinks from "./components/navLink";
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {
list: [],
addToFav: false
};
this.list = [];
}
componentDidMount() {
this.getList();
}
/* get users list */
getList = async () => {
const api =
"https://gorest.co.in/public-api/users?_format=json&access-token=3qIi1MDfD-GXqOSwEHHLH73Y3UitdaFKyVm_";
await axios
.get(api)
.then(response => {
this.list = response.data.result;
this.setState({
list: this.list
});
})
.catch(err => {
console.log(err);
});
};
addToFav = () => {
this.setState(
{
addToFav: !this.state.addToFav
},
() => console.log(this.state.addToFav)
);
};
render() {
let style = {
display: "grid",
gridTemplateColumns: "repeat(auto-fill, minmax(250px, 1fr))",
padding: "1rem",
gridGap: "1rem 1rem"
};
return (
<div>
<NavLinks />
<ul style={style}>
{this.state.list.map(user => {
return (
<li key={user.id}>
<div>
<img className="thumb" alt="" src={user._links.avatar.href} />
</div>
<div className="userInfo">
<p>
{user.first_name} {user.last_name}
</p>
</div>
<button onClick={this.addToFav}>Add to Favorites</button>
</li>
);
})}
</ul>
</div>
);
}
}
谢谢!
解决方案
这是一个有效的代码框: https ://codesandbox.io/s/brave-fire-4kd4p
这一思路几乎遵循@Chris G 提到的内容。拥有一个包含用户列表和收藏夹列表的顶级状态。然后将它们作为道具传递给各个组件。
应用程序.js
在此处而不是在 UserList 组件中点击您的 API,以防止任何不必要的重新渲染。
import React, { Component } from "react";
import UserList from "./userList";
import FavoriteList from "./favoriteList";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import axios from "axios";
export default class App extends Component {
state = {
list: [],
favorites: []
};
addFavorite = favorite => {
const { favorites } = this.state;
if (!favorites.some(alreadyFavorite => alreadyFavorite.id == favorite.id)) {
this.setState({
favorites: [...this.state.favorites, favorite]
});
}
};
getList = async () => {
const api =
"https://gorest.co.in/public-api/users?_format=json&access-token=3qIi1MDfD-GXqOSwEHHLH73Y3UitdaFKyVm_";
await axios
.get(api)
.then(response => {
this.setState({
list: response.data.result
});
})
.catch(err => {
console.log(err);
});
};
componentDidMount() {
this.getList();
}
render() {
return (
<Router>
<Switch>
<Route
path="/"
exact
render={() => (
<UserList list={this.state.list} addFavorite={this.addFavorite} />
)}
/>
<Route
path="/favorites"
render={() => <FavoriteList favorites={this.state.favorites} />}
/>
</Switch>
</Router>
);
} }
用户列表.js
在按钮单击时调用addFavorite
事件处理程序以将该项目传回父状态。
import React from "react";
import NavLinks from "./components/navLink";
export default class UserList extends React.Component {
render() {
let style = {
display: "grid",
gridTemplateColumns: "repeat(auto-fill, minmax(250px, 1fr))",
padding: "1rem",
gridGap: "1rem 1rem"
};
return (
<div>
<NavLinks />
<ul style={style}>
{this.props.list.map(user => {
return (
<li key={user.id}>
<div>
<img className="thumb" alt="" src={user._links.avatar.href} />
</div>
<div className="userInfo">
<p>
{user.first_name} {user.last_name}
</p>
</div>
<button onClick={() => this.props.addFavorite(user)}>
Add to Favorites
</button>
</li>
);
})}
</ul>
</div>
);
}
}
收藏夹.js
使用favorites
作为道具传入的数组并对其进行迭代。
import React from "react";
import NavLinks from "./components/navLink";
export default class FavoriteList extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
render() {
const { favorites } = this.props;
return (
<div>
<NavLinks />
<ul>
{favorites.map(user => {
return (
<li key={user.id}>
<div>
<img className="thumb" alt="" src={user._links.avatar.href} />
</div>
<div className="userInfo">
<p>
{user.first_name} {user.last_name}
</p>
</div>
</li>
);
})}
</ul>
</div>
);
}
}
推荐阅读
- sql-server - 在 Alteryx 工作流上使用 Active Directory 身份验证连接到 Azure SQL DB 时通信链接失败
- javascript - 雷达图在 React Highcharts 中不起作用
- amazon-cognito - AWS Cognito:如何在托管注册 UI 上显示自定义属性?
- github-desktop - Github desktop custom color scheme
- mongoose - 如何解决 VS 代码中的原型污染问题
- r - group_by 函数的 YAML 参数列表
- visual-studio - 远程调试 dotnet 测试:未加载 vstest.console.pdb
- perl - 如何总结perl中线程数组返回的所有值?
- splunk - 使用 HEC 令牌 splunk 未收到数据
- c# - 我如何访问未连接到我的班级的列表