Javascript 此.state.foodReducer未定义

Javascript 此.state.foodReducer未定义,javascript,reactjs,react-native,redux,react-redux,Javascript,Reactjs,React Native,Redux,React Redux,FoodList.js import React, { Component } from "react"; import { View, Text, FlatList } from "react-native"; import { Content, List, ListItem } from "native-base"; import { useSelector, useDispatch } from "react-redux

FoodList.js

import React, { Component } from "react";
import { View, Text, FlatList } from "react-native";
import { Content, List, ListItem } from "native-base";
import { useSelector, useDispatch } from "react-redux";
import { deleteFood } from "../../redux/actions/food";

const FoodList = () => {    
  const dispatch = useDispatch();
  const deleteCurrent = (key) => dispatch(deleteFood(key));
  const foods = useSelector((state) => state.foodReducer.FoodList);  <------------

  return (
    <FlatList
      data={foods}
      keyExtractor={(item, index) => item.key.toString()}
      renderItem={(data) => <ListItem title={data.item.name} />}
    />
  );
};

export default FoodList;
import { useDispatch } from "react-redux";
import { addFood } from "../../redux/actions/food";

const FoodCreate = ({ navigation: { goBack } }) => {
  const [food, setFood] = useState("");

  const dispatch = useDispatch();

  const submitFood = (food) => dispatch(addFodd(food));


  return (
    <Container>
      <Header>
        <Left>
          <Button transparent>
            <Icon
              name="arrow-back"
              onPress={() => this.props.navigation.goBack()}
              style={{ fontSize: 25, color: "red" }}
            />
          </Button>
        </Left>
        <Body>
          <Title>Add Food</Title>
        </Body>
        <Right>
          <Button transparent>
            <Icon
              name="checkmark"
              style={{ fontSize: 25, color: "red" }}
              onPress={() => {
                submitFood(food);
                setFood("");
              }}
            />
          </Button>
        </Right>
      </Header>
      <View style={{ alignItems: "center", top: hp("3%") }}>
        <TextInput
          placeholder="Food Name"
          placeholderTextColor="white"
          style={styles.inptFood}
          value={food}
          onChangeText={(food) => setFood(food)}
        />
      </View>
import { ADD_FOOD, DELETE_FOOD } from "./types";

export const addFood = (food) => ({
  type: ADD_FOOD,
  data: food,
});

export const deleteFood = (key) => ({
  type: DELETE_FOOD,
  key: key,
});
import { createStore, combineReducers } from "redux";
import foodReducer from "../reducers/foodReducer";

const rootReducer = combineReducers({
  foodReducer: foodReducer,
});

const configureStore = () => createStore(rootReducer);

export default configureStore;
export const ADD_FOOD = "ADD_FOOD";
export const DELETE_FOOD = "DELETE_FOOD";
import { ADD_FOOD, DELETE_FOOD } from "../actions/types";

const initialState = {
  FoodList: [],
};

const foodReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.concat({
          key: Math.random(),
          name: action.data,
        }),
      };
    case DELETE_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.filter((item) => item.key != action.key),
      };
    default:
      return state;
  }
};

export default foodReducer;
import FoodListScreen from "./components/Main/FoodList.js";
import configureStore from "./redux/store/store";
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const store =
  (createStore(rootReducer, applyMiddleware(thunk)), configureStore());

return (
      <Provider store={store}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="FoodCreate"
              component={FoodCreateScreen}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name="FoodList"
              component={FoodListScreen}
              options={{ headerShown: false }}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </Provider>
store/store.js

import React, { Component } from "react";
import { View, Text, FlatList } from "react-native";
import { Content, List, ListItem } from "native-base";
import { useSelector, useDispatch } from "react-redux";
import { deleteFood } from "../../redux/actions/food";

const FoodList = () => {    
  const dispatch = useDispatch();
  const deleteCurrent = (key) => dispatch(deleteFood(key));
  const foods = useSelector((state) => state.foodReducer.FoodList);  <------------

  return (
    <FlatList
      data={foods}
      keyExtractor={(item, index) => item.key.toString()}
      renderItem={(data) => <ListItem title={data.item.name} />}
    />
  );
};

export default FoodList;
import { useDispatch } from "react-redux";
import { addFood } from "../../redux/actions/food";

const FoodCreate = ({ navigation: { goBack } }) => {
  const [food, setFood] = useState("");

  const dispatch = useDispatch();

  const submitFood = (food) => dispatch(addFodd(food));


  return (
    <Container>
      <Header>
        <Left>
          <Button transparent>
            <Icon
              name="arrow-back"
              onPress={() => this.props.navigation.goBack()}
              style={{ fontSize: 25, color: "red" }}
            />
          </Button>
        </Left>
        <Body>
          <Title>Add Food</Title>
        </Body>
        <Right>
          <Button transparent>
            <Icon
              name="checkmark"
              style={{ fontSize: 25, color: "red" }}
              onPress={() => {
                submitFood(food);
                setFood("");
              }}
            />
          </Button>
        </Right>
      </Header>
      <View style={{ alignItems: "center", top: hp("3%") }}>
        <TextInput
          placeholder="Food Name"
          placeholderTextColor="white"
          style={styles.inptFood}
          value={food}
          onChangeText={(food) => setFood(food)}
        />
      </View>
import { ADD_FOOD, DELETE_FOOD } from "./types";

export const addFood = (food) => ({
  type: ADD_FOOD,
  data: food,
});

export const deleteFood = (key) => ({
  type: DELETE_FOOD,
  key: key,
});
import { createStore, combineReducers } from "redux";
import foodReducer from "../reducers/foodReducer";

const rootReducer = combineReducers({
  foodReducer: foodReducer,
});

const configureStore = () => createStore(rootReducer);

export default configureStore;
export const ADD_FOOD = "ADD_FOOD";
export const DELETE_FOOD = "DELETE_FOOD";
import { ADD_FOOD, DELETE_FOOD } from "../actions/types";

const initialState = {
  FoodList: [],
};

const foodReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.concat({
          key: Math.random(),
          name: action.data,
        }),
      };
    case DELETE_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.filter((item) => item.key != action.key),
      };
    default:
      return state;
  }
};

export default foodReducer;
import FoodListScreen from "./components/Main/FoodList.js";
import configureStore from "./redux/store/store";
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const store =
  (createStore(rootReducer, applyMiddleware(thunk)), configureStore());

return (
      <Provider store={store}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="FoodCreate"
              component={FoodCreateScreen}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name="FoodList"
              component={FoodListScreen}
              options={{ headerShown: false }}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </Provider>
动作/类型.js

import React, { Component } from "react";
import { View, Text, FlatList } from "react-native";
import { Content, List, ListItem } from "native-base";
import { useSelector, useDispatch } from "react-redux";
import { deleteFood } from "../../redux/actions/food";

const FoodList = () => {    
  const dispatch = useDispatch();
  const deleteCurrent = (key) => dispatch(deleteFood(key));
  const foods = useSelector((state) => state.foodReducer.FoodList);  <------------

  return (
    <FlatList
      data={foods}
      keyExtractor={(item, index) => item.key.toString()}
      renderItem={(data) => <ListItem title={data.item.name} />}
    />
  );
};

export default FoodList;
import { useDispatch } from "react-redux";
import { addFood } from "../../redux/actions/food";

const FoodCreate = ({ navigation: { goBack } }) => {
  const [food, setFood] = useState("");

  const dispatch = useDispatch();

  const submitFood = (food) => dispatch(addFodd(food));


  return (
    <Container>
      <Header>
        <Left>
          <Button transparent>
            <Icon
              name="arrow-back"
              onPress={() => this.props.navigation.goBack()}
              style={{ fontSize: 25, color: "red" }}
            />
          </Button>
        </Left>
        <Body>
          <Title>Add Food</Title>
        </Body>
        <Right>
          <Button transparent>
            <Icon
              name="checkmark"
              style={{ fontSize: 25, color: "red" }}
              onPress={() => {
                submitFood(food);
                setFood("");
              }}
            />
          </Button>
        </Right>
      </Header>
      <View style={{ alignItems: "center", top: hp("3%") }}>
        <TextInput
          placeholder="Food Name"
          placeholderTextColor="white"
          style={styles.inptFood}
          value={food}
          onChangeText={(food) => setFood(food)}
        />
      </View>
import { ADD_FOOD, DELETE_FOOD } from "./types";

export const addFood = (food) => ({
  type: ADD_FOOD,
  data: food,
});

export const deleteFood = (key) => ({
  type: DELETE_FOOD,
  key: key,
});
import { createStore, combineReducers } from "redux";
import foodReducer from "../reducers/foodReducer";

const rootReducer = combineReducers({
  foodReducer: foodReducer,
});

const configureStore = () => createStore(rootReducer);

export default configureStore;
export const ADD_FOOD = "ADD_FOOD";
export const DELETE_FOOD = "DELETE_FOOD";
import { ADD_FOOD, DELETE_FOOD } from "../actions/types";

const initialState = {
  FoodList: [],
};

const foodReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.concat({
          key: Math.random(),
          name: action.data,
        }),
      };
    case DELETE_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.filter((item) => item.key != action.key),
      };
    default:
      return state;
  }
};

export default foodReducer;
import FoodListScreen from "./components/Main/FoodList.js";
import configureStore from "./redux/store/store";
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const store =
  (createStore(rootReducer, applyMiddleware(thunk)), configureStore());

return (
      <Provider store={store}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="FoodCreate"
              component={FoodCreateScreen}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name="FoodList"
              component={FoodListScreen}
              options={{ headerShown: false }}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </Provider>
reducers/foodReducer.js

import React, { Component } from "react";
import { View, Text, FlatList } from "react-native";
import { Content, List, ListItem } from "native-base";
import { useSelector, useDispatch } from "react-redux";
import { deleteFood } from "../../redux/actions/food";

const FoodList = () => {    
  const dispatch = useDispatch();
  const deleteCurrent = (key) => dispatch(deleteFood(key));
  const foods = useSelector((state) => state.foodReducer.FoodList);  <------------

  return (
    <FlatList
      data={foods}
      keyExtractor={(item, index) => item.key.toString()}
      renderItem={(data) => <ListItem title={data.item.name} />}
    />
  );
};

export default FoodList;
import { useDispatch } from "react-redux";
import { addFood } from "../../redux/actions/food";

const FoodCreate = ({ navigation: { goBack } }) => {
  const [food, setFood] = useState("");

  const dispatch = useDispatch();

  const submitFood = (food) => dispatch(addFodd(food));


  return (
    <Container>
      <Header>
        <Left>
          <Button transparent>
            <Icon
              name="arrow-back"
              onPress={() => this.props.navigation.goBack()}
              style={{ fontSize: 25, color: "red" }}
            />
          </Button>
        </Left>
        <Body>
          <Title>Add Food</Title>
        </Body>
        <Right>
          <Button transparent>
            <Icon
              name="checkmark"
              style={{ fontSize: 25, color: "red" }}
              onPress={() => {
                submitFood(food);
                setFood("");
              }}
            />
          </Button>
        </Right>
      </Header>
      <View style={{ alignItems: "center", top: hp("3%") }}>
        <TextInput
          placeholder="Food Name"
          placeholderTextColor="white"
          style={styles.inptFood}
          value={food}
          onChangeText={(food) => setFood(food)}
        />
      </View>
import { ADD_FOOD, DELETE_FOOD } from "./types";

export const addFood = (food) => ({
  type: ADD_FOOD,
  data: food,
});

export const deleteFood = (key) => ({
  type: DELETE_FOOD,
  key: key,
});
import { createStore, combineReducers } from "redux";
import foodReducer from "../reducers/foodReducer";

const rootReducer = combineReducers({
  foodReducer: foodReducer,
});

const configureStore = () => createStore(rootReducer);

export default configureStore;
export const ADD_FOOD = "ADD_FOOD";
export const DELETE_FOOD = "DELETE_FOOD";
import { ADD_FOOD, DELETE_FOOD } from "../actions/types";

const initialState = {
  FoodList: [],
};

const foodReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.concat({
          key: Math.random(),
          name: action.data,
        }),
      };
    case DELETE_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.filter((item) => item.key != action.key),
      };
    default:
      return state;
  }
};

export default foodReducer;
import FoodListScreen from "./components/Main/FoodList.js";
import configureStore from "./redux/store/store";
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const store =
  (createStore(rootReducer, applyMiddleware(thunk)), configureStore());

return (
      <Provider store={store}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="FoodCreate"
              component={FoodCreateScreen}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name="FoodList"
              component={FoodListScreen}
              options={{ headerShown: false }}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </Provider>
App.js

import React, { Component } from "react";
import { View, Text, FlatList } from "react-native";
import { Content, List, ListItem } from "native-base";
import { useSelector, useDispatch } from "react-redux";
import { deleteFood } from "../../redux/actions/food";

const FoodList = () => {    
  const dispatch = useDispatch();
  const deleteCurrent = (key) => dispatch(deleteFood(key));
  const foods = useSelector((state) => state.foodReducer.FoodList);  <------------

  return (
    <FlatList
      data={foods}
      keyExtractor={(item, index) => item.key.toString()}
      renderItem={(data) => <ListItem title={data.item.name} />}
    />
  );
};

export default FoodList;
import { useDispatch } from "react-redux";
import { addFood } from "../../redux/actions/food";

const FoodCreate = ({ navigation: { goBack } }) => {
  const [food, setFood] = useState("");

  const dispatch = useDispatch();

  const submitFood = (food) => dispatch(addFodd(food));


  return (
    <Container>
      <Header>
        <Left>
          <Button transparent>
            <Icon
              name="arrow-back"
              onPress={() => this.props.navigation.goBack()}
              style={{ fontSize: 25, color: "red" }}
            />
          </Button>
        </Left>
        <Body>
          <Title>Add Food</Title>
        </Body>
        <Right>
          <Button transparent>
            <Icon
              name="checkmark"
              style={{ fontSize: 25, color: "red" }}
              onPress={() => {
                submitFood(food);
                setFood("");
              }}
            />
          </Button>
        </Right>
      </Header>
      <View style={{ alignItems: "center", top: hp("3%") }}>
        <TextInput
          placeholder="Food Name"
          placeholderTextColor="white"
          style={styles.inptFood}
          value={food}
          onChangeText={(food) => setFood(food)}
        />
      </View>
import { ADD_FOOD, DELETE_FOOD } from "./types";

export const addFood = (food) => ({
  type: ADD_FOOD,
  data: food,
});

export const deleteFood = (key) => ({
  type: DELETE_FOOD,
  key: key,
});
import { createStore, combineReducers } from "redux";
import foodReducer from "../reducers/foodReducer";

const rootReducer = combineReducers({
  foodReducer: foodReducer,
});

const configureStore = () => createStore(rootReducer);

export default configureStore;
export const ADD_FOOD = "ADD_FOOD";
export const DELETE_FOOD = "DELETE_FOOD";
import { ADD_FOOD, DELETE_FOOD } from "../actions/types";

const initialState = {
  FoodList: [],
};

const foodReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.concat({
          key: Math.random(),
          name: action.data,
        }),
      };
    case DELETE_FOOD:
      return {
        ...state,
        FoodList: state.FoodList.filter((item) => item.key != action.key),
      };
    default:
      return state;
  }
};

export default foodReducer;
import FoodListScreen from "./components/Main/FoodList.js";
import configureStore from "./redux/store/store";
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
const store =
  (createStore(rootReducer, applyMiddleware(thunk)), configureStore());

return (
      <Provider store={store}>
        <NavigationContainer>
          <Stack.Navigator>
            <Stack.Screen
              name="FoodCreate"
              component={FoodCreateScreen}
              options={{ headerShown: false }}
            />
            <Stack.Screen
              name="FoodList"
              component={FoodListScreen}
              options={{ headerShown: false }}
            />
          </Stack.Navigator>
        </NavigationContainer>
      </Provider>
从“/components/Main/FoodList.js”导入FoodListScreen;
从“/redux/store/store”导入configureStore;
const Stack=createStackNavigator();
const Tab=createBottomTabNavigator();
康斯特商店=
(createStore(rootReducer,applyMiddleware(thunk)),configureStore());
返回(
大家好,我是redux新手,我正尝试在我的节食应用程序中使用它,用户在FoodCreate.js中创建了一个食物项目,它将在FoodList.js中列出,当我运行代码时,它会返回以下错误:
state.foodReducer.FoodList未定义
,我在给出错误的代码行旁边放了一个箭头,我通过以下YouTube教程使用此方法:,提前感谢您的帮助。

好的,也许我找到了

//In your store/store.js

import { createStore, combineReducers,applyMiddleware } from "redux";
import thunk from 'redux-thunk'
import foodReducer from "../reducers/foodReducer";

const configureStore = () => {
 const store = createStore(
  combineReducers({
    foodReducer: foodReducer,
  }),
  applyMiddleware(thunk)

);

  return store;
}

export default configureStore;


//In your App.js
...

import configureStore from "./redux/store/store";
const store = ConfigureStore();

return(
  <Provider store={store}>
      ...
  </Provider>
)
//在您的商店中/store.js
从“redux”导入{createStore、CombineReducer、applyMiddleware};
从“redux thunk”导入thunk
从“./还原剂/食品还原剂”导入食品还原剂;
常量配置存储=()=>{
const store=createStore(
组合传感器({
foodReducer:foodReducer,
}),
applyMiddleware(thunk)
);
退货店;
}
导出默认配置存储;
//在你的App.js中
...
从“/redux/store/store”导入configureStore;
const store=ConfigureStore();
返回(
...
)

是的,我这样做了,如果你调试const foods=useSelector((state)=>state);console.log(foods)它什么也不返回,我运行它,它只是不断显示我更新的相同错误,所以你可以在你的App.js中看到App.js你错过了“redux thunk”的导入thunk和“redux”的导入{applyMiddleware}