Нужна ли мне нумерация страниц, отложенная загрузка или нет в моем приложении React-Native? - PullRequest
0 голосов
/ 29 октября 2019

Я внедряю приложение в React-Native, где я выбираю "рестораны" в качестве документов из Cloud-Firestore, и я также использую слушатель onSnapshot (). Когда приложение будет готово к запуску, вероятно, будет около 3000 ресторанов. У меня есть несколько вопросов по этому вопросу.

-Мне нужно реализовать разбиение на страницы / отложенную загрузку для лучшего UX и меньших затрат, ИЛИ 3000 не большое значение, поэтому оно не сильно повлияет на производительность?!

-Если мне нужно реализовать один из них, какой мне следует реализовать?

-Если мне не нужно, то есть ли способ сжатьДанные JSON при загрузке в React-Native, чтобы сэкономить место? А затем распакуйте его по запросу пользователя.

Может ли пользователь выполнять поиск ресторана во время отложенной загрузки?

РЕДАКТИРОВАТЬ :Мне удалось реализовать ленивую загрузку, и она отлично работает, однако использование snapshot() слушателя сделает ленивую загрузку бессмысленной, но я должен использовать ее, потому что мне нужно получать в режиме реального времени новые «рестораны» или «заказы». еще я могу использовать вместо snapshot()? Или, может быть, есть способ использовать snapshot(), но с небольшим изменением кода?

Второй вопрос: смогу ли я решить вышеуказанную проблему? осуществить поиск ресторана? Кажется довольно хитрым, зная, что я использую ленивую загрузку.

  componentDidMount() {
        try {
            // Cloud Firestore: Initial Query
            this.retrieveData();
        }
        catch (error) {
            console.log(error);
        }
    };

    retrieveData = () => {
        try {
            this.setState({
                loading: true
            })

            var initialQuery = firebase.firestore().collection('restaurants')
                .orderBy('res_id')
                .limit(this.state.limit)

            //let documentSnapshots = await initialQuery.get();

            initialQuery.onSnapshot((documentSnapshots => {
                var All = documentSnapshots.docs.map(document => document.data());


                var lastVisible = All[All.length - 1].res_id;
                this.setState({
                    All: All,
                    lastVisible: lastVisible,
                    loading: false,
                });
            }));


        }
        catch (error) {
            console.log(error);
        }
    };

    retrieveMore = async () => {
        try {
            // Set State: Refreshing
            this.setState({
                refreshing: true,
            });

            // Cloud Firestore: Query (Additional Query)
            var additionalQuery = await firebase.firestore().collection('restaurants')

                .orderBy('res_id')
                .startAfter(this.state.lastVisible)
                .limit(this.state.limit)
            // Cloud Firestore: Query Snapshot
            var documentSnapshots = await additionalQuery.get();
            // Cloud Firestore: Document Data
            var All = documentSnapshots.docs.map(document => document.data());
            // Cloud Firestore: Last Visible Document (Document ID To Start From For Proceeding Queries)
            var lastVisible = All[All.length - 1].res_id;
            // Set State
            this.setState({
                All: [...this.state.All, ...All],
                lastVisible: lastVisible,
                refreshing: false,
            });
            console.log('Retrieving additional Data', this.state.All);
        }
        catch (error) {
            console.log(error);
        }
    };


    // Render Header
    renderHeader = () => {
        try {
            return (
                <Text style={styles.headerText}>Items</Text>
            )
        }
        catch (error) {
            console.log(error);
        }
    };
    // Render Footer
    renderFooter = () => {
        try {
            // Check If Loading
            if (this.state.loading) {
                return (
                    <ActivityIndicator />
                )
            }
            else {
                return null;
            }
        }
        catch (error) {
            console.log(error);
        }
    };
    render() {
        return (
            <SafeAreaView style={styles.container}>
                <FlatList
                    // Data
                    data={this.state.All}
                    // Render Items
                    renderItem={({ item }) => (
                        <View style={styles.itemContainer}>
                            <Text>(ID: {item.res_id}) {item.rest_name} {item.rest_location}</Text>
                        </View>
                    )}
                    // Item Key
                    keyExtractor={(item, index) => String(index)}
                    // Header (Title)
                    ListHeaderComponent={this.renderHeader}
                    // Footer (Activity Indicator)
                    ListFooterComponent={this.renderFooter}
                    // On End Reached (Takes a function)
                    onEndReached={this.retrieveMore}
                    // How Close To The End Of List Until Next Data Request Is Made
                    onEndReachedThreshold={0.1}
                    // Refreshing (Set To True When End Reached)
                    refreshing={this.state.refreshing}
                />
            </SafeAreaView>
        )
    }

1 Ответ

1 голос
/ 29 октября 2019

Разбиение на страницы и Ленивая Загрузка - одно и то же в этом случае. Вы будете либо переключать страницы, либо бесконечно прокручивать при извлечении новых данных, пока не останется больше данных для извлечения. В любом случае вам это нужно. Смотрите здесь https://firebase.google.com/docs/firestore/query-data/query-cursors

Поскольку разбиение на страницы - это просто способ запроса ваших данных, это никак не влияет на то, как вы можете использовать эти данные другими способами, что означает, что вы можете искать ресторан с учетом дизайна вашей базы данных иправила безопасности установлены правильно

Не уверен, следует ли вам использовать прослушиватель onSnapshot, поскольку он будет возвращать вам всю коллекцию каждый раз, когда что-то меняется, что отрицает весь смысл использования нумерации страниц

РЕДАКТИРОВАТЬ:

Об обновлениях в реальном времени: это зависит от того, что вы хотите получить в режиме реального времени. Это только те рестораны, которые вы загрузили, или все? Представьте, что у вас есть 1 000 000 ресторанов в вашей базе данных, вы наверняка не захотите запрашивать их все в режиме реального времени. Обновление только тех, которые загружены в данный момент, является довольно дорогой операцией в firestore, так как требует отмены и создания новых подписок каждый раз, когда изменяются видимые рестораны (например, при прокрутке страницы). Таким образом, оба варианта не являются вариантом

Вам следует пересмотреть дизайн своего приложения - например, вам действительно нужно отслеживать заказы каждого зарегистрированного ресторана? Может быть, вы хотите только те, где вы работаете, или только те, кто рядом с вами? Может быть, вам следует реструктурировать свою базу данных, чтобы хранить заказы отдельно от ресторанов, чтобы вы могли прослушивать заказы, все еще загружая рестораны?

...