React Native:当我尝试解析我的数据时出错

时间:2017-10-06 15:54:05

标签: arrays parsing object react-native

您好我正在尝试在数组中解析此对象:

 [ { address: '15 rue de Bouvines',
     category: 'Bar',
     city: 'Tours',
     storeName: 'La Tabtiere',
     _key: '-KuVBzIx8rFZxneg5JvY' },
   { address: '',
     category: '',
     city: '',
     storeName: '',
     _key: '-KuVTSgauvHcvhDigNVz' } ]

这是我初始化内容的代码以及我尝试解析数组的代码:

 constructor(props){
 super(props);
 this.tasksRef = firebase.database().ref('/store');
 this.state = {
  user:null,
  loading: true,
  newTask: ""
 }
}

componentDidMount() {
  // start listening for firebase updates
  this.listenForTasks(this.tasksRef);
}

//listener to get data from firebase and update listview accordingly
listenForTasks(tasksRef) {
  tasksRef.on('value', (dataSnapshot) => {
    var tasks = [];
    dataSnapshot.forEach((child) => {
      tasks.push({
        address: child.val().address,
        category: child.val().category,
        city: child.val().city,
        storeName: child.val().storeName,
        _key: child.key
      });
    });

    this.setState({
      tasks:tasks
    });
  });
 }

  this.setState({tasks:tasks}, function(this.state.tasks) {
    ParseArray() {
     return this.state.tasks.map(function(result, i){
      return(
       <View key={i}>
         <Text>{result.address}</Text>
          <View>
            <Text>{result.storeName}</Text>
          </View>
        </View>
      );
    });
  }
   } 
  );  

尝试使用这种方式显示:

 render() {
  return(
    <View>
      test
      {this.ParseArray()}
    </View>
  )
}

但我在xcode中遇到了这个错误:

  

undefined不是对象(评估'this.state.tasks.map')

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

也许你的代码正在其他地方代理,但让我说,setState()是异步的。

  

setState()并不总是立即更新组件。有可能   批量或推迟更新,直到稍后。这使得阅读this.state   在调用setState()之后发生了潜在的陷阱。相反,使用   componentDidUpdate或setState回调(setState(更新程序,   回调)),其中任何一个都保证在更新后触发   已经应用。如果需要根据以前的状态设置状态   state,请阅读下面的updater参数。

https://reactjs.org/docs/react-component.html#setstate

所以,将代码更新为,

sorted_symdiff(list1,list2):
""" Each list is already sorted, this seems inefficient """
    s1,s2 = set(list1),set(list2)
    diff = list(s1.symmetric_difference(s2))
    diff.sort()
    return diff

将让您避免将来(或可能是当前)错误。

当您尝试检查this.setState({tasks:tasks}, function(this.state.tasks) { /** same as ParseValue() **/} ); 部分时,您会看到, this.state.tasks已定义且具有值。还this。但在渲染/安装阶段,您无法保证始终定义this.state

当然,除了this.state.tasks之外,您无法在任何数据结构上调用map

<强>更新

Array

我没有按照打开/关闭的parathesis /括号,必要时修复它们。

或者,取消像

这样的功能
this.setState({tasks:tasks}, function(this.state.tasks) {
  return this.state.tasks.map(function(result, i){
    return(
     <View key={i}>
       <Text>{result.address}</Text>
       <View>
         <Text>{result.storeName}</Text>
       </View>
     </View>
  );
 }); 
} 
) 

并使用它,

ParseArray(array_of_obj) {
 return array_of_obj.map(function(result, i){
  return(
   <View key={i}>
     <Text>{result.address}</Text>
      <View>
        <Text>{result.storeName}</Text>
      </View>
    </View>
  );
});
}