我试图了解React Hooks。我想要的是使用useEffect挂钩通过调用redux动作在功能组件内部获取数据。 我知道我可以将道具传递给
const [todoList] = useState(props.todoList)
但是通过现有的redux操作获取数据的最佳实践是什么?
在React类组件中,我调用此方法以在componentDidMount()中获取数据,并且一切都可以正常工作。
import React, { useEffect } from 'react'
import { connect } from 'react-redux'
import { ITodo } from './types'
import { getTodos } from '../actions/todoActions'
interface IProps {
todoList: Array<ITodo>
getTodos: typeof getTodos
}
const Todos = (props: IProps) => {
useEffect(() => {
props.getTodos()
}, [props.todoList])
return (
<div>
{props.todoList.map((_) => (<div key={_.Id}>{_.Name}</div>))}
</div>
)
}
const mapStateToProps = (state) => ({
todoList: state.todo.todoList
})
const mapDispatchToProps = {
getTodos
}
export default connect(mapStateToProps, mapDispatchToProps)(ProdRoute)
我希望获得带有道具和道具的待办事项清单。getTodos()应该像componentDidMount()方法一样被调用一次。但是实际上我得到的数据和getTodos()一遍又一遍地被调用,但是应该在组件安装时被调用一次
答案 0 :(得分:3)
请注意,如果将[props.todoList]
传递给useEffect
,则会错误地强制进行持续刷新,因为:
useEffect
进行实例比较(===)以了解props.todoList
是否已更改props.getTodos()
调度程序props.todoList
时,组件将重新呈现useEffect
调用将收到[props.todoList]
作为值,以检查是否需要重新运行props.todoList
被更改(它是空的,现在已经变价了),props.getTodos()
如此称呼todoList
,但改变了数组引用useEffect
将检查[props.todoList]
参数是否已更新...但是它已被更新,因为先前的props.todoList
与实际的不同。 props.todoList
,即使内容相同因此,如果您只需拨打一次props.getTodos()
,就可以
[props.todoList.length]
代替[props.todoList]
作为useEffect
调用的第二个参数[]
作为useEffect
调用的第二个参数(请参见the docs)