当前位置: 首页 > 知识库问答 >
问题:

反应

田玉韵
2023-03-14

我想在加载组件时进行api调用。我有以下代码:

import React, { Component } from "react";
import { connect } from "react-redux";
import { getProfileDetails } from "../store/actions/profileAction";

class ProfilePage extends Component {

    constructor(props) {
        super(props);
    }

    componentDidMount() {
        this.props.getProfileDetails(this.props.currentUser.user, "");

        console.log("COMPONENTDIDMOUNT");
    }

    render() {
        var { currentUser, getProfileDetails, profile } = this.props;
        return (
            <React.Fragment>
                <h1>Profile Page for {currentUser.user.username} !!</h1>

            </React.Fragment>
        )
    }

}

function mapStateToProps(state) {
    return ({
        currentUser: state.currentUser,
        profile: state.profile
    })
}

export default connect(mapStateToProps, { getProfileDetails })(ProfilePage);

getProfile细节功能:

export function getProfileDetails(user, detail) {
    return dispatch => {
        return apiCall("get", `/api/users/profile/${user.id}/${detail}`)
            .then(profileDetail => {
                dispatch(setCurrentProfile(profileDetail, detail));
                dispatch(removeError());
            })
            .catch(err => {
                dispatch(addError(err.message));
            })
    }
}

在这里,函数"getProfile细节"正在进行api调用,然后调度一个redux存储操作,该操作正在设置配置文件细节。

问题是,每次调用getProfile细节时,redux存储都会更新,组件会重新渲染,这反过来会触发组件didMount,并进入无休止的循环。

请建议如何构造这个。

共有2个答案

诸葛嘉熙
2023-03-14

您应该使用mapDispatchToProps而不是MapStateTops。后者仅使用现有状态更新组件。

看起来您提到的问题在react-redux文档中讨论过https://redux.js.org/faq/react-redux#react-rendering-too-often.这可能有助于您调试。

请从中提供代码/存储/actions/profileAction文件。

袁运良
2023-03-14

如果状态属性发生更改,您希望捕获的状态属性是什么?例如,如果您只想在currentUser更改时调用新的fetch,则可以执行以下操作:

componentDidUpdate(prevProps) {
  if (prevProps.currentUser !== this.props.currentUser)
    this.props.getProfileDetails(this.props.currentUser.user, "");
}

您需要在componentDidMount中以不同的方式初始化数据,类似于从状态获取数据。然后,仅当用户更改时才重新获取详细信息。

 类似资料:
  • 问题内容: 以下是React中的反模式吗?我喜欢这种模式,因为当实例化一个组件时,它在静态函数中为我提供了上下文。然后,我可以导入该类并调用静态方法来修改状态。还是可以通过更好的方式来完成? 问题答案: 显然,这取决于条件,可能是一种反模式,也可能是一个错误。静态类方法不应与类实例一起使用。绑定到特定的组件实例和用途,这只能证明类是单例是合理的(尽管单例也经常是反模式)。如果期望有多个类实例,那么

  • 问题内容: 我正在使用带有react的ES6 babel,现在对于较新版本的react,react DOM不再是它的一部分。我对以下代码的怀疑是,这是第一行吗?因为我无处需要React,但最后一行需要ReactDOM。 问题答案: 从版本开始,React 分为两个部分: React 和 ReactDOM。 您正在使用。因此,对您而言,在组件中绝对有意义。但是就React而言,尽管您不是直接使用Re

  • 问题内容: 我正在尝试使用Lodash来对一个函数进行去抖动,并且在调用该函数时,它似乎根本没有对其进行去抖动。我的问题似乎与我在SO上其他地方看到的错误不一样(通常是,他们没有调用返回的函数)。 我当前的超简单实现如下(在Angular中使用CoffeeScript): 在JS中,我相信是这样的: 我通过在输入框中键入内容来运行,如果我很快键入乱码,则控制台会在每次按键时每秒打印多次“发出搜索请

  • 我的导航不工作,因为某些原因,我有另一个应用程序运行良好,但这一个不能找到错误,请帮助 反应路由器不工作。反应JS 我需要你的帮助。 使用react-router,我可以使用Link元素创建由react router本地处理的链接。

  • 我正在使用JWT创建和验证令牌,并将令牌存储在cookie中。(react前端vs Nodejs后端) 我对react cookie与universal cookie和react cookie的用法感到困惑。 这些之间有什么区别,在后端设置cookie与在前端设置cookie有什么区别?

  • 建立成功 总时间:2分钟6.65秒运行C:\Users\arnold\AppData\Local\Android\sdk/平台工具/adb-s 192.168.95.101:5555反向tcp:8081 tcp:8081无法运行adb反向:spawnSync C:\Users\arnold\AppData\Local\Android\sdk/平台工具/adb eNONT在192.168.95.10