Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
49 / 49 / 7
Регистрация: 03.12.2010
Сообщений: 229

Как избежать перерисовки незатрагиваемых компонентов

02.02.2021, 22:22. Показов 2753. Ответов 5

Студворк — интернет-сервис помощи студентам
При нажатии кнопки меняется текст сообщения. Как избежать перерисовки не участвующего в этом взаимодействии грида ?
Пример на codesandbox.io

Код привожу и здесь
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import React, { useState, useEffect } from "react";
import "./styles.css";
 
import { AgGridColumn, AgGridReact } from "ag-grid-react";
import "ag-grid-community/dist/styles/ag-grid.css";
import "ag-grid-community/dist/styles/ag-theme-alpine.css";
 
const srcMes = "Выберите в гриде строку и нажмите на зелёную кнопку";
const srcColor = "lightgreen";
const srcButMes = "Перерисвка сообщения";
 
export default function App() {
  var GridData = [
    { name: "item1" },
    { name: "item2" },
    { name: "item3" },
    { name: "item4" },
    { name: "item5" }
  ];
  const [color, Set_color] = useState(srcColor);
  const [mes, Set_mes] = useState(srcMes);
  const [butMes, Set_butMes] = useState(srcButMes);
 
  const ContactsGrid = ({ rowD }) => {
    const [gridApi, setGridApi] = useState(null);
    const [gridColumnApi, setGridColumnApi] = useState(null);
 
    const [rowData, setRowData] = useState(rowD);
 
    const onGridReady = (params) => {
      setGridApi(params.api);
      setGridColumnApi(params.columnApi);
    };
 
    const onRowClicked = (node) => {};
 
    return (
      <div>
        <div style={{ height: "20vh" }}>
          <div
            className="ag-theme-alpine"
            style={{ height: "100%", width: "100%" }}
          >
            <AgGridReact
              rowSelection="single"
              onGridReady={onGridReady}
              onRowClicked={onRowClicked}
              rowData={rowData}
              headerHeight="0"
            >
              <AgGridColumn
                headerName="Человек или группа"
                field="name"
                cellStyle={{
                  "text-align": "left"
                }}
                flex="1"
                filter="agTextColumnFilter"
              ></AgGridColumn>
            </AgGridReact>
          </div>
        </div>
      </div>
    );
  };
 
  const onClick = () => {
    if (color !== "yellow") {
      Set_color("yellow");
      Set_mes(
        "Изменились цвет и текст сообщения, но и перерисовался грид. Как оставить грид нетронутым ?"
      );
      Set_butMes("Ещё раз");
    } else {
      Set_color(srcColor);
      Set_mes(srcMes);
      Set_butMes(srcButMes);
    }
  };
 
  return (
    <>
      <h2 style={{ backgroundColor: color }}>{mes}</h2>
      <ContactsGrid rowD={GridData} />
      <button style={{ backgroundColor: color }} onClick={onClick}>
        {butMes}
      </button>
    </>
  );
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2021, 22:22
Ответы с готовыми решениями:

Как переопределить процедуру перерисовки?
В нете полно статей как сделать цветной DBGrid. Нужно обработать OnDrawColumnCell А я наследую от TDBGrid свой TnewDBGrid как у него...

Как избавиться от перерисовки background?
здравствуйте. кто знает почему в jdk1.1.x при перерисовке изображения Image void paint(Graphics g) { g.drawImage(...); } ...

Как избавиться от постоянной перерисовки
Рисую график, и у меня сейчас так реализовано, что я постоянно перерисовываю все оси и метки на осях, как сделать, что-бы перерисовывать...

5
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
03.02.2021, 06:57
VovavoV, вынести стейты в разные провайдеры или обернуть ContactsGrid memo/useMemo
https://ru.reactjs.org/docs/re... #reactmemo
1
49 / 49 / 7
Регистрация: 03.12.2010
Сообщений: 229
03.02.2021, 11:16  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
обернуть ContactsGrid memo/useMemo
https://ru.reactjs.org/docs/re... #reactmemo
Я пытался использовать memo, пока не прочитал следующее
Этот метод предназначен только для оптимизации производительности. Не полагайтесь на него, чтобы «предотвратить» рендер, так как это может привести к ошибкам
В данном случае производительность не важна. Просто нужно оставить неизменным состояние грида.

Цитата Сообщение от shvyrevvg Посмотреть сообщение
вынести стейты в разные провайдеры
Может кто-то поможет сделать это в моём примере на codesandbox.io ?
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
03.02.2021, 11:33
Лучший ответ Сообщение было отмечено VovavoV как решение

Решение

Цитата Сообщение от VovavoV Посмотреть сообщение
Может кто-то поможет сделать это в моём примере на codesandbox.io ?
VovavoV, у Вас ContactsGrid внутри App создается, вынесите его из App.
1
 Аватар для bodynar
345 / 307 / 135
Регистрация: 14.03.2015
Сообщений: 1,158
Записей в блоге: 1
03.02.2021, 11:49
Цитата Сообщение от VovavoV Посмотреть сообщение
Как избежать перерисовки не участвующего в этом взаимодействии грида ?
Через задание атрибута Key
0
49 / 49 / 7
Регистрация: 03.12.2010
Сообщений: 229
03.02.2021, 12:28  [ТС]
Цитата Сообщение от shvyrevvg
у Вас ContactsGrid внутри App создается, вынесите его из App
Спасибо, помогло !

Цитата Сообщение от bodynar
Через задание атрибута Key
Выше я уже получил нужный мне ответ. Но если хотите, покажите Ваше решение в моём примере на codesandbox.io
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.02.2021, 12:28
Помогаю со студенческими работами здесь

Как избавиться от постоянной перерисовки формы
Доброго времени суток. Хочу сделать форму со своим дизайном. Для пробы стал рисовать в событии Paint. Рисуется, но вот такая проблема -...

Как повысить скорость перерисовки кнопки?
Здраствуйте! У меня возникла проблема со скоростью реакции кнопки на кликанье мышкой и перерисовкой этой кнопки. Вобщем имееться елемент...

Как организовать процесс перерисовки Canvas'а?
В принципе вопрос не только по J2ME а и вообще по Java. Как организовать процесс перерисовки Canvas'а так чтобы во время самой...

Как изменять GLOrtho во время перерисовки окна?
Привет. Делаю курсовой проект, солнечная система на c++ и opengl. Хочу сделать приближение и отдаление центра всех осей координат....

Утечка памяти в программе , как избежать или как правильно уничтожить объект?
Ребят помогите создал класс , вызываю его Creat после destroy ,проект работает только вот память используемая потихоньку растет через пять...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru