javascript - FlatList 不会在 Prop 更改时重新渲染

标签 javascript reactjs react-native react-redux

当 Prop 改变时,我的平面列表不会重新渲染。在这种情况下,我转到另一个页面并添加一个新的列表项,当我回到这个列表时它仍然有旧数据。在我刷新之前,新项目不存在。我为正确的 Prop 设置了额外的数据,但它不起作用。

import React, { Component } from 'react';
import { FlatList } from 'react-native';
import { connect } from 'react-redux';
import { Container, Text, Icon, Left, Right, ListItem, Thumbnail, Body, Content } from 'native-base';
import { removeDog, addDog } from '../actions';

class MyDogs extends Component {

    renderList() {
        if (this.props.myDogs.lendth === 0) {
            return (
                <Text>You have no saved dogs</Text>
            );
        }
        return (
            <FlatList 
            extraData={this.props.myDogs}
            data={this.props.myDogs}
            renderItem={({ item }) => {
                return (
                    <ListItem avatar>
                        <Left>
                            <Thumbnail 
                            source={{ uri: item.photo }} 
                            square
                            />
                        </Left>
                        <Body>
                            <Text>{item.name}</Text>
                            <Text note>{item.breed}</Text>
                        </Body>
                        <Right>
                            <Icon name='arrow-forward' />
                        </Right>
                    </ListItem>
                );
            }}
            keyExtractor={item => item.id}
            />
        );
    }

    render() {
        console.log(this.props.myDogs);
        return (
            <Container>
                <Content>
                    {this.renderList()}      
                </Content>
            </Container>
        );
    }
}

const mapStateToProps = state => {
    return { 
        myDogs: state.dogs.myDogs 
    };
};

export default connect(mapStateToProps, { removeDog, addDog })(MyDogs);

这是我的 reducer

import {
    ADD_DOG,
    REMOVE_DOG
} from '../actions/types';

const INITIAL_STATE = {
    myDogs: [],
    rejectedDogs: []
};

export default (state = INITIAL_STATE, action) => {
    let breedString = '';
    switch (action.type) {
        case ADD_DOG:
           // ... making breed string removed
                breedString = action.payload.breeds.breed.$t;
            
            state.myDogs.push({
                name: action.payload.name.$t,
                photo: action.payload.media.photos.photo[1].$t,
                id: action.payload.id.$t,
                breed: breedString.slice(0, -2)
            });
            return { ...state,
                myDogs: state.myDogs
            };
        default:
            return state;
    }
};

这里是我组合 reducer 的地方

import { combineReducers } from 'redux';
import FindDogsReducer from './FindDogsReducer';
import BreedReduce from './BreedReducer';
import SettingsReducer from './SettingsReducer';
import DogsReducer from './DogsReducer';


export default combineReducers({
    findDogsReducer: FindDogsReducer,
    dogs: DogsReducer,
    breeds: BreedReduce,
    settings: SettingsReducer
});

最佳答案

FlatList 是一个 PureComponent,因此它不会重新渲染,除非给它的引用发生变化。您当前正在使用 push 向您的 myDogs 数组添加一个新对象,这将改变当前状态。

相反,您想要创建一个全新的数组,其中包含当前处于状态的所有狗和您的新狗,它会起作用:

export default (state = INITIAL_STATE, action) => {
  let breedString = "";

  switch (action.type) {
    case ADD_DOG:
      breedString = action.payload.breeds.breed.$t;

      return {
        ...state,
        myDogs: [
          ...state.myDogs,
          {
            name: action.payload.name.$t,
            photo: action.payload.media.photos.photo[1].$t,
            id: action.payload.id.$t,
            breed: breedString.slice(0, -2)
          }
        ]
      };
    default:
      return state;
  }
};

关于javascript - FlatList 不会在 Prop 更改时重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51387834/

相关文章:

reactjs - 测试点击【React】后组件中的各个按钮是否被禁用

react-native - 从相机胶卷中获取图像的 Base64

javascript - 我单击时选择了多个元素,现在我只想要其中一个(单击功能类似于浏览器中的检查器)

javascript - 如何使用 Canvas 制作扫描仪效果线动画

reactjs - 使用 react 路由器在路线上 react 设置状态/属性

javascript - Axios Post 在调试中工作,但在 Android 发布版本中给出 "Network Error"

javascript - 如何在 ReactJs 中使用 Hooks useState 编写多行状态

javascript - 点击图片后全屏div

javascript - 适用于 macOS 的 Node.js 应用程序捆绑

reactjs - 如何修复在handleChange 函数上遇到的语法错误?