Reactjs 数据更新时不呈现本机平面列表(Redux)

Reactjs 数据更新时不呈现本机平面列表(Redux),reactjs,react-native,redux,Reactjs,React Native,Redux,我有一个问题,我的平面列表没有呈现我要求的项目。我用来呈现列表的数据成功地从我的Redux存储中获得,我正在将存储水合到我呈现平面列表的同一个组件的componentDidMount中。我注意到组件两次点击render方法,但是在需要将数据提供给renderItem道具时,它似乎仍然没有数据 我在我的CardBuilder中放置了一个调试器,并注意到它在第一次对每个项目命中一次,但是由于this.props.picskit未定义,因此它不会呈现。即使在父元素中,picskitz已经在商店中进行了

我有一个问题,我的平面列表没有呈现我要求的项目。我用来呈现列表的数据成功地从我的Redux存储中获得,我正在将存储水合到我呈现平面列表的同一个组件的componentDidMount中。我注意到组件两次点击render方法,但是在需要将数据提供给renderItem道具时,它似乎仍然没有数据

我在我的CardBuilder中放置了一个调试器,并注意到它在第一次对每个项目命中一次,但是由于this.props.picskit未定义,因此它不会呈现。即使在父元素中,picskitz已经在商店中进行了氢化处理并且可以访问,它也不会再次被击中。如何让平面列表尝试使用原始数据源再次渲染?我最终想给它添加无限滚动,但现在我只想得到至少要渲染的前25个值(单页)。任何帮助都非常感激

这是我的组件:

componentDidMount(){
    const { dispatch, user, token, history } = this.props
    const { pageNumber } = this.state
    const LOGIN = 'LOGIN'
    if ( token && user ){
      dispatch({ type: LOGIN, user: {user, token} })
      dispatch(getAllPicskitz(pageNumber, token, history))
    } else {
        dispatch(getAllPicskitz(pageNumber, user.token, history))
    }
  }
这是我的清单:

 keyExtractor = ( picskit, index) => picskit.id.toString()

  render(){
    const { picskitz } = this.props

    return(
      <View style={styles.container}>
        <View style={styles.headerContainer}>
          <Image
            source={ require('../media/logo-with-color.png')}
          />
        </View>
        <FlatList
          data={picskitz}
          renderItem={ ({picskit}) => <CardBuilder picskit={picskit} /> }
          keyExtractor={this.keyExtractor}
        />
        <LowerNavBar />
      </View>
    )
  }
keyExtractor=(picskit,index)=>picskit.id.toString()
render(){
const{picskitz}=this.props
返回(
}
keyExtractor={this.keyExtractor}
/>
)
}
最后,这里是我试图呈现的“CardBuilder”组件:

  render(){
    const {picskit} = this.props
      if ( picskit !== undefined ){
        return (
          <View style={styles.container}>
            <View style={styles.headerContainer}>
              <View style={styles.titleContainer}>
                <Text style={styles.titleText}> {picskit.title} </Text>
              </View>
              <View style={styles.detailsContainer}>
                <View style={styles.viewsContainer}>
                  <Image
                    source={ require('../media/icon-glasses.png')}
                  />
                  <Text> {picskit.views} </Text>
                </View>
                <Text style={styles.detailsText}> {picskit.owner.name} </Text>
              </View>
            </View>

            <ImageBackground 
              source={{uri: JSON.parse(picskit.content)[0].aws_url}} 
              style={styles.mainImage}
              >
              <Image 
                source={ require('../media/frame-black.png')}
                style={{width: '100%', height: '100%'}} 
              />
            </ImageBackground>
          </View>
        )
      }
    return null
  } 
}
render(){
const{picskit}=this.props
if(picskit!==未定义){
返回(
{picskit.title}
{picskit.views}
{picskit.owner.name}
)
}
返回空
} 
}

我找到了一个可能的答案,但我不确定这是实现它的最有效或正确的方法。首先,我添加了一些条件逻辑,仅当我首先有数据时才呈现平面列表。看起来是这样的:

{ picskitz ?
    <FlatList
        data={picskitz}
        renderItem={ ({item}) => <CardBuilder item={item} /> }
        keyExtractor={(x, i) => i.toString() }
        onEndReached={this.loadMore}
    />
  :
    null
}
您会注意到调度正在等待,在再次调用render()之前,请确保数据正确位于存储区中,这意味着在呈现CardBuilder组件之前,FlatList现在将拥有50个完整列表(之前加载的25个)


如果有人提出建议,我非常乐意接受

我找到了一个可能的答案,但我不确定这是实现它的最有效或正确的方法。首先,我添加了一些条件逻辑,仅当我首先有数据时才呈现平面列表。看起来是这样的:

{ picskitz ?
    <FlatList
        data={picskitz}
        renderItem={ ({item}) => <CardBuilder item={item} /> }
        keyExtractor={(x, i) => i.toString() }
        onEndReached={this.loadMore}
    />
  :
    null
}
您会注意到调度正在等待,在再次调用render()之前,请确保数据正确位于存储区中,这意味着在呈现CardBuilder组件之前,FlatList现在将拥有50个完整列表(之前加载的25个)


如果有人提出建议,我非常乐意接受

如果平面列表的数据属性发生更改,则它将自动重新渲染。这意味着数据没有从redux存储成功传递到组件。无论您从存储中获取数据并将其作为道具传递到哪里,我都会开始仔细检查代码和调试。

如果平面列表的数据道具发生更改,则它将自动重新渲染。这意味着数据没有从redux存储成功传递到组件。无论您从存储中获取数据并将其作为道具传递到哪里,我都会开始仔细检查代码和调试。

您忘记将额外数据道具传递到您的平面列表

extraData={picskitz}

如果{picskitz}值发生变化,这会告诉FlatList重新加载

您忘记将extraData道具传递给FlatList

extraData={picskitz}

如果{picskitz}值更改

,如果数据(
picskitz
)只更改了很浅(它是相同的引用),那么它将不会触发渲染方法。如果数据(
picskitz
)只更改了很浅(它是相同的引用),那么它将不会触发渲染方法。感谢您的建议!我仔细检查了一遍,我确信正确地传递了存储数据并将其包含在我的组件中,我只是没有正确地格式化我的平面列表。谢谢你的建议!我仔细检查了一遍,我确信正确地传递了存储数据,并将其保存在我的组件中,我只是没有正确地格式化我的平面列表。