重新呈现平面列表,不会自动上传任何项目

时间:2020-07-07 20:20:36

标签: javascript android ios reactjs react-native

我在React Native中有一个平面列表,但是我按下按钮保存后不会自动重新加载数据,也没有以最平坦的状态呈现,但是我重新加载了应用程序,并且出现了保存项

我需要按一下按钮,将数据自动呈现数据自动保存到flatList中,我需要帮助,我使用的方法非常有用,但对我不起作用

我有列表筛选此保存单位列表

标题

class ListScreen extends Component {



  /**
   * Constructor.
   */
  constructor(props) {

    super(props);

    this.state = {
      listData: [],
    };

  } /* End constructor. */


  /**
   * Render this component.
   */
  render() {
    return (

      <Root>
        <View style={styles.listScreenContainer}>
          { /* ########## Add Restaurant button ########## */}
          <CustomButton
            text="Add Restaurant"
            width="94%"
            onPress={() => { this.props.navigation.navigate("AddScreen"); }}
          />
          { /* ########## Restaurant list ########## */}
          <FlatList
            style={styles.restaurantList}
            data={this.state.listData}
            renderItem={({ item }) =>
              <View style={styles.restaurantContainer}>
                <Text style={styles.restaurantName}>{item.name}</Text>
                <CustomButton
                  text="Delete"
                  onPress={() => {
                    Alert.alert(
                      "Please confirm",
                      "Are you sure you want to delete this restaurant?",
                      [
                        {
                          text: "Yes", onPress: () => {
                            // Pull data out of storage.
                            AsyncStorage.getItem("restaurants",
                              function (inError, inRestaurants) {
                                if (inRestaurants === null) {
                                  inRestaurants = [];
                                } else {
                                  inRestaurants = JSON.parse(inRestaurants);
                                }
                                // Find the right one to delete and splice it out.
                                for (let i = 0; i < inRestaurants.length; i++) {
                                  const restaurant = inRestaurants[i];
                                  if (restaurant.key === item.key) {
                                    inRestaurants.splice(i, 1);
                                    break;
                                  }
                                }
                                // Store updated data in storage.
                                AsyncStorage.setItem("restaurants",
                                  JSON.stringify(inRestaurants), function () {
                                    // Set new state to update list.
                                    this.setState({ listData: inRestaurants });
                                    // Show toast message to confirm deletion.
                                    Toast.show({
                                      text: "Restaurant deleted",
                                      position: "bottom",
                                      type: "danger",
                                      duration: 2000
                                    });
                                  }.bind(this)
                                );
                              }.bind(this)
                            );
                          }
                        },
                        { text: "No" },
                        { text: "Cancel", style: "cancel" }
                      ],
                      { cancelable: true }
                    )
                  }} />
              </View>
            }
          />
        </View>
      </Root>

    );
  } /* End render(). */


  /**
   * Execute after the component mounts.
   */
  componentDidMount() {

    // Block hardware back button on Android.
    BackHandler.addEventListener(
      "hardwareBackPress", () => { return true; }
    );

    // Get list of restaurants.
    AsyncStorage.getItem("restaurants",
      function (inError, inRestaurants) {
        if (inRestaurants === null) {
          inRestaurants = [];
        } else {
          inRestaurants = JSON.parse(inRestaurants);
        }
        this.setState({ listData: inRestaurants });
      }.bind(this)
    );

  }; /* End componentDidMount() */


} /* End ListScreen. */


/**
 * #############################################################################
 * Add screen.
 * #############################################################################
 */
class AddScreen extends Component {


  /**
   * Constructor.
   */
  constructor(props) {

    super(props);

    this.state = {
      name: "",
      cuisine: "",
      price: "",
      rating: "",
      phone: "",
      address: "",
      webSite: "",
      delivery: "",
      key: `r_${new Date().getTime()}`
    };

  } /* End constructor. */


  /**
   * Render this component.
   */
  render() {
    return (

      <ScrollView style={styles.addScreenContainer}>
        <View style={styles.addScreenInnerContainer}>
          <View style={styles.addScreenFormContainer}>
            { /* ########## Name ########## */}
            <CustomTextInput
              label="Name"
              maxLength={20}
              stateHolder={this}
              stateFieldName="name"
            />
            { /* ########## Cuisine ########## */}
            <Text style={styles.fieldLabel}>Cuisine</Text>
            <View style={styles.pickerContainer}>
              <Picker
                style={styles.picker}
                prompt="Cuisine"
                selectedValue={this.state.cuisine}
                onValueChange={
                  (inItemValue) => this.setState({ cuisine: inItemValue })
                }
              >
                <Picker.Item label="" value="" />
                <Picker.Item label="Algerian" value="Algerian" />
                <Picker.Item label="American" value="American" />
                <Picker.Item label="BBQ" value="BBQ" />
                <Picker.Item label="Belgian" value="Belgian" />
                <Picker.Item label="Brazilian" value="Brazilian" />
                <Picker.Item label="British" value="British" />
                <Picker.Item label="Cajun" value="Cajun" />
                <Picker.Item label="Canadian" value="Canadian" />
                <Picker.Item label="Chinese" value="Chinese" />
                <Picker.Item label="Cuban" value="Cuban" />
                <Picker.Item label="Egyptian" value="Egyptian" />
                <Picker.Item label="Filipino" value="Filipino" />
                <Picker.Item label="French" value="French" />
                <Picker.Item label="German" value="German" />
                <Picker.Item label="Greek" value="Greek" />
                <Picker.Item label="Haitian" value="Haitian" />
                <Picker.Item label="Hawaiian" value="Hawaiian" />
                <Picker.Item label="Indian" value="Indian" />
                <Picker.Item label="Irish" value="Irish" />
                <Picker.Item label="Italian" value="Italian" />
                <Picker.Item label="Japanese" value="Japanese" />
                <Picker.Item label="Jewish" value="Jewish" />
                <Picker.Item label="Kenyan" value="Kenyan" />
                <Picker.Item label="Korean" value="Korean" />
                <Picker.Item label="Latvian" value="Latvian" />
                <Picker.Item label="Libyan" value="Libyan" />
                <Picker.Item label="Mediterranean" value="Mediterranean" />
                <Picker.Item label="Mexican" value="Mexican" />
                <Picker.Item label="Mormon" value="Mormon" />
                <Picker.Item label="Nigerian" value="Nigerian" />
                <Picker.Item label="Other" value="Other" />
                <Picker.Item label="Peruvian" value="Peruvian" />
                <Picker.Item label="Polish" value="Polish" />
                <Picker.Item label="Portuguese" value="Portuguese" />
                <Picker.Item label="Russian" value="Russian" />
                <Picker.Item label="Salvadorian" value="Salvadorian" />
                <Picker.Item label="Sandwiche Shop" value="Sandwiche Shop" />
                <Picker.Item label="Scottish" value="Scottish" />
                <Picker.Item label="Seafood" value="Seafood" />
                <Picker.Item label="Spanish" value="Spanish" />
                <Picker.Item label="Steak House" value="Steak House" />
                <Picker.Item label="Sushi" value="Sushi" />
                <Picker.Item label="Swedish" value="Swedish" />
                <Picker.Item label="Tahitian" value="Tahitian" />
                <Picker.Item label="Thai" value="Thai" />
                <Picker.Item label="Tibetan" value="Tibetan" />
                <Picker.Item label="Turkish" value="Turkish" />
                <Picker.Item label="Welsh" value="Welsh" />
              </Picker>
            </View>
            { /* ########## Price ########## */}
            <Text style={styles.fieldLabel}>Price</Text>
            <View style={styles.pickerContainer}>
              <Picker
                style={styles.picker}
                selectedValue={this.state.price}
                prompt="Price"
                onValueChange={
                  (inItemValue) => this.setState({ price: inItemValue })
                }
              >
                <Picker.Item label="" value="" />
                <Picker.Item label="1" value="1" />
                <Picker.Item label="2" value="2" />
                <Picker.Item label="3" value="3" />
                <Picker.Item label="4" value="4" />
                <Picker.Item label="5" value="5" />
              </Picker>
            </View>
            { /* ########## Rating ########## */}
            <Text style={styles.fieldLabel}>Rating</Text>
            <View style={styles.pickerContainer}>
              <Picker
                style={styles.picker}
                selectedValue={this.state.rating}
                prompt="Rating"
                onValueChange={
                  (inItemValue) => this.setState({ rating: inItemValue })
                }
              >
                <Picker.Item label="" value="" />
                <Picker.Item label="1" value="1" />
                <Picker.Item label="2" value="2" />
                <Picker.Item label="3" value="3" />
                <Picker.Item label="4" value="4" />
                <Picker.Item label="5" value="5" />
              </Picker>
            </View>
            { /* ########## Phone ########## */}
            <CustomTextInput
              label="Phone Number"
              maxLength={20}
              stateHolder={this}
              stateFieldName="phone"
            />
            { /* ########## Address ########## */}
            <CustomTextInput
              label="Address"
              maxLength={20}
              stateHolder={this}
              stateFieldName="address"
            />
            { /* ########## Web Site ########## */}
            <CustomTextInput
              label="Web Site"
              maxLength={20}
              stateHolder={this}
              stateFieldName="webSite"
            />
            { /* ########## Delivery ########## */}
            <Text style={styles.fieldLabel}>Delivery?</Text>
            <View style={styles.pickerContainer}>
              <Picker
                style={styles.picker}
                prompt="Delivery?"
                selectedValue={this.state.delivery}
                onValueChange={
                  (inItemValue) => this.setState({ delivery: inItemValue })
                }
              >
                <Picker.Item label="" value="" />
                <Picker.Item label="Yes" value="Yes" />
                <Picker.Item label="No" value="No" />
              </Picker>
            </View>
          </View>
          { /* ########## Buttons ########## */}
          <View style={styles.addScreenButtonsContainer}>
            <CustomButton
              text="Cancel"
              width="44%"
              onPress={
                () => { this.props.navigation.navigate("ListScreen"); }
              }
            />
            <CustomButton
              text="Save"
              width="44%"
              onPress={() => {
                AsyncStorage.getItem("restaurants",
                  function (inError, inRestaurants) {
                    if (inRestaurants === null) {
                      inRestaurants = [];
                    } else {
                      inRestaurants = JSON.parse(inRestaurants);
                    }
                    inRestaurants.push(this.state);
                    AsyncStorage.setItem("restaurants",
                      JSON.stringify(inRestaurants), function () {
                        this.setState({ listData: inRestaurants }, () => {
                          console.log(this.state.listData)
                        })
                        this.props.navigation.navigate("ListScreen");
                        Toast.show({
                          text: "Restaurant save",
                          position: "bottom",
                          type: "success",
                          duration: 2000
                        });

                      }.bind(this)
                    );
                  }.bind(this)
                );
              }}
            />
          </View>
        </View>
      </ScrollView>

    );
  } /* End render(). */


} /* End AddScreen. */


const styles = StyleSheet.create({

  listScreenContainer: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center",
    ...Platform.select({
      ios: { paddingTop: Constants.statusBarHeight },
      android: {}
    })
  },

  restaurantList: {
    width: "94%"
  },

  restaurantContainer: {
    flexDirection: "row",
    marginTop: 4,
    marginBottom: 4,
    borderColor: "#e0e0e0",
    borderBottomWidth: 2,
    alignItems: "center"
  },

  restaurantName: {
    flex: 1
  },

  addScreenContainer: {
    marginTop: Constants.statusBarHeight
  },

  addScreenInnerContainer: {
    flex: 1,
    alignItems: "center",
    paddingTop: 20,
    width: "100%"
  },

 
  pickerContainer: {
    ...Platform.select({
      ios: {},
      android: {
        width: "96%", borderRadius: 8, borderColor: "#c0c0c0", borderWidth: 2,
        marginLeft: 10, marginBottom: 20, marginTop: 4
      }
    })
  },

  picker: {
    ...Platform.select({
      ios: {
        width: "96%", borderRadius: 8, borderColor: "#c0c0c0", borderWidth: 2,
        marginLeft: 10, marginBottom: 20, marginTop: 4
      },
      android: {}
    })
  },


  addScreenButtonsContainer: {
    flexDirection: "row",
    justifyContent: "center"
  }
})


// export default function RestaurantScreens ({ navigation }) {
//         return (  
//             // <View style={styles.homeScreen}>
//             //     <Text>hola desde RestaurantScreens</Text>
//             //     <Button
//             //     title="Go to DesicionScreens"
//             //     onPress={() => navigation.navigate('PeopleScreen')}
//             //    />
//             // </View>
//             <View>
//                 <ListScreen />
//             </View>

//         );

// }

// const styles = StyleSheet.create({
//     homeScreen: {
//       flex: 1,
//       alignItems: 'center',
//       justifyContent: 'center',
//     },

// })

const stack = createStackNavigator();

const RestaurantScreen = ({ navigation }) => (
  <stack.Navigator initialRouteName="ListScreen" headerMode="none">
    <stack.Screen name="ListScreen" component={ListScreen} />
    <stack.Screen name="AddScreen" component={AddScreen} />
  </stack.Navigator>
)

export default RestaurantScreen;

1 个答案:

答案 0 :(得分:0)

我认为ListScreen不会重新呈现,这是您执行this.props.navigation.navigate("ListScreen");时的预期行为。您可以执行this.props.navigation.push("ListScreen");来强制重新渲染屏幕。

另一种方法是将数据发送到导航参数中,如下所示:

this.props.navigation.navigate("ListScreen", { data: listData }); 

在listScreen中,您可以执行此操作

const data = this.props.navigation.getParam('data');