Изменить состояние чего-либо из другого класса с помощью кнопки

Я новичок в React, и мне было трудно понять концепцию состояний.

Внизу я экспортирую степпер из MUI. я использую состояние

export default function CustomizedSteppers() {
  const steps = ['Zoninfo', 'Betalsätt', 'Börja ladda'];
 const [activeStep, setActiveStep] = React.useState(0);
  const handleNext = () => {
      setActiveStep((activeStep+1));
    };

 

 return (
  //...
  //Stepper stuff...
  //...

  <Button variant = "contained" onClick = {handleNext}>Hello 
  World</Button>

  
</Stack>

 );
}

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

Это означает, что я хочу поместить кнопку за пределы этого компонента и поместить ее в другой класс, но при этом разрешить этой кнопке изменять значение activeStep — путем доступа к методу handleNext при нажатии кнопки вне этого класса. Как мне это удается?

вы можете добиться этого с помощью инструментов управления состоянием, таких как contextApi или Redux.

ahmetkilinc 23.03.2022 14:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
1
66
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

function CustomButtonComponent (props) {
  return (
    <button onClick = {() => props.setCount(count => count + 1)}>
        Click me
    </button>
  )
}

export default CustomButtonComponent

И в вашем основном компоненте

<CustomButtonComponent setCount = {setCount} />

Кроме того, поскольку обновления состояния запланированы в React, вы не должны использовать

onClick = {() => setCount(count + 1)}

Вместо этого используйте

onClick = {() => setCount(prevCount => prevCount + 1)}

Да, это действительно работает нормально. Однако я понял, что мне нужно уточнить более подробную информацию о проблеме, так как это не работает в моей ситуации. Я изменил содержание вопроса сейчас

MA A 23.03.2022 13:34
Ответ принят как подходящий

Вам нужно сделать родительский компонент, определить там activeStep и handleNext и передать их вашему CustomizedSteppers

Родитель.js

import CustomizedSteppers from "./CustomizedSteppers"
export default function Parent() {
  const steps = ['Zoninfo', 'Betalsätt', 'Börja ladda'];
 const [activeStep, setActiveStep] = React.useState(0);
  const handleNext = () => {
      setActiveStep((activeStep+1));
    };

return (
    <>
      <CustomizedSteppers activeStep = {activeStep} handleNext = {handleNext}>
      <Button variant = "contained" onClick = {handleNext}>Hello 
      World</Button>
    </>
  )
}


ИндивидуальныеSteppers.js

export default function CustomizedSteppers({activeStep, handleNext}) {
    return (
    //...
    //Stepper stuff...
    //...

  


    </Stack>

 );
}

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

MA A 24.03.2022 14:16

Вы можете удалить кнопку в CustomizedSteppers. Я забыл удалить его. Обновил ответ.

Peter 24.03.2022 14:17

Спасибо! один вопрос, можно ли вынести кнопку в отдельный класс, чтобы она не была с кастомизированными степперами? Хочу поставить кнопку в форме1 - при этом степпер будет самостоятельным и презентабельным на всех страницах. Все формы должны содержать кнопки, которые могут управлять активным шагом, не относясь к тому же классу, что и степпер.

MA A 24.03.2022 14:21

Да, вы можете создать компонент Button и передать handleNext в качестве реквизита.

Peter 24.03.2022 14:40

Попробуйте понять следующий код.

const Child = (props)=>{

   return (
      <Button variant = "contained" onClick = {props.handleNext}>Hello 
        World</Button>
   )
}

const Parent = ()=>{
 const steps = ['Zoninfo', 'Betalsätt', 'Börja ladda'];
 const [activeStep, setActiveStep] = React.useState(0);
 const handleNext = () => {
     setActiveStep((activeStep+1));
 };

 return (
  
  <Child handleNext = {(e)=>handleNext(e)} />
 )
}

Возьмите этот код в качестве примера и попробуйте реализовать его в своем коде.

Что происходит в этой родительской функции?

Мы передаем ручкаДалее как опора в Дочерний компонент, который запускает функцию handleNext внутри родительского компонента, когда кнопка является щелкнул внутри Дочерний компонент.

Большой! Можно ли переместить этот дочерний компонент в другой класс и сохранить ту же функциональность?

MA A 24.03.2022 13:43

У вас есть пара вариантов.

Первый - поднимите свое состояние, как сказал @Peter. То есть вам нужно будет переместить activeStep в компонент, который содержит и этот компонент, и другой компонент, для которого вы хотите иметь значение activeStep, а затем передать это значение обоим (практика, известная как просверливание). Это, вероятно, самый простой способ, если это единственная переменная, для которой вы хотите это сделать.

Во-вторых, использовать инструменты управления состоянием, как сказал @ahmetkilinc. Контекстный API встроен в React, поэтому для него не потребуется никаких дополнительных установок или инструментов. Существуют также сторонние инструменты, такие как Редукс, которые пытаются решить эту проблему (хотя я считаю, что Redux все равно просто использует контексты за кулисами). Этот вариант лучше, если вы ожидаете, что это потребуется несколько раз в вашем приложении.

Еще один хороший сторонний инструмент — Zustand, github.com/pmndrs/zustand.

Peter 23.03.2022 15:28

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