Как обрабатывать события в React приложении
2 года назад·2 мин. на чтение
В этой статье рассмотрим как обработать события в React, а также о том, почему мы связываем ключевое слово `this` в классовых компонентах React.
В JSX нам нужно обернуть выражения JavaScript фигурными скобками
{ }
.
Обычный JavaScript:
В ReactJS:<button onclick="hitMe()">hit me</button>
Рассмотрим подробнее, как присоединить обработчики событий в функциональных и классовых компонентах.<button onClick={hitMe}>hitme</button>
Функциональные компоненты
В React нам нужно передать функцию обработчика событий.function Button() { function handleClick() { alert('some one clicked me') } return ( <button onClick={handleClick}>Click me</button> ) }
Передача аргументов
Мы также можем передавать аргументы в функции обработчика событий, подобные этой.function Button() { function handleClick(name) { alert(name) } return ( <button onClick={()=>handleClick('react')}>Click me</button> ) }
Классовые компоненты
В компонентах на основе классов нам нужно привязатьclass Counter extends React.Component { constructor(props) { super(props); this.state = { num: 0 } } handleInc(){ this.setState({ num: this.state.num+1 }) } render(){ return ( <div> <h1>Counter</h1> <h3>{this.state.num}</h3> <button onClick={this.handleInc.bind(this)}>Increment</button> </div> ) } }
this
к классу, иначе this
будет привязано к global window object
или в строгом режиме this
будет undefined
.
Мы можем решить эту проблему с помощью стрелочных функций, потому что в стрелочных функциях this
будет привязано к его внешнему контексту выполнения.
Давайте модифицируем приведенный выше компонент с помощью стрелочных функций.
class Counter extends React.Component { constructor(props) { super(props); this.state = { num: 0 } } handleInc() { this.setState({ num: this.state.num+1 }) } render(){ return ( <div> <h1>Counter</h1> <h3>{this.state.num}</h3> <button onClick={()=>this.handleInc()}>Increment</button> </div> ) } }
Второй способ использования class fields syntax
class Counter extends React.Component { constructor(props) { super(props); this.state = { num: 0 } } // стрелочная функция handleInc = () => { this.setState({ num: this.state.num+1 }) } render() { return ( <div> <h1>Counter</h1> <h3>{this.state.num}</h3> <button onClick={this.handleInc}>Increment</button> </div> ) } }
Объект события
Мы также можем использовать объект события таким образом в react.function Link(){ function handleClick(e){ console.log(e); e.preventDefault(); } return ( <a href="#" onClick={handleClick} >Click me</a> ) }
CSI, SSI, ESI в композиции микрофронтендов
год назад·1 мин. на чтение
Что такое Client Side Include, Server Side Include и Edge Side Include?
Client Side Include - CSI (Включение на стороне клиента)
Client Side Include (CSI) является довольно знакомой для фронтенд-разработчиков возможностью, в основном это вызов Ajax. Что выделяет его, так это контент, который возвращает запрос. Тип контента -html/text
, похожий на обычный HTML, который мы используем. В этом контексте мы не запрашиваем фрагмент данных, вместо этого мы ожидаем фрагмент HTML.
Реализация CSI не нова, CSI используется еще с 2000 года. Проблема CSI заключается в том, что если вы используете этот подход слишком интенсивно, пользователь сайта может ждать контента во время загрузки сайта. Это означает, что поисковая система может быть не в состоянии проиндексировать нужный контент при первой загрузке. По этой причине рекомендуется использовать этот подход только для определенных элементов, таких как счетчик, футер или что-либо, что не привлекает основное внимание пользователя и не находится в верхней части экрана.<body> Hello World <footer> <h-include src="a server address"></h-include> </footer> </body>
Server Side Include - SSI (Включение на стороне сервера)
Как видно из названия, включение на стороне сервера (SSI) не происходит на компьютере клиента.Вместо этого, когда сервер анализирует HTML-файл, он проверяет определенные строки, помеченные<body> Hello World <!--#include virtual="/..." --> </body>
#include
. Для любых найденных включений он извлечет содержимое и вставит его в это место, прежде чем вернуть окончательный документ.
Преимущество SSI заключается в том, что, как правило, серверы работают быстрее по сравнению с клиентским компьютером. Не говоря уже о том, что количество запросов между клиентами и серверами сокращается до 1. Таким образом, обычно мы можем получить время отклика около 1 мс по сравнению с временем отклика 50 мс при вызове API.
При этом не стоит злоупотреблять использованием большого количества включений на одной страницу. Для каждого включения серверу необходимо выполнить несколько вызовов и дождаться завершения всех вызовов, прежде чем он сможет агрегировать файл. Это может занять больше времени, чем вы ожидаете, не говоря уже о том, что один из вызовов может завершиться сбоем. Таким образом время отклика может вырасти до 500 мс и больше. Любое время, выходящее за рамки 1 сек, может стать критичным для продакшен сервера.
Поэтому разумно использовать SSI только для основного содержимого страницы, а не для каждого декоративного элемента (например счетчик или футер и т.д.). Также можно попробовать комбинировать CSI и SSI.
SSI также не новая технология. Во времена, когда существовали только бэкенд-разработчики, каждый фрагмент HTML-шаблона, собранный на сервере, можно было назвать SSI.
Edge Side Include - ESI
Идея включения на Edge Side (на стороне CDN), была предложена еще в 2001 году, но с тех пор она так и не стала общепринятой. Тем не менее, она может решить проблемы SSI. Имейте в виду, что ESI происходит и на сервере.С точки зрения использования, это не слишком отличается от включения SSI. Считается, что в некоторых реализациях ESI это улучшает время до первого байта (TTFB). Потому что он может сначала вернуть доступный документ, прежде чем все включения будут скачаны и возвращены. Это похоже на комбинацию CSI и SSI, за исключением того, что все обрабатывается на сервере.<body> Hello World <esi:include src="a server address" /> </body>