您好我正在尝试在数组中解析此对象:
[ { 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')
有什么想法吗?
由于
答案 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>
);
});
}