169 похожих чатов

Реакт компонент принимает настройки settings, эти настройки родительский компонент принимает

от АПИ и ему передает.
На основании этих настроек инициализируются переменные period, updateInterval и тд и в карточке отображаются свитчеры либо в выпадашке нужные опции проставляются в зависимости от этих переменных.
Юзер потом может переключать свитчеры и тд и тогда на сервер отправляются новые настройки с помощью функции saveSettings, для этого я в useEffect добавил нужные зависимости [period, updateInterval, includeEvents, chartType].
Проблема в том, что при инициализации компонента useEffect срабатывает и на сервер отсылаются настройки, что не нужно делать.

Я решил проблему добавив isInit флаг, но это лажа какая-то.
Можно ли проблему решить без этого дурацкого флага?
Что можно попытаться сделать?

export function Card({settings, saveSettings}) {
const {
period: periodFromBackend,
updateInterval: updateIntervalFromBackend,
includeEvents: includeEventsFromBackend,
chartType: chartTypeFromBackend,
} = settings
const [period, setPeriod] = useState(periodFromBackend);
const [updateInterval, setUpdateInterval] = useState(updateIntervalFromBackend);
const [includeEvents, setIncludeEvents] = useState(includeEventsFromBackend);
const [chartType, setChartType] = useState(chartTypeFromBackend);

const [isInit, setIsInit] = useState(true);

useEffect(() => {
if (!isInit) {
saveSettings({ // отсылаются настройки
includeEvents,
period,
updateInterval,
chartType,
})
} else {
setIsInit(false)
}
}, [period, updateInterval, includeEvents, chartType]);


return (
// JSX
)
}

10 ответов

27 просмотров

useCallback?

Заведи ref со счётчиком рендеров. Он не будет влиять на перерисовку, и на него можно ориентироваться. Если я правильно понял проблему.

зачем тебе тут вообще useEffect? В данном случае достаточно onClick = {() => {saveSettings({ // отсылаются настройки includeEvents, period, updateInterval, chartType, })}}

N0rda_a-Миролюбов Автор вопроса
Denis Deniskov
зачем тебе тут вообще useEffect? В данном случае д...

во все внутренние компоненты все настройки и саму функцию saveSettings пропдриллингом тогда передавать придется

N0rda_a-Миролюбов Автор вопроса
Denis Deniskov
Зачем?

а как тогда компонент на котором клик сработает будет знать все остальные настройки кроме своего поля?

N0rda_a-Миролюбов Автор вопроса
Denis Deniskov
Скинь полный код, с jsx я тебе покажу

export function Card({settings, saveSettings}) { const { period: periodFromBackend, updateInterval: updateIntervalFromBackend, includeEvents: includeEventsFromBackend, chartType: chartTypeFromBackend, dashboardType, visible } = settings const [period, setPeriod] = useState(periodFromBackend); const [updateInterval, setUpdateInterval] = useState(updateIntervalFromBackend); const [includeEvents, setIncludeEvents] = useState(includeEventsFromBackend); const [chartType, setChartType] = useState(chartTypeFromBackend); const isFirstRender = useRef(true); useEffect(() => { if (isFirstRender?.current) { isFirstRender.current = false; return; } }, [period, updateInterval, includeEvents, chartType]); return ( <Paper> <div className={classes.dashboardBlockHeader} > <span className={classes.dashboardTitle}>{t(`BUILD-DASHBOARD-TYPE.${dashboardType}`)}</span> <div className={classes.cardButtonsContainer}> <Switch checked={!!includeEvents} onChange={() => setIncludeEvents(includeEvents => !includeEvents)} color="primary" /> <span className={classes.switchLabel} onClick={() => setIncludeEvents(includeEvents => !includeEvents)} > События </span> <Divider orientation="vertical" className={classes.verticalDivider}/> <div className={classes.deleteButton}> <RemoveIcon/> </div> </div> </div> <Divider/> <div className={classes.dashboardBlockSettings}> <DashboardDropdown label={"Период:"} selectedValue={period} setSelectedValue={setPeriod} options={[ {label: "3 часа", value: 180}, {label: "6 часов", value: 360}, {label: "12 часов", value: 720}, {label: "24 часа", value: 1440}, {label: "3 суток", value: 4320}, {label: "1 неделя", value: 10080}, {label: "2 недели", value: 20160}, {label: "1 месяц", value: 43200} ]} /> <DashboardDropdown label={"Частота обновления:"} selectedValue={updateInterval} setSelectedValue={setUpdateInterval} options={[ {label: "1 Минута", value: 1}, {label: "5 Минут", value: 5}, {label: "10 Минут", value: 10}, {label: "30 Минут", value: 30}, {label: "1 Час", value: 60}, ]} /> {!!chartType && ( <DashboardDropdown label={"Тип графика:"} selectedValue={chartType} setSelectedValue={setChartType} options={[ {label: "Pie Chart", value: "PieChart"}, {label: "Horizontal Bar Chart", value: "HorizontalBarChart"}, {label: "Vertical Bar Chart", value: "VerticalBarChart"}, {label: "Stacket vertical bar chart", value: "StackedVerticalBarChart"}, {label: "Line chart", value: "LineChart"}, {label: "Grouped vertical bar chart", value: "GroupedVerticalBarChart"}, ]} /> )} </div> <Divider/> <Chart dashboardType={dashboardType} organizationId={organizationId} includeEvents={includeEvents} updateInterval={updateInterval} period={period} /> </Paper> ) }

Ты ант используешь?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта