Экспорт двух констант из одного компонента в другой

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

import React, { useState } from 'react';
import axios from 'axios'; 

function Header() {

    const [text, setText] = useState("");
    const [latitude, setLatitude] = useState(0);
    const [longitude, setLongitude] = useState(0);


    function handleChangeEvent(event) {
        setText(event.target.value);
    }

    function handleClick() {
        const geoCoderURL = "http://api.openweathermap.org/geo/1.0/direct?q = " + text + "&limit=5&appid = {apikey}"
        function getCoordinates(url) {
            axios.get(url).then((response) => {
                setLatitude(response.data[0].lat);
                setLongitude(response.data[0].lon);
            });
        } 
        getCoordinates(geoCoderURL);        
    }

    return (
        <div>
            <h1>Five Day Forecast</h1> 
            <input onChange = {handleChangeEvent} type = "text" name = "name" autoFocus placeholder = "Enter location here."/>
            <button type = "submit" onClick = {handleClick}>Forecast</button> 
        </div>
    )
}

export const locationLat = latitude;
export const locationLon = longitude;
export default Header;


Мне нужно, чтобы значение двух констант обновлялось, если пользователь вводит новый ввод, поэтому я использую два состояния

AlexNazemi 16.03.2022 23:16

Итак, компонент, которому вы хотите передать значения, является родственным компоненту заголовка? Что будет родителем этих двух компонентов? Вы можете передать значения UP этому родителю, а затем снова DOWN компоненту, который в них нуждается... в любом случае это способ React...

yinken 16.03.2022 23:28
поэтому я не могу использовать контекст или реквизит. Нет, Context API идеально подходит для этого. Пожалуйста, объясните, почему это не вариант.
Emiel Zuurbier 16.03.2022 23:36

потому что я хочу передать константы родственному компоненту компонента заголовка, и не работает ли Context API только между родителем и дочерним элементом?

AlexNazemi 16.03.2022 23:43

поэтому, используя контекст, я бы затем отправил константы в компонент App(), а затем передал бы их в другой дочерний компонент, есть идеи, как это сделать?

AlexNazemi 16.03.2022 23:44

Context API позволяет каждому дочернему компоненту внутри контекста получать доступ к данным из контекста. Таким образом, любой родитель, ребенок, брат, сестра или кто-либо еще может обмениваться информацией, если они находятся в одном контексте. Я придумаю что-нибудь для вас.

Emiel Zuurbier 16.03.2022 23:46

Хорошо, спасибо, я новичок в React, поэтому не особо разбираюсь в контексте.

AlexNazemi 16.03.2022 23:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это базовая настройка контекста. В этом конкретном примере показано создание контекста, оболочки, которая содержит состояние внутри контекста, и пользовательского хука для доступа к значениям контекста из любого компонента.

Компонент провайдера выглядит как обычный компонент, за исключением части Context.Provider. Это часть контекста, которая предоставляет значения контекста своим потомкам.

// coordinates-context.js
import { createContext, useContext, useState } from 'react';

/**
 * Create a new context.
 */
const CoordinatesContext = createContext();

/**
 * Create a provider wrapper which is responsible for the state 
 * and children of the context. In a lot of ways it works just like
 * a normal component, except for the Provider part, which is special
 * for the Context API.
 */
export const CoordinatesProvider = ({ children }) => {
  const [coordinates, setCoordinates] = useState({ lat: null, lng: null });

  return (
    <CoordinatesContext.Provider value = {[coordinates, setCoordinates]}>
      {children}
    </CoordinatesContext.Provider>
  );
};

/**
 * This custom hook will allow us you use the context in any component.
 */
export const useCoordinatesContext = useContext(CoordinatesContext);

Компонент провайдера должен иметь компоненты, которым нужны данные, в качестве потомков, как в примере ниже.

<App>
  <CoordinatesProvider>
    <Header/>
    <OtherComponent/>
  </CoordinatesProvider>
</App>

Теперь, когда все потомки имеют доступ, мы можем использовать настраиваемый хук для использования и управления выставленными значениями.

Наш контекст просто предоставляет состояние, поэтому реализация работает точно так же, как вы использовали бы хук useState.

Единственное отличие теперь состоит в том, что все компоненты, использующие контекст, будут обновляться всякий раз, когда какой-либо компонент обновляет состояние внутри контекста.

import React, { useState } from 'react';
import { useCoordinatesContext } from '../your-path-to/coordinates-context.js';
import axios from 'axios'; 

function Header() {
  const [text, setText] = useState("");

  /**
   * The hook exposes the useState values from the context provider.
   */
  const [coordinates, setCoordinates] = useCoordinatesContext();

  function handleChangeEvent(event) {
    setText(event.target.value);
  }

  function handleClick() {
    const geoCoderURL = "http://api.openweathermap.org/geo/1.0/direct?q = " + text + "&limit=5&appid = {apikey}";

    function getCoordinates(url) {
      axios.get(url).then((response) => {

        /**
         * Update context state.
         */
        setCoordinates({
          lat: response.data[0].lat,
          lng: response.data[0].lon
        });
      });
    } 
    getCoordinates(geoCoderURL);        
  }

  return (
    <div>
      <h1>Five Day Forecast</h1> 
      <input onChange = {handleChangeEvent} type = "text" name = "name" autoFocus placeholder = "Enter location here."/>
      <button type = "submit" onClick = {handleClick}>Forecast</button> 
    </div>
  );
}

Вы не можете экспортировать состояние вне функционального компонента как константу, но есть множество решений, которые вы можете использовать для решения своей проблемы.

  1. Использование хуков React.createContext и React.useContext. Если вы определите хук в родительском элементе всех компонентов, которым он нужен, у вас не будет проблем с доступом (чаще всего этим родителем является компонент приложения).

  2. Использование менеджера состояний, например Redux. Это позволяет вам получать доступ к геттерам и сеттерам в любом месте приложения. Примечание. Redux добавляет в приложение немного шаблонного кода, поэтому, если вы еще не используете его, отдайте предпочтение первому решению.

  3. Сохранение координат в localStorage. IMO это почти никогда не является хорошим решением, потому что не позволяет вам получать уведомления об обновлении координат, но хорошо подходит для некоторых сценариев.

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 17.03.2022 07:55

Другие вопросы по теме