Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
 Аватар для shaman92
36 / 34 / 12
Регистрация: 04.06.2014
Сообщений: 220

React js - рендеринг тормозит

06.03.2018, 18:17. Показов 7978. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть 2 компонента
Первый это таблица на основе fixed-data-table-2,(около 100 строк, будет больше) при клике на ячейку таблицы хочу показать модальное окно. В браузере вижу предупреждение **[Violation] 'click' handler took 204ms**, при том что я ещё даже не рендерил модалку просто изменил состояние в родительском компоненте.

Я думаю что это связано с тем что таблица перерисовывается после смены состояния, но почему так долго? Разве react не должен делать diff и отрисовывать только то, что поменялось? Поправьте если не прав.

Как можно избавиться от этого, может быть как-то по другому организовать взаимодействие компонентов? Спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2018, 18:17
Ответы с готовыми решениями:

Двойной рендеринг в React
Добрый день, начинаю изучать react, сделал авторизацию через Firebase, после того как зашёл на сайт и при обновлении страницы сначала...

3д моделирование и рендеринг одно и тоже?Что такое рендеринг?
3д моделирование и рендеринг одно и тоже?Что такое рендеринг?

"React/React-Native Developer"
MaxyLogic is the small team of dedicated software engineers that was founded with the idea to provide the best-matching quality software...

9
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
06.03.2018, 23:30
А код где?
Скорее всего перерисовывется вообще всё, потому что вы задаёте хэндлеры как
PHP/HTML
1
<Component onEvent={(event) => someExpression} />
(в общем случае - переопределяете какие-либо не примитивные props прямо при рендере)
0
 Аватар для shaman92
36 / 34 / 12
Регистрация: 04.06.2014
Сообщений: 220
07.03.2018, 10:22  [ТС]
Родительский контейнер (страница)
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
class PageExample extends Component {
    constructor (props) {
        super(props)
        this.state = {
            itemList: [],
            selectedRowId: '',
            modalRowEdit: false
        };
    }
 
    componentWillMount() {
        this.getData();
    }
    
    toggleRowEditModal = (row_id) => {
        this.setState({
            modalRowEdit: !this.state.modalRowEdit,
            selectedRowId: row_id
        });
    };
 
    render() {
        let selected_row = {};
        this.state.itemList.forEach((item, key) => {
            if(item.app.id == this.state.selectedRowId) {
                selected_row = item;
            }
        });
 
        return (
            <WrapperElement>
                <Row>
                    <div className="col-lg-12">
                        <div className="card">
                            <div className="card-header">
                                Example title
                            </div>
                            <div className="card-block">
 
                                {(() => { //Здесь рендерю теблицу и прокидываю нужные методы
                                    if(this.state.itemList.length > 0) {
                                        return <FixedTable rowEditModal={this.toggleRowEditModal} appList={this.state.itemList}  />
                                    }
                                }) ()}
 
                                
                            </div>
                        </div>
                    </div>
                </Row>
 
                // рендерю модальное окно
                {(Object.keys(selected_row).length > 0 ) ? <MyModal toggle={this.toggleRowEditModal} isOpen={this.state.modalRowEdit} app={selected_row} /> : ''}
 
            </WrapperElement>
        );
    }
}
 
export default connect(
    (state, ownProps) => ({
        ownProps,
        acc: state.accountData
    })
)(PageExample)
кусок компонента FixedTable
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
toggleRowModal = (e) => {
    this.props.rowEditModal(e.target.dataset.appid);
};
 
render() {        
        const app_list = this.props.appList;
 
        return (
            <Table>
                <ColumnGroup fixed={true} header={<Cell>title group</Cell>} >
                    <Column header={<Cell >title col 1</Cell>} fixed={true}  width={200}
                            cell={props => (<Cell {...props}>
                                    <button
                                    data-appid={app_list[props.rowIndex].data.obj_id} 
                                    onClick={this.toggleRowModal}  // открывает модальное окно
                                    >Редактировать</button>
                                </Cell>
                            )}
                    />
                    <Column header={<Cell>title col 2</Cell>} fixed={true}  width={50}
                            cell={props => (<Cell {...props}>
                                    <span>
                                        text
                                    </span>
                                </Cell>
                            )}
                    />
                ...
                </ColumnGroup>
            </table>
        );
}
Добавлено через 7 минут
А что плохого в записи
Цитата Сообщение от FraidZZ Посмотреть сообщение
<Component onEvent={(event) => someExpression} />
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
07.03.2018, 10:52
Цитата Сообщение от shaman92 Посмотреть сообщение
А что плохого в записи
Каждый апдейт родителя вызывает апдейт дитятки с таким хэндлером, независимо от того, поменялись реальные данные в нём или нет.

Добавлено через 4 минуты
Теперь покажите код <MyModal />.
Потому что в вашем всё чистенько и достаточно оптимально, если меня не подводят мои глаза
1
 Аватар для shaman92
36 / 34 / 12
Регистрация: 04.06.2014
Сообщений: 220
07.03.2018, 11:02  [ТС]
В <MyModal /> Ничего нет, это пока пустой компонент, более того если закомментировать строку
JavaScript
1
{(Object.keys(selected_row).length > 0 ) ? <MyModal toggle={this.toggleRowEditModal} isOpen={this.state.modalRowEdit} app={selected_row} /> : ''}
Ситуация не изменится.
Мне кажется что когда я меняю флаг modalRowEdit в состоянии PageExample, заново рендерится вся таблица и видимо в этом и причина, пакет fixed-data-table достаточно большой и рендерит много верстки
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
07.03.2018, 11:33
Цитата Сообщение от shaman92 Посмотреть сообщение
Мне кажется что когда я меняю флаг modalRowEdit в состоянии PageExample, заново рендерится вся таблица
Естественно. Так как компонент обновляется после изменения state.
Если хотите, чтобы она не обновлялась, просто вынесите её код в отдельный компонент, перед вызом его рендера будет проверка на идентичность properties.
1
 Аватар для shaman92
36 / 34 / 12
Регистрация: 04.06.2014
Сообщений: 220
07.03.2018, 11:37  [ТС]
Цитата Сообщение от FraidZZ Посмотреть сообщение
Если хотите, чтобы она не обновлялась, просто вынесите её код в отдельный компонент, перед вызом его рендера будет проверка на идентичность properties.
Можно схематичный пример?
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
07.03.2018, 11:53
Цитата Сообщение от shaman92 Посмотреть сообщение
Можно схематичный пример?
Хотел сказать, что можно, но потом вчитался, и увидел.
Да нет, у вас и так норм, в принципе.
Можете добавить отладочный вывод в render(...) { ... } FixedTable и проверить сами, запускается ли он после изменения состояния модального окна?
0
 Аватар для shaman92
36 / 34 / 12
Регистрация: 04.06.2014
Сообщений: 220
07.03.2018, 12:05  [ТС]
Запускается!
Понимаю что нужно переносить модальное окно из PageExample куда-то в другое место, но не пойму куда?


Есть идея сделать кастомный компонент для ячейки таблицы в него пробросить объект с данными и в нем же при клике рендерить модалку, не знаю насколько это правильный путь.
Наверное redux решил бы все эти проблемы, но интересно как сделать всё на чистом реакте
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
20.03.2018, 09:58
Лучший ответ Сообщение было отмечено shaman92 как решение

Решение

shaman92, вынести всю таблицу в отдельный класс и описать для нее shouldComponentUpdate метод.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.03.2018, 09:58
Помогаю со студенческими работами здесь

Рендеринг
Больно не бейте за тему, но нигде четкого простого ответа не нашел, на вопрос &quot;что такое рендеринг?&quot;. Я правильно понимаю, это...

Firefox в centos 5.5 тормозит в youtube - звук нормально, но видео тормозит
Просьба подсказать: firefox в centos 5.5 тормозит в youtube - звук нормально, но видео тормозит Как можно вылечить .? Добавлено...

Тормозит браузер, тормозит система, заполняется место на диске
Компьютер с большой задержкой загружается и открывает приложения. На диске д странные папки.

3d рендеринг на cpu
Здравствуйте. Существуют ли какие-то графические библиотеки для рендеринга 3д моделей на cpu? Вопрос, в первую очередь, касается даже не...

ЦПУ + 3D + Рендеринг
Intel® Core™ i5-3570K Потянет ли этот камень ArchiCAD на своем графическом ядре без дополнительной видеокарты ?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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