【问题标题】:Can't iterate child from real-time database firebase?无法从实时数据库 Firebase 中迭代子节点?
【发布时间】:2019-07-17 14:40:39
【问题描述】:

我试图从我的数据库中获取一个嵌套的孩子,这是一个结构

我想从 Gallery 对象中获取 URI 当我登录时,我可以在控制台中看到这个

这是一个代码:

componentWillMount() {
    const { gKey } = this.state;
    firebase
      .database()
      .ref(`providers/${gKey}`)
      .once("value")
      .then(async snapshot => {
        let aboutMe = snapshot.val().aboutMe;
        let uri = snapshot.val().galary;
        await this.setState({ aboutMe });
        console.log(uri);
        uri.forEach(childNodes => {
          console.log(childNodes); // I Got Error here
        });
      });
}

我遇到的错误

uri.forEach 不是函数

更新

我在父“画廊”中获取了所有 URI,并将其设置在一个数组中,并将其作为道具传递给一个组件现在在这个组件中并在一个我只看到一个主题图像中呈现它!

父屏幕

Class Parent extend Component{
constructor(props){
super(props)
 this.state={
        ...
        images:[], 
        aboutMe:""
        ...
}


    componentWillMount() {
    const { gKey } = this.state;
    firebase
      .database()
      .ref(`providers/${gKey}`)
      .once("value")
      .then(async snapshot => {
        let aboutMe = snapshot.val().aboutMe;
        let uri = snapshot.val().galary;
        await this.setState({ aboutMe });
        Object.values(uri).forEach(childNodes => {
          let images = [];
          images.push({
            uri: childNodes.uri
          });
          this.setState({ images });
        });
      });
}

render(){
return(
<View>
....
<GalaryScreen images={this.state.images} />
....
</View>
)}
}

Galary.js

class GalaryScreen extends Component {
  constructor(props) {
    super(props);
  }
  render() {
    return (
      <View style={styles.container}>
        <Text style={{ fontSize: 20, padding: 10, color: "#000" }}>Galary</Text>
        <FlatList
          horizontal
          key={Math.floor(Math.random() * 1000)}
          data={this.props.images}
          renderItem={({ item }) => {
            console.log(item.uri); // I can see every url here and all of them is a vaild URL 
            return (
              <View style={{ margin: 10 }}>
                <Image
                  key={Math.floor(Math.random() * 100)}
                  style={{ width: 100, height: 100 }}
                  source={{ uri: item.uri }}
                />
              </View>
            );
          }}
          keyExtractor={(item, index) => item.key}
        />
      </View>
    );
  }
}

export default GalaryScreen;

控制台

【问题讨论】:

  • 能否为获取数据的组件添加代码,然后将其传递给 GalaryScreen 组件?
  • 再检查一次,@TreyEckels

标签: javascript reactjs firebase react-native firebase-realtime-database


【解决方案1】:

问题似乎在这里:

Object.values(uri).forEach(childNodes => {
          let images = [];
          images.push({
            uri: childNodes.uri
          });
          this.setState({ images });
        });

let images = []; 位于您的 forEach 循环内,因此每次迭代时它总是只会保存 1 个图像。尝试在循环之外声明图像数组,并在退出循环后声明setState。你想做更多类似的事情:

let images = [] 
Object.values(uri).forEach(childNodes => { images.push({ uri: childNodes.uri }); }); 
this.setState({ images });

【讨论】:

  • 是的,我已经这样做了,但这是我的错,我忘记添加它`let images=[]`并将每张图片推送到这些,如果你在 galary 控制台中看到我可以看到每个 uri
  • 你可以在控制台看到每一个URI,因为状态每次都在变化,所以画廊代码每次渲染,控制台代码每次运行。画廊中的图像也每次都在变化,但它发生得如此之快,以至于你看不到它。你能告诉我们let images的代码以及你把它推到哪里吗?
  • 检查一下@TreyEckels
  • let images = []; 在您的 forEach 循环中,因此每次迭代时它总是只会保存 1 张图像。尝试在循环之外声明图像数组,并在退出循环后设置状态。你想做更多类似的事情:let images = [] Object.values(uri).forEach(childNodes =&gt; { images.push({ uri: childNodes.uri }); }); this.setState({ images });
  • 呃哦,这是一个大错误!是的,这就是我想要的,现在一开始你说的是“旁注”,那是我的代码还是一般的?
【解决方案2】:

forEach 用于Arrays 而不是Objects

如果你想通过那个对象循环,你必须这样做:

Object.values(uri).forEach(childNodes=>{
   console.log(childNodes); 
});

编辑。

forEacharrays 独有的,并且从未可用于对象。

如果您过去能够执行 uri.forEach,而不是更改服务器端,现在返回一个对象而不是数组。

解释我的代码:

Object.values 返回该对象内所有值的数组 例如:

const obj={a:"1",b:"2"}
Object.values(obj) .  //returns [ "1" , "2"]

之后就像您之前的代码一样执行了 forEach。

【讨论】:

  • 你能检查更新吗,@Auticcat
  • 嘿,我还有一个 Promise Object 如何获取它们的具体值 @Auticcat ,i.imgur.com/zth4wd5.png
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
相关资源
最近更新 更多