javascript - 组件多次渲染 - 多个获取函数

标签 javascript reactjs

我的组件渲染了 4 次,这似乎是由 fetch 和多个 setState 函数引起的。我怎样才能让它只使用一个 setState() 包括所有获取的数据?

我已经尝试创建一个函数而不是一个,创建三个变量来存储获取结果并将它们传递给 setState,但这对我没有帮助。 提前致谢!

class DuelList extends React.Component {
    state = {
        duels: [],
        users: [],
        datasets: []
    };

    fetchDuels = () => {
        axios.get("http://127.0.0.1:8000/api/duel/user/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
            .then(res => {
                this.setState({
                    duels: res.data
                });
            });
    };

    fetchUsers = () => {
        axios.get("http://127.0.0.1:8000/api/user/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
            .then(res => {
                this.setState({
                    users: res.data
                });
            });
    };

    fetchDatasets = () => {
        axios.get("http://127.0.0.1:8000/api/dataset/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
            .then(res => {
                this.setState({
                    datasets: res.data
                });
            });
    };


    componentDidMount() {
        this.fetchDuels();
        this.fetchUsers();
        this.fetchDatasets();
    }


    render() {
        return (
            <div>
                <Duels data={this.state.duels}/> <br/>
                <h2> Add duel </h2>
                <AddDuelForm users={this.state.users} datasets={this.state.datasets} requestType="post" articleID={null}
                             btnText="Challenge"/>
            </div>
        );
    }
}

export default DuelList;```


最佳答案

您需要将所有 promise 分组并解决:

    fetchDuels = () => {
        return axios.get("http://127.0.0.1:8000/api/duel/user/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
    };

    fetchUsers = () => {
        return axios.get("http://127.0.0.1:8000/api/user/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
    };

    fetchDatasets = () => {
        return axios.get("http://127.0.0.1:8000/api/dataset/",
            {'headers': {'Authorization': `Token ${localStorage.getItem('token')}`}})
    };


    componentDidMount() {
        const promises = [this.fetchDuels(), this.fetchUsers(), this.fetchDatasets()];

        Promise.all(promises).then(([ duelsReponse, usersResponse, datasetsReponse ]) => {
            this.setState({ duels: duelsReponse.data, users: usersReponse.data, datasets: datasetsResponse.data });
        });
    }

这样,您就可以减少 setState 调用的次数。

关于javascript - 组件多次渲染 - 多个获取函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54294133/

相关文章:

带有工作示例的 JavaScript 站点

javascript - 如何在 .on "click"事件中获取按钮 ID

javascript - 为什么我的 Javascript 不能在 django 模板中工作

javascript - 如何使用 Webpack 构建 React 应用程序并导入 Assets 文件夹?

javascript - 在 React.js 的容器中为组件设置一个类

javascript - 基于类的组件与功能组件有什么区别(Reactjs)

javascript - 在 AngularJS 中获取 RouteParams 时出现问题?

javascript - 在 react 中滚动视频

css - Styled-components:插值函数或 component.extend?

javascript - React Native - 二维码生成器大小限制