如何等待 API 回调完全渲染组件?

Posted

技术标签:

【中文标题】如何等待 API 回调完全渲染组件?【英文标题】:How can i wait for API callback to completely render a component? 【发布时间】:2019-12-29 20:14:36 【问题描述】:

我从 API 获得请求,然后将数据分配给 created 方法中名为 source 的属性。现在在渲染函数中遇到一些问题,在组件完全创建之前将source 中的一些数据分配给它们的属性participants

source 属性在组件完全渲染后有其属性但participants 中没有数据

这是API Resource

return [
          'id' => $this->id,
          'user_id' => $this->user_id,
          'participants' => [
              'id' => $this->user_id,
              'name' => $this->user->name,
              'imageUrl' => 'https://avatars3.githubusercontent.com/u/37018832?s=200&v=4'
          ],
          'body' =>[
              'type' => 'text', 
              'author' => $this->user == auth()->user() ? "me" : $this->user->name,
              'data' => ['text' => $this->body],
          ],
          'created_at' => $this->created_at->diffForHumans(),
      ];

这是我的元素标签<beautiful-chat>

<beautiful-chat 
  :participants="participants" 
  :messageList="messageList"
  v-if=" this.source.length > 0 "
/>

这是渲染函数

<script>
export default 
  data() 
    return 
      source: ,
      room_id: ChatRoom.id(),
      participants:[],
      messageList: [],
    ;
  ,
  created()
      axios.get(`/api/room/$this.room_id/message`)
        .then(res => this.source = res.data.data);

    Array.prototype.forEach.call(this.source, child => 
        const parti = Object.keys(child.participants).map(i => child.participants[i])

        this.participants.push('id': parti[0], 'name' : parti[1], 'imageUrl' : parti[2]);

        const message = Object.keys(child.body).map(i => child.body[i])

        this.messageList.push('type': message[0], 'author' : message[1], 'data' :message[2] );

    );
  
;
</script>

我在哪里可以从源中获取数据以将它们放入我的属性中,而不是 created 方法

【问题讨论】:

res.data.dataarray 还是 object 它是一个对象,我会更新API资源的问题 【参考方案1】:

首先制作source=null

export default 
  data() 
    return 
      source: null,
      room_id: ChatRoom.id(),
      participants:[],
      messageList: [],
    ;
  ,
  created()
    axios.get(`/api/room/$this.room_id/message`)
      .then(res => 
        let source = res.data.data
        // Array.prototype.forEach.call(source, child => 
        //   const parti = Object.keys(child.participants).map(i => child.participants[i])
        //   this.participants.push('id': parti[0], 'name' : parti[1], 'imageUrl' : parti[2]);
        //   const message = Object.keys(child.body).map(i => child.body[i])
        //   this.messageList.push('type': message[0], 'author' : message[1], 'data' :message[2] );
        // );

        // a better way:
        this.participants = [source.participants]
        this.messageList = [source.body]

        this.source = source
      );
  
;

在模板中:

<beautiful-chat 
  :participants="participants" 
  :messageList="messageList"
  v-if="source"
/>

您也可以使用computed property。

【讨论】:

以上是关于如何等待 API 回调完全渲染组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 koa 中发送 HTTP 响应之前等待 url 回调?

如何使用 React 功能组件通过循环回调获取 api

如何等待在 react.js 中渲染视图,直到 $.get() 完成?

如何在koa发送HTTP响应之前等待url回调?

如何等待异步方法的回调返回值?

如何等待异步方法的回调返回值?