Как передать параметр в качестве объекта с глубокой привязкой к навигации по реакции?

#reactjs #react-native #parameters #react-navigation #deep-linking

Вопрос:

Я использую глубокое связывание с навигацией по реакции для получения параметров из Url-адреса, но я хотел бы передать эти параметры объекту. Теперь я делаю это :

 prefixes: [Linking.makeUrl('/'), 'https://test.app', 'https://*.test.app'],
  config: {
    screens: {
      App: {
        screens: {
          Chat: {
            path: 'chat/:firstName/:lastName/:birthdate',
            parse: {
              firstName: (firstName: string) => decodeURIComponent(firstName),
              lastName: (lastName: string) => decodeURIComponent(lastName),
              birthdate: (birthdate: string) => decodeURIComponent(birthdate),
            },
          },
 

Это и есть результат :

  const { firstName, lastName, birthdate} = route.params
 

И что мне нужно, так это объект с внутренним именем, фамилией, датой рождения :

 const { userObject } = route.params
 

Ответ №1:

Вы можете использовать getStateFromPath для настройки параметров так, как вам нравится.

Что-то вроде этого должно сработать. Примечание: Я не тестировал с вложенными экранами. Возможно, вам придется немного изменить это, чтобы обрабатывать вложенные экраны.

 import { getStateFromPath } from '@react-navigation/native';

const linking = {
  prefixes: [Linking.makeUrl('/'), 'https://test.app', 'https://*.test.app'],
  config: {
    screens: {
      App: {
        screens: {
          Chat: {
            path: 'chat/:firstName/:lastName/:birthdate',
            parse: {
              firstName: (firstName: string) => decodeURIComponent(firstName),
              lastName: (lastName: string) => decodeURIComponent(lastName),
              birthdate: (birthdate: string) => decodeURIComponent(birthdate),
            },
          },
        },
      },
    },
  },
  getStateFromPath: (path, options) => {
    const state = getStateFromPath(path, options);
    const newState = {
      ...state,
      routes: states.routes.map(route => {
        if (route.name === 'Chat') {
          // modify your params however you like here!
          return {
            ...route,
            params: { userObject: route.params }
          }
        } else {
          return route
        }
      }),
    };
    return newState;
  },
}

 

Комментарии:

1. Можете ли вы указать, в каком файле я должен обновить этот код?

2. @AyushKatuwal Переменная связи, созданная в этом блоке кода выше, передается в NavigationContainer в качестве реквизита. Таким образом, технически это может быть где угодно, но, вероятно, это будет лучше всего в вашей точке входа в ваше приложение — App.jsx или index.js или что-то в этом роде. Я рекомендую проверить эти две страницы документов, которые объясняют это: Глубокие ссылки и настройка ссылок

3. Вау, спасибо, я понял это 🙂