【问题标题】:Destructuring the nested objects fetched from an API call using "curly braces method"使用“花括号方法”解构从 API 调用中获取的嵌套对象
【发布时间】:2020-07-06 09:10:25
【问题描述】:

我是这样获取数据的:

  constructor(){
    super();    
    this.state = {
      fetchedData : [] 
    }
  }
  componentDidMount(){
    fetch("https://api.randomuser.me")
          .then(response => response.json())
          .then(data => {            
            this.setState({
                  fetchedData : data.results[0]
                          })
                              });                                                                                                                                     
  }

this.state.fetchedData得到这个结果:

然后尝试以下代码对结果进行解构:

render(){    
let {name} = this.state.fetchedData;

它工作正常,我用console.log(name) 得到了以下结果:

所以我想进一步向下移动嵌套对象,但是当我尝试以下代码时:

render(){    
    let {name:{first, last, title}} = this.state.fetchedData;

它给了我以下错误:

【问题讨论】:

  • 您的默认值 [] 没有任何意义 - 请记住,组件可能至少会在数据从HTTP 请求。

标签: reactjs api object nested destructuring


【解决方案1】:

这里的类型不匹配。您正在使用空数组初始化 fetchedData,然后期望它具有属性 firstlasttilte

您应该使用有效条目而不是空数组进行初始化:

constructor(){
    super();    
    this.state = {
      fetchedData : {name: {first: '', last: '', title: ''}}
    }
  }

此外,由于异步请求,这是必需的。稍后调用相应的then 处理程序(this.setState({fetchedData:...}))。因此,您的组件将在 setState 调用之前以其初始值呈现。

【讨论】:

  • 我是新来学习react的,所以这可能需要解释一下。**问题1:**我不确定当我不确定时如何提前定义“fetchedData”的结构API输出的结构是什么? 问题2: 我同意可能存在类型不匹配,但是当执行“fetchedData.name”时它如何正常工作,并且在尝试“fetchedData.name.title”时出现错误?
  • 问题 1: 您应该确定 API 提供了什么,否则您不知道要访问什么。编写一个完全不可知的客户端是不可能的。唯一的可能是某种描述您的 api 响应的元模型。但我认为这不是应该去的地方。 问题 2: 抱歉,忘记了 name 属性。将其添加到答案中。
  • 感谢您的解释。尽管问题出在执行流程上,因为我什至在 API 调用之前就尝试使用数据。空数组的启动工作正常。但是,您的回答帮助我了解了一些我感谢您的努力的东西。希望能通过另一个问题与您联系。
  • @rebel,因为您未批准答案,请告诉我您希望得到批准的答案是什么样的。
猜你喜欢
  • 2021-10-13
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多