【问题标题】:How to call a function right before leaving a component?如何在离开组件之前调用函数?
【发布时间】:2018-10-09 07:56:34
【问题描述】:

我是个新手,我正在为 REST-API 开发前端。

我的 REST-API 前端组织在 5 个站点(组件)中,这些站点(组件)使用 react-router-dom 路由。

每次我进入站点时,ComponentDidLoad 都会调度一个动作,该动作又会调用我的 reducer 中的 API。

export function getData(pURL, ...pParams){

    return (dispatch) => {
        axios.get(pURL, {pParams})
        .then(result => {
            dispatch(getDataSuccess(result.data))
        })
        .catch(error => {
            dispatch(getDataFailure(error))
        })
    }
}

我的一个主要网站如下所示

class Overview extends Component {

    componentDidMount(){
        this.props.getData(MyURLHere);
    }

    render(){
        return(
            <div>

                {this.props.hasError ? "Error while pulling data from server " : ""}

                {/*  isLoading comes from Store. true = API-Call in Progress  */}
                {this.props.isLoading ? "Loading Data from server" : this.buildTable()}
            </div>
        )
    }
}

let mapStateToProps = state => {
hasError: state.api.hasError,
isLoading: state.api.isLoading,
companies: state.api.fetched 
}

let mapDispatchToProps = {
//getData()
}

export default connect(mapStateToProps, mapDispatchToProps)(Overview); 

state.api.fetched 是我的存储变量,我存储来自每个 API-Call 的数据。

this.buildTable() 只是映射数据并创建一个简单的 HTML 表格

我的问题是我在initialState 中将存储状态变量isLoading 设置为true

但是当我移动到另一个站点然后回到这个站点时,它会自动从state.api.fetched 获取数据并尝试使用它来this.buildTable(),因为isLoading 不是true。以“不是函数”错误结束,因为其中仍然有从另一个站点获取的旧数据。

我的解决方案是在离开将我的商店重置为 initialState 的组件(站点)时始终调用一个函数

const initialStateAPI = {
    isLoading: true
}

或直接将isLoading 设置为true,以避免我的网站尝试使用旧获取的数据。

有没有办法做到这一点? 我希望我提供了足够的信息,如果没有,请告诉我。

【问题讨论】:

    标签: reactjs react-redux


    【解决方案1】:

    如果您想在离开组件时调用该函数,您可以使用componentWillUnmount 函数。阅读更多关于 React 生命周期方法的信息。

    【讨论】:

    • 我试图这样做。遗憾的是,这种方式似乎太“慢”了,因为当我在componentWillUnmount 中调用我的this.props.resetStore() 时,当我到达该站点时,isLoading 仍然是错误的。只有当我已经到达下一个站点的render() 时才会实现..
    • 你需要将isLoading 标志保存在redux 商店中吗?
    • 最好将isLoading 标志放入状态。这样在进入站点时它总是可以自动为真。但是我该如何修改这个标志呢?
    • 你可以使用 Promise。例如:componentDidMount(){ this.props.getData(MyURLHere).then(() =&gt; this.setState({isLoading: false}) } 和你的getData 函数:export function getData(pURL, ...pParams){ return (dispatch) =&gt; { return axios.get(pURL, {pParams}) .then(result =&gt; { dispatch(getDataSuccess(result.data)) }) .catch(error =&gt; { dispatch(getDataFailure(error)) }) } } 但是当你配置你的商店时你需要添加中间件例如redux-thunk
    • 有效!刚刚在我的操作中添加了额外的回报和componentDidMount 的额外行。我将尝试了解它实际上是如何工作的。非常感谢!
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2022-11-16
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多