Что эквивалентно этому в функциональном компоненте?

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

import GlobalParam from './GlobalParam'
const TopPage = (props) =>{
  const [load, setLoad] = useState(false);
  useEffect(() =>{
    GlobalParam.topPage = this;// however it does not work in function component.

  })
}

в GlobalParam

export default class GlobalParam {
   static topPage;
}

Если я могу передать саму функцию компонента статическому классу,

Я могу загрузить topPage из любого места GlobalParam.topPage.setLoad(true);

Что я должен использовать в функциональном компоненте вместо this?

Похоже, вы пытаетесь внедрить собственное глобальное управление состоянием. Скорее всего, вам будет проще использовать что-то вроде Redux или useContext верхнего уровня.

David 22.04.2023 16:31

чего именно вы пытаетесь достичь?

VariabileAleatoria 22.04.2023 16:33

Пожалуйста, уточните: «Я хочу передать себя другим объектам». Какова ваша цель? Что вы хотите, чтобы другие объекты могли делать? Что делать, если есть несколько экземпляров вашего <TopPage>?

Bergi 22.04.2023 16:39

Если вы ищете простой/забавный инструмент управления состоянием, signal — это новый и действительно полезный инструмент. Изначально доступно только для Preact вот реализация React.

Andy 22.04.2023 17:06
Поведение ключевого слова "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) для оценки ваших знаний,...
3
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Взгляните на useContext.

Вы можете определить контекст с помощью createContext (вы можете указать defaultValue, но это выходит за рамки этого примера)

import { createContext } from "react";

const LoadContext = createContext();

export default LoadContext;

Затем вы можете обернуть свое приложение поставщиком, который сделает доступными переменные и функции для всех своих дочерних элементов.

import TopPage from './TopPage';
import Debug from './DebugButton';
import { createContext, useState } from 'react';
import LoadContext from './LoadContext';


function App() {

  const [load, setLoad] = useState(false)

  return (
    <LoadContext.Provider value = {{load, setLoad}}>
      <TopPage />
      <Debug />
    </LoadContext.Provider>
  );
}

export default App;

а затем вы можете получить доступ к контексту с помощью крючка useContext!

import {useContext} from 'react';
import LoadContext from './LoadContext';

const TopPage = (props) => {
  
  const {load} = useContext(LoadContext)

  return (
    <div>
      {load? <h1>loading</h1>: <h1>not loading</h1>}
    </div>
  );
};

export default TopPage;

и еще один компонент, который я сделал только для тестирования

import { useContext } from "react"
import LoadContext from "./LoadContext"

const DebugButton = () => {
  const {setLoad} = useContext(LoadContext)

  return <button onClick = {()=>{setLoad(v=>!v)}}>Debug</button>
}

export default DebugButton

Я могу решить свою проблему с помощью useContext(). Это очень полезно, и мне лучше использовать это во многих других местах. До сих пор я шаг за шагом определял путь к каждому вложенному компоненту....

whitebear 23.04.2023 16:59

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