React Native:将useState()数据传递到不相关的屏幕

简讯

说明:我正在创建一个健身应用程序,我的健身应用程序具有一个名为WorkoutTimer的组件,该组件连接到锻炼屏幕,并且可以通过HomeScreen访问该屏幕。在WorkoutTimer内部,我有一个exerciseCount useState(),它在计时器每次完成完整循环(进入下一个练习)时进行计数。我有一个名为StatsScreen的屏幕,可以通过HomeScreen选项卡访问该屏幕,我打算显示(并保存)已完成的练习次数。

我已经完成的工作:我已经花了整整一天的时间研究这个问题,但是对于不相关的屏幕来说似乎有点困难。我看到我可能不得不使用useContext(),但这似乎超级困难。我是刚接触本地人的新手,所以我正在努力做到最好!我已经附加了我认为需要的每个屏幕的代码,并附加了homeScreen选项卡的屏幕截图,以便您可以了解我的应用程序的工作方式。

WorkoutTimer.js

import React, { useState, useEffect, useRef } from "react";
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  Button,
  Animated,
  Image,
  SafeAreaView,
} from "react-native";

import { CountdownCircleTimer } from "react-native-countdown-circle-timer";
import { Colors } from "../colors/Colors";

export default function WorkoutTimer() {
  const [count, setCount] = useState(1);
  const [exerciseCount, setExerciseCount] = useState(0);
  const [workoutCount, setWorkoutCount] = useState(0);

  const exercise = new Array(21);
  exercise[1] = require("../assets/FR1.png");
  exercise[2] = require("../assets/FR2.png");
  exercise[3] = require("../assets/FR3.png");
  exercise[4] = require("../assets/FR4.png");
  exercise[5] = require("../assets/FR5.png");
  exercise[6] = require("../assets/FR6.png");
  exercise[7] = require("../assets/FR7.png");
  exercise[8] = require("../assets/FR8.png");
  exercise[9] = require("../assets/S1.png");
  exercise[10] = require("../assets/S2.png");
  exercise[11] = require("../assets/S3.png");
  exercise[12] = require("../assets/S4.png");
  exercise[13] = require("../assets/S5.png");
  exercise[14] = require("../assets/S6.png");
  exercise[15] = require("../assets/S7.png");
  exercise[16] = require("../assets/S8.png");
  exercise[17] = require("../assets/S9.png");
  exercise[18] = require("../assets/S10.png");
  exercise[19] = require("../assets/S11.png");
  exercise[20] = require("../assets/S12.png");
  exercise[21] = require("../assets/S13.png");

  return (
    <View style={styles.container}>
      <View style={styles.timerCont}>
        <CountdownCircleTimer
          isPlaying
          duration={45}
          size={240}
          colors={"#7B4FFF"}
          onComplete={() => {
            setCount((prevState) => prevState + 1);
            setExerciseCount((prevState) => prevState + 1);

            if (count == 21) {
              return [false, 0];
            }
            return [(true, 1000)]; // repeat animation for one second
          }}
        >
          {({ remainingTime, animatedColor }) => (
            <View>
              <Image
                source={exercise[count]}
                style={{
                  width: 150,
                  height: 150,
                }}
              />
              <View style={styles.timeOutside}>
                <Animated.Text
                  style={{
                    color: animatedColor,
                    fontSize: 18,
                    position: "absolute",
                    marginTop: 67,
                    marginLeft: 35,
                  }}
                >
                  {remainingTime}
                </Animated.Text>
                <Text style={styles.value}>seconds</Text>
              </View>
            </View>
          )}
        </CountdownCircleTimer>
      </View>
    </View>
  );
}

const styles = StyleSheet.create({})
    

WorkoutScreen.js

import React, { useState } from "react";
import { StyleSheet, Text, View } from "react-native";

import WorkoutTimer from "../components/WorkoutTimer";

export default function WorkoutScreen() {
  return (
    <View style={styles.container}>
      <WorkoutTimer />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
});
    

HomeScreen.js

import React from "react";
import { StyleSheet, Text, View, SafeAreaView, Button } from "react-native";
import { TouchableOpacity } from "react-native-gesture-handler";
import { AntDesign } from "@expo/vector-icons";

import { Colors } from "../colors/Colors";

export default function HomeScreen({ navigation }) {
  return (
    <SafeAreaView style={styles.container}>
      <Text style={styles.pageRef}>SUMMARY</Text>
      <Text style={styles.heading}>STRETCH & ROLL</Text>
      <View style={styles.content}>
        <TouchableOpacity
          style={styles.timerDefault}
          onPress={() => navigation.navigate("WorkoutScreen")}
        >
          <Button title="START WORKOUT" color={Colors.primary} />
        </TouchableOpacity>
        <TouchableOpacity
          style={styles.statContainer}
          onPress={() => navigation.navigate("StatsScreen")}
        >
          <AntDesign name="barschart" size={18} color={Colors.primary} />
          <Text style={{ color: Colors.primary }}>Statistics</Text>
          <AntDesign name="book" size={18} color={Colors.primary} />
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({})
    

StatsScreen.js

import React from "react";
import { StyleSheet, Text, View } from "react-native";
import { exerciseCount, workoutCount } from "../components/WorkoutTimer";

export default function StatsScreen() {
  return (
    <View style={styles.container}>
      <Text display={exerciseCount} style={styles.exerciseText}>
        {exerciseCount}
      </Text>
      <Text display={workoutCount} style={styles.workoutText}>
        {workoutCount}
      </Text>
    </View>
  );
}

const styles = StyleSheet.create({});

主屏幕图像

简讯

如果有人好奇,我最终用useContext解决了这个问题,一开始很难解决。但是一旦我明白了这一点,就不难理解了。

我使用以下代码创建了另一个名为exerciseContext的文件:

import React, { useState, createContext } from "react";

const ExerciseContext = createContext([{}, () => {}]);

const ExerciseProvider = (props) => {
  const [state, setState] = useState(0);
  //{ exerciseCount: 0, workoutCount: 0 }

  return (
    <ExerciseContext.Provider value={[state, setState]}>
      {props.children}
    </ExerciseContext.Provider>
  );
};

export { ExerciseContext, ExerciseProvider };

在App.js中,我使用了ExerciseProvider,它允许我在屏幕上传递数据。

  if (fontsLoaded) {
    return (
      <ExerciseProvider>
        <NavigationContainer>
          <MyTabs />
        </NavigationContainer>
      </ExerciseProvider>
    );
  } else {
    return (
      <AppLoading startAsync={getFonts} onFinish={() => setFontsLoaded(true)} />
    );
  }
}

我可以这样称呼:

import { ExerciseContext } from "../components/ExerciseContext";

const [exerciseCount, setExerciseCount] = useContext(ExerciseContext);

这意味着我也可以更改状态!繁荣,解决了!如果有人需要解释,请告诉我!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数据传递到React Native中的组件?

来自分类Dev

如何将一组React节点传递给不相关的组件

来自分类Dev

在不相关的组件之间传递 props-react

来自分类Dev

将JSON数据传递到react native(hook)中的下一页

来自分类Dev

使用React钩子将数据传递到同级组件?

来自分类Dev

使用kefirjs将数据传递到React组件

来自分类Dev

React-native-将数据从一个屏幕传递到另一个屏幕

来自分类Dev

如何在React Native中将项目数据传递到模式

来自分类Dev

将额外的道具数据传递给react-native-draggable-flatlist中的renderItem

来自分类Dev

React Native Navigation:在屏幕之间传递数据

来自分类Dev

React Router-将api数据传递到链接的组件以打开新页面

来自分类Dev

如何使用ES6将流星订阅数据传递到React Component Props

来自分类Dev

React Material-Table onSelectionChange将数据传递到挂钩状态

来自分类Dev

React-router:通过路由将数据传递到组件

来自分类Dev

如何使用ES6将流星订阅数据传递到React Component Props

来自分类Dev

将数据传递给独立组件React

来自分类Dev

React Native:使用navigationOptions将参数传递到另一个屏幕

来自分类Dev

如何通过React Router链接将状态数据传递到另一个网页?

来自分类Dev

React:如何使用axios将api数据传递到子组件时解决未定义问题?

来自分类Dev

将数据从 DB 传递到 React 组件

来自分类Dev

React Native:将数据源从_renderRow中的Props传递到方法

来自分类Dev

React Native - 将数据从一个组件传递到另一个

来自分类Dev

DRF 将数据传递到相关字段

来自分类Dev

Redux React Native - 动作不将数据传递给减速器

来自分类Dev

如何在React中将数据传递到Chart.js图表

来自分类Dev

在React Native中将数据从子组件传递到父组件?

来自分类Dev

将标题从React Native导航传递到Header Component

来自分类Dev

从FlatList组件将数据传递到屏幕

来自分类Dev

在 React Native 中将道具传递给屏幕

Related 相关文章

  1. 1

    将数据传递到React Native中的组件?

  2. 2

    如何将一组React节点传递给不相关的组件

  3. 3

    在不相关的组件之间传递 props-react

  4. 4

    将JSON数据传递到react native(hook)中的下一页

  5. 5

    使用React钩子将数据传递到同级组件?

  6. 6

    使用kefirjs将数据传递到React组件

  7. 7

    React-native-将数据从一个屏幕传递到另一个屏幕

  8. 8

    如何在React Native中将项目数据传递到模式

  9. 9

    将额外的道具数据传递给react-native-draggable-flatlist中的renderItem

  10. 10

    React Native Navigation:在屏幕之间传递数据

  11. 11

    React Router-将api数据传递到链接的组件以打开新页面

  12. 12

    如何使用ES6将流星订阅数据传递到React Component Props

  13. 13

    React Material-Table onSelectionChange将数据传递到挂钩状态

  14. 14

    React-router:通过路由将数据传递到组件

  15. 15

    如何使用ES6将流星订阅数据传递到React Component Props

  16. 16

    将数据传递给独立组件React

  17. 17

    React Native:使用navigationOptions将参数传递到另一个屏幕

  18. 18

    如何通过React Router链接将状态数据传递到另一个网页?

  19. 19

    React:如何使用axios将api数据传递到子组件时解决未定义问题?

  20. 20

    将数据从 DB 传递到 React 组件

  21. 21

    React Native:将数据源从_renderRow中的Props传递到方法

  22. 22

    React Native - 将数据从一个组件传递到另一个

  23. 23

    DRF 将数据传递到相关字段

  24. 24

    Redux React Native - 动作不将数据传递给减速器

  25. 25

    如何在React中将数据传递到Chart.js图表

  26. 26

    在React Native中将数据从子组件传递到父组件?

  27. 27

    将标题从React Native导航传递到Header Component

  28. 28

    从FlatList组件将数据传递到屏幕

  29. 29

    在 React Native 中将道具传递给屏幕

热门标签

归档