Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433

Изменить стейт родителя без родительского обработчика

12.11.2021, 02:07. Показов 1387. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import React, { Component } from 'react';
import { Child } from '../..'; 
 
class Parent extends Component {
 
    state = {
        values: ''
    }
 
 
    render() {
        const { values } = this.state;
        
        return(
            <Child values={values} />
        );
    }
}
 
export default Parent;
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
import React, { Component } from 'react';
import { TextField  } from '@material-ui/core';
 
 
class Child extends Component {
    
    handleInputChange = (e) => {
        const { values } = this.props;
        const { name, value } = e.target;
 
        this.setState({
            [name]: value
        });
 
        console.log("test parent", values);
        console.log("test child", { [name]: value });
    }
 
 
    render() {
        const { values } = this.props;
 
        return(
            <TextField
                variant='outlined'
                label='Цитрус'
                name='citrus'
                value={values}
                onChange={this.handleInputChange}
            />
        );
    }
}
 
export default Child;
Без обработчика родительского класса требуется изменить стейт родителя в дочернем обработчике. Реально ли? Указанный код просто для отображения идеи, не работает он.

Интересует как это можно сделать именно на классах, на хуках вопроса нет.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2021, 02:07
Ответы с готовыми решениями:

Как сделать, чтобы производный класс наследовал все операторы от родительского класса и от родительского родительского
Есть 1й базовый класс в кот. определён operator ++ (); //prefix Есть производный от 1го, 2й класс в кот. дополнительно определён operator...

Окно без иконки на панели задач (не ToolWindow, и без родителя)
Собственно интересуют нативные методы скрытия окон с панели задач. 1) я знаю про WS_EX_TOOLWINDOW 2) я знаю трюк с созданием...

Частичное представление без мастер страницы (без родителя)
Всем привет! Понадобилось на имейл слать уведомление о решении Тикета (запроса) и нужно в теле письма давать ссылку на быстрый переход...

4
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
12.11.2021, 04:09
Цитата Сообщение от Timurs Посмотреть сообщение
Без обработчика родительского класса требуется изменить стейт родителя в дочернем обработчике. Реально ли?
без обработчика в родительском классе наверное никак, так как состояние приватно, а пропсы передаются от родителя к дочернему элементу (однонаправленный поток). Можно воспользоваться приемом Подъем состояния (тут нужен обработчик в родительском классе) или вынести состояние в Контекст. Других приемов я не знаю.
1
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
12.11.2021, 09:33  [ТС]
mr_dramm, спасибо, так примерно и думал. А на функциональных компонентах это возможно? Сейчас приведу пример.
Допустим был такой компонент
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import React from 'react';
 
export default function Parent() {
 
    const [values, setValues] = useState('');
 
    const handleInputChange = (e) => {
        const [name, value] = e.target;
        setValues({
            [name]: value
        })
    }
 
    return(
        <TextField
            variant='outlined'
            label='Цитрус'
            name='citrus'
            value={values}
            onChange={handleInputChange}
        />
    );
}
У него есть стейт value и его обработчик handleInputChange.

Можно этот компонент переписать вот так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import React from 'react';
import useForm from '../../components/hooks/useForm';
 
export default function Parent() {
 
    const {values, setValues, handleInputChange} = useForm('');
 
    return(
        <TextField
            variant='outlined'
            label='Цитрус'
            name='citrus'
            value={values}
            onChange={handleInputChange}
        />
    );
}
А стейт и обработчик вынесены в хук
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React from 'react';
 
export default function useForm(initialValue) {
    const [values, setValues] = useState(initialValue);
 
    const handleInputChange = (e) => {
        const [name, value] = e.target;
        setValues({
            [name]: value
        })
    }
 
    return(
        values,
        setValues,
        handleInputChange
    );
}
Возможно ли написать компонент Parent так, чтобы в хуке useForm не было своего стейта, то есть вот этой строчки
JavaScript
1
const [values, setValues] = useState(initialValue);
?
Ну может быть как-то передать возожно из Parent.
0
130 / 68 / 31
Регистрация: 24.07.2018
Сообщений: 787
16.11.2021, 11:13
Timurs, Redux в помощь
1
59 / 49 / 14
Регистрация: 23.02.2016
Сообщений: 433
16.11.2021, 17:30  [ТС]
MaksimkaI, спасибо, я так, для общего понимания. Видео просто смотрел, там на хуках всё, а проект у меня на классах, поэтому я не очень понимал что конкретно происходит, но теперь понятно, раз стейт так сходу не выносится, то весь его [того, кто видеоурок делал] хук это как обычная обертка над текущим компонентом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2021, 17:30
Помогаю со студенческими работами здесь

Вывод поста, который содержит id категории, её родителя, родителя родителя
Есть 2 таблицы, первая - категории ( category_id, parent_id и т.д), вторая - посты (post_id, category_id) В общем, в...

Как изменить поле родителя?
Имеем структуру: struct RSA_Interface { virtual void HelloWorld0(char* parms) = 0; virtual bool HelloWorld1() = 0; int...

Изменить вывод подразделов родительского меню
Имеется стандартный код section.list template.php &lt;?if(!defined(&quot;B_PROLOG_INCLUDED&quot;) || B_PROLOG_INCLUDED!==true)die();?&gt; &lt;div...

При фокусе изменить цвет родительского элемента
Доброго времени суток &lt;div id=&quot;header_search&quot;&gt; &lt;input placeholder=&quot;поиск&quot; type=&quot;text&quot; id=&quot;head_search_input&quot;&gt; ...

Новые дивы, без обработчика
1. Предположим, у нас есть дивы с классом. 2. Назначаем на все такие дивы обработчик, по клику, добавляются еще такие же дивы рядом. 3....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru