当前位置: 首页 > 面试题库 >

为什么Appbase在返回正确的项目之前会返回“ undefined”?

樊俊悟
2023-03-14
问题内容

我正在将AppBase.io作为数据库使用,但我不明白为什么该组件在获得项目后会呈现两次?似乎AppBase“数据库” 首先返回 undefined
,然后返回 正确的项目 。有人知道为什么吗?查看示例,我得到2条日志。

在此组件中,我需要从数据库中获取一个项目并进行渲染(没什么特别的)。

感谢您的解释。

var appbaseRef = new Appbase({

  url: "https://JHtFTzy4H:d083068b-596c-489d-9244-8db2ed316e79@scalr.api.appbase.io",

  app: "winwin"

});





class ItemFull extends React.Component {

  constructor() {

    super();

    this.state = {

      item: ''

    }

  }



  componentWillMount() {

    appbaseRef.get({

      type: "items",

      id: 'AWI5K7Q-5Q83Zq9GZnED'

    }).on('data', (response) => {

      this.setState({

        item: response

      });



    }).on('error', function(error) {

      console.log(error)

    })

  }



  render() {

    console.log(this.state.item._id, '<-- console_log');

    return (<div></div>);

  }

}



ReactDOM.render(<ItemFull /> , document.getElementById('root'));


<script src="https://cdnjs.cloudflare.com/ajax/libs/appbase-js/2.2.11/appbase.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>



<div id="root"></div>

问题答案:

没有。您在开始异步调用componentWillMount不托起渲染过程(这是好的),所以render在调用完成之前调用,因此this.state.item._idundefined因为在这一点上,this.state.item''(你在构造函数中设置的值)。

这完全正常,只需确保在尚无信息的情况下以适当的方式呈现组件即可,例如:

var appbaseRef = new Appbase({

  url: "https://JHtFTzy4H:d083068b-596c-489d-9244-8db2ed316e79@scalr.api.appbase.io",

  app: "winwin"

});





class ItemFull extends React.Component {

  constructor() {

    super();

    this.state = {

      item: ''

    }

  }



  componentWillMount() {

    appbaseRef.get({

      type: "items",

      id: 'AWI5K7Q-5Q83Zq9GZnED'

    }).on('data', (response) => {

      this.html" target="_blank">setState({

        item: response

      });



    }).on('error', function(error) {

      console.log(error)

    })

  }





  render() {

    return <div>{this.state.item._id ? this.state.item._id : "loading..."}</div>;

  }

}







ReactDOM.render(<ItemFull />, document.getElementById('root'));


<script src="https://cdnjs.cloudflare.com/ajax/libs/appbase-js/2.2.11/appbase.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>



<div id="root"></div>

如果在获得该信息之前根本不应该渲染该组件,那么您就在错误的位置提出了请求。:-)您需要在父组件中请求它,并且仅在拥有信息(在中传递信息props)时才呈现此组件,如下所示:

var appbaseRef = new Appbase({

  url: "https://JHtFTzy4H:d083068b-596c-489d-9244-8db2ed316e79@scalr.api.appbase.io",

  app: "winwin"

});



class ParentComponent extends React.Component {

  constructor(...args) {

    super(...args);

    this.state = {item: null};

  }



  componentWillMount() {

    appbaseRef.get({

      type: "items",

      id: 'AWI5K7Q-5Q83Zq9GZnED'

    }).on('data', (response) => {

      this.setState({

        item: response

      });

    }).on('error', function(error) {

      console.log(error)

    })

  }



  render() {

    return this.state.item ? <ItemFull item={this.state.item} /> : <div>loading...</div>;

  }

}



class ItemFull extends React.Component {



  render() {

    return <div>{this.props.item._id}</div>;

  }

}



ReactDOM.render( <ParentComponent /> , document.getElementById('root'));


<script src="https://cdnjs.cloudflare.com/ajax/libs/appbase-js/2.2.11/appbase.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>



<div id="root"></div>


 类似资料:
  • line.FlatMap(WordSutil::GetWords)是方法引用中错误的返回类型: 编码方法:

  • 问题内容: 例如,在以下代码中 返回类型之前的目的是什么(该行的作用或如何读取) 问题答案: 这是使您的 方法 (而不是 类 )通用的语法。 常规类和泛型类的方法可以根据其自身的类型参数进行泛型。在这种情况下,您的方法是on的通用方法,它必须是从扩展的类型。

  • 问题内容: 我将收到来自Obj-C的JSON编码字符串,并且正在解码一个伪字符串(目前),如下面的代码。我的输出结果是在每个项目前加上字符’u’: JSON如何添加此Unicode字符?删除它的最佳方法是什么? 问题答案: u-前缀仅表示您具有Unicode字符串。当您真正使用字符串时,它不会出现在您的数据中。不要被打印输出扔掉。 例如,尝试以下操作: 你不会看到你。

  • 为什么numeric_limits::min返回一个负值为int,但正值为例如浮动和双? 输出: 参考文献: 返回可由数字类型T表示的最小有限值。 对于具有反规范化的浮点类型,min返回最小的正规范化值。请注意,这种行为可能是意外的,特别是与整型类型的min行为相比。要查找没有值小于它的值,请使用。 min仅对有界类型和无界无符号类型有意义,也就是说,表示无穷多个负值的类型没有意义的最小值。

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 这是简单的代码,我没有得到设置位图的结果,而是得到了null。谁能告诉我我在哪里犯错了? 更新 好的,所以我无法像我想的那样将文本转换为图像。这样呢 这会创建位图吗? 问题答案: 从文档中: 返回 解码的位图;如果无法解码图像,则 返回 null。 字符串“ test”中涉及的字节不是有效的位图,对吗? 如果将文本“ test”保存在名为or 等的文件中,并试图在Windows中打开它

  • 问题内容: 为什么要用Python返回? 我如何获得改组后的值而不是? 问题答案: 更改列表 到位 。 在原位更改结构的Python API方法通常返回,而不是修改后的数据结构。 如果要基于现有列表创建 新的 随机混排列表,并按顺序保留现有列表,则可以使用输入的完整长度: 您还可以将with用于排序键: 但这会调用排序(O(NlogN)操作),而采样到输入长度仅需要O(N)操作(与所使用的过程相同