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

9 просмотров

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

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

N0rda_a-Миролюбов Автор вопроса

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

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

/////////////////////////////////////// TChart / TLineSeries - сохранение данных (текстовый файл) /////////////////////////////////////// добрый день / работа с графиком: 1....
livontiy
14
Чем больше разбираюсь с интерфейсами в дельфи, тем меньше понимаю, как работает поиск имен. type IIntf = interface function GetStr: string; end; IChild = interface(I...
Jack128
9
Мне интересно, скорее людей здесь используют D, Rust, C/C++ для решения реальных прикладных задач за деньги?)
Evil Satanson
43
кто поможет крякнуть чит? (реверс инжиринг) чтобы разблокировать премиум версию
Mёdkinson Medvezhkin
39
А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
давайте за механические клавиатуры потрём, мне тут неучтенных денег упало и их можно потратить на что-то такое, вот думаю про dark project kd87a, кто-то имеет что-то подобное?
Oleg Nosov
24
Подскажите, сейчас что то есть (JS модуль какой-нибудь), что можно использовать для: 1) переваривания javascript codа из html fileа, т.е. разбивки, на переменные, команды, бло...
Iar De
15
Вопрос по организации кода. Пилю свой велосипед логгер Есть у меня множество уровней сообщений. Я набрасываю сообщения в стринглист, а когда они нужны, вызываю их через функц...
Serjone
21
Ребя, тут спрашивают, что лучше использовать для юзербота на java? 👀
Mars BATYA [NYА]
12
тут же люди сидят начитанные. хочу написать кроссплатформенный анонимный сетевой чат. данный проект ни на что не претендует, скорее просто студенческая работа. можете посовето...
Óðinn
12
Карта сайта