在 useEffect 中添加 setState
add setState inside useEffect
我有一个项目,上面有一个“登录”页面,用户点击“登录”后,应该会出现一个界面,其中包含该用户的所有列表。
为了让这些数据在登录过程后立即出现,我使用了“useEffect”并使用了与后端连接的“GetAllListsAction”操作来获取数据。
请注意,我使用的是打字稿。
然后搜索了一下,发现有好几个网站都是写这个逻辑的,在“use effect”中使用“useState”,然后使用“setList”。
就像我从网站上得到的这个例子:
const [list, setList] = useState([]);
useEffect(() => {
let mounted = true;
getList()
.then(items => {
if(mounted) {
setList(items)
}
})
return () => mounted = false;
}, [])
但我使用 React 和 TypeScript,我的编码方法与网站内编码略有不同。
问题是我不知道他们为什么在 useEffect 中使用 (setList) 并且我不知道如何将它添加到我的代码中。
我的代码是:
import { Grid } from "@material-ui/core";
import SingleList from "./single-list";
import { useStyle } from "../../../../styles/list-styles";
import Header from "../../header-footer/header";
import ListModal from "../modals/list-modal";
import { useEffect } from "react";
import { bindActionCreators } from "redux";
import { Actions } from "../../../../redux-store/actions/actions";
import { connect } from "react-redux";
import { ListItem } from "../../../../redux-store/reducers/todo-list-reducer";
const Lists: React.FC<{ TodoListList: any; GetAllListsAction: Function }> = ({
GetAllListsAction,
TodoListList,
}) => {
const classes = useStyle();
useEffect(() => {
// call action to fetch lists
GetAllListsAction();
}, []);
return (
<>
<Header />
<Grid className={classes.grid}>
<Grid
container
className={classes.addButton}
item
direction="row-reverse"
>
<ListModal />
</Grid>
<Grid container item lg={12} direction="row" spacing={1}>
{TodoListList.map((l: ListItem, index: number) => (
<Grid key={index} item lg={3} sm={6} xs={12}>
<SingleList title={l.title || ""} tasks={l.tasks} />
</Grid>
))}
</Grid>
</Grid>
</>
);
};
function mapDispatchToProps(dispatch: any) {
return bindActionCreators(
{
...Actions,
},
dispatch
);
}
function mapStateToProps(state: any) {
console.log("state inside lists component, bottom:", state);
console.log("TodoListList, bottom:", state.todoList?.List);
return {
TodoListList: state.todoList?.state || [],
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Lists);
在你的例子中,获取数据的函数和数据列表是传入的props.So你不需要使用useState。
如果在 Lists
组件中进行 api 调用,您应该使用 useState。
我有一个项目,上面有一个“登录”页面,用户点击“登录”后,应该会出现一个界面,其中包含该用户的所有列表。
为了让这些数据在登录过程后立即出现,我使用了“useEffect”并使用了与后端连接的“GetAllListsAction”操作来获取数据。
请注意,我使用的是打字稿。
然后搜索了一下,发现有好几个网站都是写这个逻辑的,在“use effect”中使用“useState”,然后使用“setList”。
就像我从网站上得到的这个例子:
const [list, setList] = useState([]);
useEffect(() => {
let mounted = true;
getList()
.then(items => {
if(mounted) {
setList(items)
}
})
return () => mounted = false;
}, [])
但我使用 React 和 TypeScript,我的编码方法与网站内编码略有不同。
问题是我不知道他们为什么在 useEffect 中使用 (setList) 并且我不知道如何将它添加到我的代码中。
我的代码是:
import { Grid } from "@material-ui/core";
import SingleList from "./single-list";
import { useStyle } from "../../../../styles/list-styles";
import Header from "../../header-footer/header";
import ListModal from "../modals/list-modal";
import { useEffect } from "react";
import { bindActionCreators } from "redux";
import { Actions } from "../../../../redux-store/actions/actions";
import { connect } from "react-redux";
import { ListItem } from "../../../../redux-store/reducers/todo-list-reducer";
const Lists: React.FC<{ TodoListList: any; GetAllListsAction: Function }> = ({
GetAllListsAction,
TodoListList,
}) => {
const classes = useStyle();
useEffect(() => {
// call action to fetch lists
GetAllListsAction();
}, []);
return (
<>
<Header />
<Grid className={classes.grid}>
<Grid
container
className={classes.addButton}
item
direction="row-reverse"
>
<ListModal />
</Grid>
<Grid container item lg={12} direction="row" spacing={1}>
{TodoListList.map((l: ListItem, index: number) => (
<Grid key={index} item lg={3} sm={6} xs={12}>
<SingleList title={l.title || ""} tasks={l.tasks} />
</Grid>
))}
</Grid>
</Grid>
</>
);
};
function mapDispatchToProps(dispatch: any) {
return bindActionCreators(
{
...Actions,
},
dispatch
);
}
function mapStateToProps(state: any) {
console.log("state inside lists component, bottom:", state);
console.log("TodoListList, bottom:", state.todoList?.List);
return {
TodoListList: state.todoList?.state || [],
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Lists);
在你的例子中,获取数据的函数和数据列表是传入的props.So你不需要使用useState。
如果在 Lists
组件中进行 api 调用,您应该使用 useState。