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

React componentDidMount获取api

谯和煦
2023-03-14

我正在尝试获取componentDidMount中的api。api结果将被设置为组件的状态,状态映射并传递给子组件。

如果我在componentDidMount中使用fetch方法获取api,那么一切正常:

componentDidMount(){
    fetch(apiToFetch)
        .then((result) => result.json())
        .then((result) => result.entries)
        .then((entries) => this.setState({ ...this.state, entries }))
        .catch((error) => console.log(error));
}

如果在方法内使用fetch,然后在componentDidMount内调用此方法,则不会呈现任何内容:

componentDidMount() {
    this.fetchApiToEntries(GLOBAL_PORTFOLIO_COLLECTION_API);
}

fetchApiToEntries(apiToFetch) {
    fetch(apiToFetch)
        .then((result) => result.json())
        .then((result) => result.entries)
        .then((entries) => this.setState({ ...this.state, entries }))
        .catch((error) => console.log(error));
}

我无法理解我在生命周期中缺少了什么。你不应该这样做吗?

  • 启动状态
  • 渲染
  • 调用组件
  • 重新渲染

以下是我的初始组件:

export default class Portfolio extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            entries: []
        }

    }
    componentDidMount() {

        this.fetchApiToEntries(GLOBAL_PORTFOLIO_COLLECTION_API);
    }
    fetchApiToEntries(apiToFetch) {
        fetch(apiToFetch)
            .then((result) => result.json())
            .then((result) => result.entries)
            .then((entries) => {
                this.setState({
                    ...this.state,
                    entries
                })
            })
            .catch((error) => console.log(error));
    }

    render() {

        return (
            <Fade bottom>
                <div className="Portfolio">
                    <div className="Portfolio__title"><h4 className="color--gradient text--spacing">WORKS</h4></div>
                    <OwlCarousel {...options}>
                        {this.state.entries.map((item) => (
                            <PortfolioElement item={item} />
                        ))}
                    </OwlCarousel>
                    <AnchorLink href='#contact'><Button className="contact-button btn--gradient slider-button Services__button">Let's get in touch</Button></AnchorLink>
                </div>
            </Fade>
        )
    }
}

PortfolioElement是未呈现的实际组件。有什么建议吗?谢谢你。

编辑:这两种方法都没有以正确的方式重新呈现组件(…这是我没有预料到的:我不知道为什么,但如果我在componentDidMount中调用它们两次,组件将以正确的方式呈现)。我想我错过了这个州的一些东西。

我在控制台上没有错误,这就是我如何设置我的初始状态:

this.state={entries:[]}

这是控制台中实际条目的外观:

 entries:
[0:{credits: "..."
    description: "..."
    featuredImage: {path: "portfolio/01.jpg"}
    firstImage: {path: "portfolio/firstimage.jpg"}
    secondImage: []
    slug: "..."
    tasks: (5) [{…}, {…}, {…}, {…}, {…}]
    title: "..."
    _by: "5beae6553362340b040001ee"
    _created: 1542123322
    _id: "5beaef3a3362340bf70000b4"
    _mby: "5beae6553362340b040001ee"
    _modified: 1542149308
},
1:{...}
]

获取后我的状态与此相同。

更新我发现问题在于:当状态改变时,组件没有用正确的道具重新加载子组件。我在一个更高阶的组件中调用了API,该组件传递了props,并添加了一个componentWillUpdate方法,该方法强制执行状态刷新,从而重新启动该组件。这不是理想的解决方案,但我现在还没有找到其他办法。有什么建议吗?

共有2个答案

乔鸿骞
2023-03-14

您需要在构造函数中绑定fetchApiToEntries还是使用fat箭头?

this.fetchApiToEntries = this.fetchApiToEntries.bind(this);

对不起,我不能评论没有足够的代表

汪坚
2023-03-14

Idk您的api响应是什么,但我用一个假的api测试了您的代码,并更改了它

fetchApiToEntries(apiToFetch){}

到箭头函数(箭头函数)

fetchApiToEntries = (apiToFetch) => {}

它工作得很好。

完整示例:



    export default class Portfolio extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                entries: []
            }
        }
        componentDidMount() {
          this.fetchApiToEntries('https://jsonplaceholder.typicode.com/posts');
        }
        fetchApiToEntries = (apiToFetch) => {
            fetch(apiToFetch)
                .then(result => result.json())
                .then((entries) => {
                    this.setState({
                        ...this.state,
                        entries
                    })
                })
                .catch((error) => console.log(error));
        }
        render() {
          const {entries} = this.state;
            console.log(entries);
            return (
                // Everything you want to render.
            )
        }
    }

希望对你有帮助。

 类似资料:
  • 我们使用nextjs/reactjs作为FE,并且我们有一个server.js文件,它允许我们在上传映像,但是由于某种原因,每当我们运行服务器时,都会出现错误 下面是我们在server.js上的代码 这些是我们package.json中包含的脚本 希望得到一些答案和建议。这些代码在本地运行,没有任何问题

  • 英文原文: http://emberjs.com/guides/getting-ember/index/ Ember构建 Ember的发布管理团队针对Ember和Ember Data维护了不同的发布方法。 频道 最新的Ember和Ember Data的 Release,Beta 和 Canary 构建可以在这里找到。每一个频道都提供了一个开发版、最小化版和生产版。更多关于不同频道的信息可以查看博客

  • 我一直在尝试使用nativescript创建一个android应用程序。我正在使用fetch模块从服务器获取响应。当我试图从httpbin获得响应时。org/get,没关系。但当我试图从本地服务器获取响应时,网络请求失败。错误 发送到httpbin。组织/获取- 发送到本地主机:8000/api- 当我尝试从纯节点中的localhost:8000/api获取响应时。js通过请求模块。它工作得很好。

  • 获取资讯列表 获取置顶资讯列表 获取资讯详情 获取一条资讯的相关资讯 获取资讯列表 GET /news 传入参数 名称 说明 limit 数据返回条数 默认为20 after 数据翻页标识 key 搜索关键字 cate_id 分类id recommend 推荐筛选 =1为筛选推荐资讯列表 id 需要按照 ID 获取的资讯 ID,多个使用半角 , 进行分割 Response Status: 200

  • 功能介绍 此API为硬件厂商提供通过目睹账号密码直接获取临时token的特殊API,请勿滥用 此API作用为 如果当前账号未生成token,将会生成一个token。 如果当前账号为专业版及以上用户,并且之前调用当前接口获取过临时token,当临时token过期时,再次调用当前接口时,会返回一个token。 专业版本以下用户我们将不再返回token提供使用。 注意: 通过当前接口返回的token长期

  • 我刚到Angular 2还在学习,我正在尝试用get调用击一个URL,但get似乎不通过,即使在浏览器的网络中,我也找不到被调用的get URL。 程序将转到方法控制台,在get调用的上下记录日志,但不记录get调用的日志 我的服务方式

  • 我有一个使用redux的应用程序 我也曾在本地获取数据。 在我的反应组件中,我使用来获取数据。但我什么也没得到。 如何在我的组件中获取数据? 演示:https://codesandbox.io/s/nervous-rosalind-lp16j?file=/src/App.js:242-328

  • 我从服务器得到这样的响应: 但打印fetch API捕获中的err只会返回错误对象。 它打印了这个(来自谷歌浏览器): 我想得到正确的错误处理状态代码,就像服务器没有响应一样。 在这种情况下,有没有办法获取响应数据?否则,我可以尝试什么替代方案? 任何建议都将不胜感激!