#react-native #redux #react-redux
Вопрос:
Я решил, что мне нужно использовать redux в своем приложении, и начал изменять свое приложение, чтобы использовать redux. У меня возникли трудности с отображением списка данных на моем экране, в консоли нет ошибок. У меня есть настроенный магазин и редуктор, и я использую модели, все, кажется, работает нормально. мой экран отображается, но данные в моем магазине не отображаются. Кто-нибудь может понять, где я иду не так?
import * as React from "react";
import {
View,
StyleSheet,
FlatList,
SafeAreaView,
Dimensions,
TouchableOpacity,
Image,
Text,
} from "react-native";
import { useSelector } from "react-redux";
import BigButton from "../components/BigButton.js";
import HomeScreenImage from "../components/HomeScreenImage.js";
//import HomeData from "../data/HomeData";
import colors from "../constants/colors.js";
const HomeScreen = (props, navigation) => {
const exercise = useSelector((state) => state.exercise.homeData);
return (
<View style={styles.containerTop}>
<View>
<HomeScreenImage style={styles.top} />
<View style={styles.top}>
<BigButton title="Beast" />
</View>
</View>
<SafeAreaView style={styles.flatListContainer}>
<FlatList
data={exercise}
keyExtractor={(item) => item.id}
renderItem={(itemData) => (
<TouchableOpacity
activeOpacity={0.8}
style={styles.container}
onPress={() => {
{
if (itemData.item.id == 1) {
props.navigation.push("Body");
} else if (itemData.item.id == 2) {
props.navigation.push("PreMade");
} else if (itemData.item.id == 3) {
props.navigation.push("Stats");
} else if (itemData.item.id == 4) {
props.navigation.push("History");
} else if (itemData.item.id == 5) {
props.navigation.push("CreateTrack");
} else props.navigation.push("TrackList");
}
}}
>
<View style={styles.cardContainer}>
<Image style={styles.imageStyle} source={itemData.Item.image} />
<View style={styles.infoStyle}>
<Text style={styles.titleStyle}>{itemData.item.name}</Text>
<Text style={styles.bodyTextStyle}>{itemData.item.body}</Text>
</View>
</View>
</TouchableOpacity>
)}
/>
</SafeAreaView>
</View>
);
};
редуктор ниже
import HOMEDATA from "../../data/HomeData";
import CATEGORIES from "../../data/CategoryData";
import EXERCISE from "../../data/ExerciseData";
import MEMBERSHIPDATA from "../../data/MembershipData";
const initialState = {
homeData: HOMEDATA,
categories: CATEGORIES,
exercises: EXERCISE,
membershipData: MEMBERSHIPDATA,
};
export default (state = initialState, action) => {
return state;
};
Комментарии:
1. Предполагая, что элемент useSelector возвращает массив, я не вижу ничего плохого. Попробуйте изменить значение
keyExtractor
наkeyExtractor={(item) => item.id.toString()}
(но я сомневаюсь, что это исправит проблему). Вы пробовали использовать значение константexercise
вместо «извлечения» из магазина?2. Спасибо Вам за ответ. Iv запустите console.log(store.getState()) в App.js. В консоли я возвращаю это: объект не определен. Я отредактирую свой вопрос, включив в него редуктор, чтобы посмотреть, добавит ли он немного больше ясности для людей.
Ответ №1:
Я нашел решение. Способ экспорта данных не работал с react-redux. Раньше это было нормально, но при использовании экспорта с помощью redux он не импортировал его и позволял мне отображать его на экране.
вот как у меня это было раньше:
import Category from "../models/Category";
export const CATEGORIES = [
new Category(
"c1",
"Chest",
require("../assets/images/FlatBenchPress.jpg"),
"Time To Unleash The Beast"
),
new Category(
"c3",
"Shoulders",
require("../assets/images/ShouldersPic.jpg"),
"5% Human, 95% Beast, 100% Prepared To Destroy My Challenges"
),
new Category(
"c2",
"Back",
require("../assets/images/ChickB.jpg"),
"The Pain You Feel Today, Will Be The Strenght You Need Tomorrow"
),
new Category(
"c4",
"Biceps",
require("../assets/images/Bicep.jpg"),
"You Gotta Be A Beast There Is No Other Option"
),
new Category(
"c5",
"Triceps",
require("../assets/images/TriPic.jpg"),
"Train Strong, Positive And Full Of Beast Mode"
),
new Category(
"c8",
"Forearms",
require("../assets/images/MenuTop.jpg"),
"A Beast Never Fails"
),
new Category(
"c6",
"Abs",
require("../assets/images/AbsPic.jpg"),
"There Is Time To Rest But It Is Not That Time Now, Now Is Time For Beast Mode"
),
new Category(
"c7",
"Legs",
require("../assets/images/LegsPic.jpg"),
"A Real Beast Is Put To The Test On Legs Day, The Beast Never Fails"
),
new Category(
"c9",
"Cardio",
require("../assets/images/CardioPic.jpg"),
"Sweat Out The Weakness It Is A Poison That Must Be Purged"
),
];
И это решение:
import Category from "../models/Category";
const CATEGORIES = [
new Category(
"c1",
"Chest",
require("../assets/images/FlatBenchPress.jpg"),
"Time To Unleash The Beast"
),
new Category(
"c3",
"Shoulders",
require("../assets/images/ShouldersPic.jpg"),
"5% Human, 95% Beast, 100% Prepared To Destroy My Challenges"
),
new Category(
"c2",
"Back",
require("../assets/images/ChickB.jpg"),
"The Pain You Feel Today, Will Be The Strenght You Need Tomorrow"
),
new Category(
"c4",
"Biceps",
require("../assets/images/Bicep.jpg"),
"You Gotta Be A Beast There Is No Other Option"
),
new Category(
"c5",
"Triceps",
require("../assets/images/TriPic.jpg"),
"Train Strong, Positive And Full Of Beast Mode"
),
new Category(
"c8",
"Forearms",
require("../assets/images/MenuTop.jpg"),
"A Beast Never Fails"
),
new Category(
"c6",
"Abs",
require("../assets/images/AbsPic.jpg"),
"There Is Time To Rest But It Is Not That Time Now, Now Is Time For Beast Mode"
),
new Category(
"c7",
"Legs",
require("../assets/images/LegsPic.jpg"),
"A Real Beast Is Put To The Test On Legs Day, The Beast Never Fails"
),
new Category(
"c9",
"Cardio",
require("../assets/images/CardioPic.jpg"),
"Sweat Out The Weakness It Is A Poison That Must Be Purged"
),
];
export default CATEGORIES;
Я понятия не имею, почему это сработало, но это так. Если кто-нибудь знает, почему это работает, пожалуйста, опубликуйте это здесь для всех, спасибо.