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 ответов

30 просмотров

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> ) }

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта