私が反応-ネイティブで画面を変更したときはどのようにデータを節約することができますか?

AsteroidSnowsuit:

私のコードでは、私はショーデータベースから取得した要素のリストというページがあります。しかし、私はまた、ユーザーが複数のフィルタを選択することを可能にするページを追加しました。

私は2つの問題があります。

  1. 私はページから取得した後、私はデータを保存する必要があります(それはそこに滞在マスト)
  2. 私は、要素のリストへのデータバックを転送する必要があります。

私は、前の画面からフィルタースクリーンにVARを与えることによって、それはそこにデータを保存するだろうと思ったが、それが動作するようには思えません。

あなたは私が何をすべきかについての兆候を持っていますか?

import React from 'react'
import { SafeAreaView, View, Text } from 'react-native'
import {generalStyles} from '@gym-app/styles/general'
import { useTranslation } from 'react-i18next'
import { TouchableOpacity } from 'react-native-gesture-handler';

export default function ExerciseSelectorScreen({navigation}) {

    const {t} = useTranslation();
    var filterProps = {};

    return (
        <SafeAreaView style={generalStyles.contentContainer}>
            <View style={[generalStyles.contentContainer]}>
                <Text>{JSON.stringify(filterProps)}</Text>
                <View style={{flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center'}}>
                    <Text style={generalStyles.title}>{ t('exercise.exercises') }</Text>
                    <TouchableOpacity onPress={() => {navigation.navigate('Exercises Filter', {filterProps: filterProps})}} style={{padding: 10, backgroundColor: '#ffb623'}}>
                        <Text style={{fontSize: 20, fontWeight: 'bold'}}>{t('general.filters').toUpperCase()}</Text>
                    </TouchableOpacity>
                </View>
            </View>        
        </SafeAreaView>
    )
}

import React, { useState, useEffect } from 'react'
import { View, SafeAreaView, Text, ScrollView, StyleSheet } from 'react-native'
import {generalStyles} from '@gym-app/styles/general'
import { useTranslation } from 'react-i18next'
import persistent from '@gym-app/database/persistent'
import tdb from '@gym-app/translation/object'
import CheckboxGroup from '../../components/workout/exercises/filters/CheckboxGroup'
import { useRoute } from '@react-navigation/native';

export default function ExercisesFilterScreen() {

    const {t} = useTranslation();
    const route = useRoute();
    var filterProps = route.params.filterProps;
    const [equipments, setEquipments] = useState({});
    const [selectedEquipments, setSelectedEquipments] = useState({});
    const [order, setOrder] = useState('');
    const [machine, setMachine] = useState('yes');

    useEffect(()=> {
        if (Object.values(equipments).length == 0) {
            persistent.transaction(tx => {
            tx.executeSql(
                "SELECT * FROM equipment",
                [],
                    (t, s) => {
                        var transEquip = {};
                        Object.values(s.rows._array).map((equipment) => {
                            transEquip[equipment.id] = tdb(equipment, 'name')
                        })
                        setEquipments(transEquip);
                    },
                    (t, e) => {
                        console.log(e);
                    }
                );
            });
        }
    },[equipments])

    useEffect(() => {
        filterProps.selectedEquipments = selectedEquipments;
        filterProps.order = order;
        filterProps.machine = machine;
    })

    return (
        <SafeAreaView style={{flex: 1}}>
            <ScrollView style={[generalStyles.contentContainer, {flex: 1, backgroundColor: '#ffb623'}]}>
                <Text style={{fontSize: 30, fontWeight: 'bold', color: '#ffffff', textAlign: 'center'}}>{t('general.filters').toUpperCase()}</Text>
                <View style={{marginTop: 10}}>
                <CheckboxGroup
                    title={t('exercise.availableEquipment')}
                    selected={selectedEquipments}
                    select={setSelectedEquipments}
                    multi={true}
                    options={
                        equipments
                    }
                />
                <CheckboxGroup
                    title={t('exercise.order')}
                    selected={order}
                    select={setOrder}
                    multi={false}
                    options={
                        {
                            "asc": t('exercise.easyToHard'),
                            "desc": t('exercise.hardToEasy'),
                        }
                    }
                    undefined={'allow'}
                />
                <CheckboxGroup
                    title={t('exercise.machines')}
                    selected={machine}
                    select={setMachine}
                    multi={false}
                    options={
                        {
                            "yes": t('exercise.machine.yes'),
                            "no": t('exercise.machine.no'),
                            "only": t('exercise.machine.only')
                        }
                    }
                />
                </View>
            </ScrollView>
        </SafeAreaView>
    )
}

const styles = StyleSheet.create({
    optionTitle: {
        marginBottom: 6, 
        fontSize: 24, 
        fontWeight: 'bold', 
        color: '#ffffff', 
        textAlign: 'left'
    }
})
左Bammyスティーブン:

グローバルスコープは、ネイティブがグローバル変数で反応します。などglobal.foo = foo、あなたが使用することができますglobal.foo どこにでも。

しかし、それを乱用しないでください!私の意見では、グローバルスコープは、グローバルconfigまたはそのような何かを格納するために使用されることがあります。異なるビュー間で共有変数、あなたの説明のように、あなたは他の多くのソリューションを選択することができます(フラックス使用Reduxのを、またはそれ以上のコンポーネントに保存)、グローバルスコープは良い選択ではありません。

グローバル変数を定義することをお勧めは、JSファイルを使用することです。例global.js用

global.foo = foo;
global.bar = bar;

その後、プロジェクトが初期化されたときに、それが実行されていることを確認します。例えば、index.js内のファイルをインポートします。

import './global.js'
// other code

さて、あなたはグローバル変数のどこを使用することができ、各ファイルにインポートglobal.jsする必要はありません。それらを修正しないようにしよう!

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=34555&siteId=1