Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2

Невозможность обновления состояния кнопки

05.04.2023, 12:33. Показов 695. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени, есть вопрос касательно useState.
В достаточно простом компоненте, задача которого подменивать кнопку при переходе из одного состояния в другое, кнопка может поменяться лишь единожды:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import React, { useState, useEffect } from "react";
import "./TaskItem.css"
import 'bootstrap/dist/css/bootstrap.min.css';
import {Button  } from "@chakra-ui/button"
import "react-icons/fa";
import { Stack } from '@chakra-ui/react'
import { MdTableRestaurant } from 'react-icons/md';
import { RiArchiveDrawerFill } from 'react-icons/ri';
 
function Panel(props) {
 
  const [currentState, setCurrentState ] = useState("active");
 
  const toggleButtonView = () => {
    if (currentState == "backlog") 
    {
      setCurrentButton(activeButton)
      setCurrentState("active")
      console.log("Set to active");
    } 
    else if (currentState == "active") 
    {
      setCurrentButton(backlogButton)
      setCurrentState("backlog")
      console.log("Set to backlog");
    }
    console.log("Current state is: " + currentState);
  }
 
 
  const activeButton = 
  (
    <Button onClick={ toggleButtonView } leftIcon={<MdTableRestaurant />} colorScheme='teal' variant='outline'>
      Стол
    </Button>
  )
 
  const backlogButton = 
  (
    <Button onClick={ toggleButtonView }  leftIcon={<RiArchiveDrawerFill />} colorScheme='teal' variant='outline'>
      Ящик
    </Button>
  )
 
  const [currentButton, setCurrentButton] = useState(activeButton);
 
    return (
      <div>
        <Stack direction='row' 
        spacing={4}
        m="30px">
          { currentButton }
        </Stack>
      </div>
      
    )
}
export default Panel;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.04.2023, 12:33
Ответы с готовыми решениями:

Обновления состояния объекта
Здравствуйте. Есть приложение, которое вертит фигуру. Данные загружаются из файла, но при попытке подгрузить данные из другого файла, дабы...

Как удалить все обновления IE11 до состояния установки?
Windows 7 Pro, включены обновления системы. Как удалить все обновления Internet Explorer 11 до состояния первоначальной установки?

Пропал быстрый запуск в строке состояния, после обновления до Windows 10
Парни что с этим делать

9
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
05.04.2023, 12:40  [ТС]
Из-за чего у меня закралось подозрение, что setCurrentState не работают должным образом в принципе:
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3808 / 1646 / 428
Регистрация: 14.03.2022
Сообщений: 4,096
05.04.2023, 12:45
При твоей комбинации
Цитата Сообщение от Luca Brasi Посмотреть сообщение
JavaScript
1
console.log("Current state is: " + currentState);
Не будет показывать "новое" значение стейта... Т.к. изменение стейта асинхронное действие.

И вообще, запихивание компонентов в стейт такое себе занятие. Поскольку всегда можно обойтись простой стейтовой переменной, в данном примере логической.

Добавлено через 44 секунды
Цитата Сообщение от Luca Brasi Посмотреть сообщение
setCurrentState не работают должным образом в принципе
Оно-то работает как должно.
Это ты неправильно ее понимаешь...
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
05.04.2023, 13:14  [ТС]
krvsa, ну хорошо, если оно ассинхронное, и как я понимаю меняется не мгновенно что его не видно при выводе?
Как тогда реализовать механизм переключения кнопки?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3808 / 1646 / 428
Регистрация: 14.03.2022
Сообщений: 4,096
05.04.2023, 16:11
Цитата Сообщение от Luca Brasi Посмотреть сообщение
меняется не мгновенно что его не видно при выводе?
Все верно.

Цитата Сообщение от Luca Brasi Посмотреть сообщение
Как тогда реализовать механизм переключения кнопки?
Если состояний всего два - можно сделать вот так

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import React from 'react';
import ReactDOM from 'react-dom/client';
 
function App() {
    const [btn, setBtn] = React.useState(true)
    const action = React.useCallback(_ => {
        setBtn(old => !old)
    })
    return (
        <>
            {btn 
                ? <Btn1 action={action} /> 
                : <Btn2 action={action} />
            }
        </>
    )
}
function Btn1({action}) {
    return (
        <button onClick={action}>
            Кнопка 1
        </button>
    )
}
function Btn2({action}) {
    return (
        <button onClick={action}>
            Кнопка 2
        </button>
    )
}
 
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
1
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
15.04.2023, 09:31  [ТС]
krvsa, ваш ответ примерно ясен, читал много всего про useState, useEffect, setState - но полноценного объяснения, пока дать не могу...
Если напрямую сделать независимую переменную, как в ванильном JS, то всё работает как надо, но вот через useState...
Чтобы уж совсем прям исключить моменты с асинхронностью, добавил временный параграф.
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
19.04.2023, 10:41  [ТС]
krvsa, в конечном итоге, переделал на такое исполнение:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function Panel(props) {
  
  const CustomButton = ( { buttonName } ) => (
  
    <Button onClick={ toggleButtonView } leftIcon={<MdTableRestaurant />} colorScheme='teal' variant='outline'>
      { buttonName }
    </Button>
    
  )
 
  const toggleButtonView =  () => {
    if (currentState == "backlog")
    {
      setCurrentState("active")
      console.log("State was changed to ative");
    } 
    else if (currentState == "active")
    {
      setCurrentState("backlog")
      console.log("State was changed to backlog");
    }    
    console.log("Current state: " + currentState);
  }
 
  const [currentState, setCurrentState ] = useState("active");
 
  
    return (
      <div>
        <Stack direction='row' 
        spacing={4}
        m="30px">
          <CustomButton buttonName={ currentState }/> 
          <p>{ currentState }</p>
        </Stack>
      </div>      
    )
}
 
export default Panel;
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3808 / 1646 / 428
Регистрация: 14.03.2022
Сообщений: 4,096
19.04.2023, 10:53
Цитата Сообщение от Luca Brasi Посмотреть сообщение
переделал на такое исполнение
Зачем CustomButton определяешь внутри Panel?
Делай его отдельно. Нужное передашь ему пропсами...
0
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2
20.04.2023, 11:21  [ТС]
krvsa, сделал как мог
Вызов обработчика из кнопки, представляет собой обращение от потомка к родителю. Тоже организовал через пропсы, надеюсь это легально
Ибо уж сильно много слышал про однонаправленность обмена данными, от родителя к потомку. А вот как делать в обратную сторону - нашёл только такой способ.
Panel.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function Panel(props) {
  
  const toggleButtonView =  () => {
    if (currentState == "backlog")
    {
      setCurrentState("active")
      props.changeTableState("active")
      console.log("State was changed to ative");
    } 
    else if (currentState == "active")
    {
      setCurrentState("backlog")
      props.changeTableState("backlog")
      console.log("State was changed to backlog");
    }    
  }
 
  const [currentState, setCurrentState ] = useState("active");
 
    return (
      <div>
        <Stack direction='row' 
        spacing={4}
        m="30px">
          <CustomButton buttonName={ currentState } toggleButtonView={ () =>  toggleButtonView() }/> 
        </Stack>
      </div>      
    )
}
 
export default Panel;
Button.js
JavaScript
1
2
3
4
5
6
7
8
9
function CustomButton(props) {
    return (
    <Button onClick={ props.toggleButtonView } leftIcon={<MdTableRestaurant />} colorScheme='teal' variant='outline'>
        { props.buttonName }
    </Button>
    )
}
 
export default CustomButton
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3808 / 1646 / 428
Регистрация: 14.03.2022
Сообщений: 4,096
20.04.2023, 11:39
Цитата Сообщение от Luca Brasi Посмотреть сообщение
Ибо уж сильно много слышал про однонаправленность обмена данными, от родителя к потомку. А вот как делать в обратную сторону - нашёл только такой способ.
Так ты не нарушил этот принцип. Все идет только "сверху" в "низ". Вот и родительская функция "пришла" вниз и там выполнилась.

Добавлено через 3 минуты
Luca Brasi, чисто стилистически, все use* я бы рекомендовал делать в самом верху компонента...

Иначе сталкиваешься с использованием переменных, а их еще не видел ни в пропсах, ни хуках... Откуда они взялись - х/з...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2023, 11:39
Помогаю со студенческими работами здесь

Переключение состояния кнопки
помогите сделать: 3. Три состояния кнопки (3 рис на кнопку), т.е. переключение рисунков кнопок – (4- кнопки) 1. показ-скрытие слоя,...

Кнопки в строке состояния
Доброго времени суток! У меня есть родительское окно. Каждый раз, когда я создаю дочернее окно, у меня появляется кнопка в строке...

Изменение состояния кнопки
В одной из таблиц есть поле true/false необходимо чтобы при значении true - были доступны одни кнопки, при значении false - другие. ...

Изменение состояния кнопки на HTML странице
Добрый день, уважаемые коллеги! Делаю autorun-меню используя HTA - в нем открывается HTML-страничка, на которой пара кнопок - запуск...

Изменение состояния кнопки и поля в бд по клику
PHP уровень-'ниже плинтуса' но времени очень мало.Пытаюсь сделать редактирования поля бд. на сайте. В поле сделал кнопку, при нажатии на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru