【发布时间】:2019-04-29 18:48:24
【问题描述】:
我只是 React-Native 的初学者,我每天都因为一些意想不到的行为而变得疯狂。当然是我的错,我还在学习。 今天我很难理解我的代码发生了什么。
我有一个函数可以调用本地存储上的对象数组。如果我从承诺中得到回应,它会给我一个完美的数组(我认为)。之后我 setState 和 agin 它正确显示在我的控制台上。但是,令我惊讶的是,我的列表组件没有渲染任何东西(而且它肯定像以前一样工作)。
我会附上我的代码:
/*FUNCTION FILE*/
getAllData: async () => {
var data = [{id:null, address:null, name:null}];
AsyncStorage.getAllKeys((err, keys) => {
AsyncStorage.multiGet(keys, (err, stores) => {
stores.map((result, i, store) => {
// get at each store's key/value so you can work with it
var key = store[i][0];
var value = store[i][1];
data[i] = {id: i, address: key, name: value}
});
});
});
return data},
//MAIN FILE (DAD COMPONENT)
import React, { Component } from 'react';
import { View, Text } from 'react-native';
import NewTagButton from '../components/NewTagButton';
import TagList from '../components/TagList';
import storage from '../functions/Storage';
import { Object } from 'core-js';
//import { TagPosition } from '../functions/GPSTag'
class TagsScreen extends Component {
constructor(props) {
super(props);
this.state = {message:"",
pairedDevices: [],
};
}
componentDidMount () {
var self = this;
storage.getAllData() //tem que esperar a promise
.then(function (devices) {
self.setState({message: "Scaneamento finalizado."});
self.setState({pairedDevices: devices});
console.log("devices")
console.log(devices)
console.log("State")
console.log(self.state.pairedDevices)
})
.catch(()=> console.log("Promise rejected"))
}
render() {
return (
<View>
<Text>{this.state.message}</Text>
<TagList devices = {this.state.pairedDevices} origem = 'MyTag'/>
<NewTagButton/>
</View>
);
}
}
export default TagsScreen;
LIST COMPONENT THAT SHOULD RENDER THE LIST
import React from 'react';
import { View, StyleSheet } from 'react-native';
import TagItem from '../components/TagItem'
const TagList = props => {
const devicesList = props.devices;
const origem = props.origem;
//aqui a gente vai passar device a device para a page TagItem
const items = devicesList.map((device) =>
<TagItem
key = {device.address}
address = {device.address}
name = {device.name}
origem = {origem}/>
);
return (
<View key = {items} styles = {styles.container}>
{items}
</View>
);
}
const styles = StyleSheet.create({
container : {
alignItems:'center',
}
})
export default TagList;
谢谢。
编辑: 我在组件之间放了一些日志,图像在一个 url 上,因为我没有足够的声誉哈哈
编辑2:
我刚刚创建了一个愚蠢的按钮来设置一个状态只是用一个字符串。在此状态更改后,应用程序会呈现列表。肯定是一个承诺问题,有人可以帮助我吗? =]
【问题讨论】:
-
我认为您需要将
key = {items}更改为其他内容,以便重新渲染。 -
能否在 taglist 函数中放置一些日志以查看该函数是否被执行?这样就更容易找出问题所在。
-
Colin,我尝试更改密钥,但没有任何反应。实际上,这个组件在另一个地方被使用并且它正在工作。我认为问题在于对象处理,也许我对对象索引感到困惑......
标签: reactjs react-native promise es6-promise react-props