Мухаммад Умайр
Вопрос № 1: Почему бы нам не обновить состояние напрямую?
Если вы попытаетесь обновить состояние напрямую, компонент не будет повторно отображаться.
Wrong this.state.message = 'Hello world'
Вместо этого используйте метод setState()
. Он планирует обновление объекта состояния компонента. Когда состояние изменяется, компонент отвечает повторным рендерингом.
//Correct this.setState({ message: 'Hello World' })
Примечание. Вы можете напрямую назначать объекту состояния либо в конструкторе, либо используя синтаксис объявления поля класса последней версии javascript.
Вопрос № 02: Какова цель функции обратного вызова в качестве аргумента setState()
?
Функция обратного вызова вызывается, когда setState завершается и компонент визуализируется. Поскольку setState()
является асинхронным, функция обратного вызова используется для любого действия с публикацией.
Примечание. Рекомендуется использовать метод жизненного цикла, а не эту функцию обратного вызова.
setState({ name: 'John' }, () => console.log('The name has updated and component re-rendered'))
Вопрос № 3: В чем разница между обработкой событий HTML и React?
Ниже приведены некоторые из основных различий между обработкой событий HTML и React.
В HTML имя события обычно пишется нижним регистром по соглашению:
<button onclick='activateLasers()'>
В то время как в React следует соглашению camelCase:
jsx harmony <button onClick={activateLasers}>
В HTML вы можете вернуть false
, чтобы предотвратить поведение по умолчанию:
<a href='#' onclick='console.log("The link was clicked."); return false;' />
В то время как в React вы должны вызывать preventDefault()
явно:
function handleClick(event) {
event.preventDefault()
console.log('The link was clicked.')
}
В HTML вам нужно вызвать функцию, добавив ()
В то время как в реакции вы не должны добавлять ()
к имени функции. (например, см. функцию «activateLasers» в первом пункте)
Вопрос № 4: Как связать методы или обработчики событий в обратных вызовах JSX?
Есть 3 возможных способа добиться этого:
Привязка в конструкторе. В классах JavaScript методы по умолчанию не связаны. То же самое относится к обработчикам событий React, определенным как методы класса. Обычно мы связываем их в конструкторе.
class Foo extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
} }
Синтаксис полей открытого класса. Если вы не хотите использовать подход с привязкой, можно использовать синтаксис полей открытого класса для правильной привязки обратных вызовов.
обработчик гармонии jsxClick = () => { console.log («это:», это) }
jsx harmony <button onClick={this.handleClick}> {'Click me'} </button>
Стрелочные функции в обратных вызовах. Вы можете использовать стрелочные функции непосредственно в обратных вызовах.
jsx harmony handleClick() {console.log('Click happened');
} render() {return <button onClick={() => this.handleClick()}>Click Me</button>;
}
Примечание. Если обратный вызов передается в качестве реквизита дочерним компонентам, эти компоненты могут выполнить дополнительный повторный рендеринг. В таких случаях предпочтительнее использовать .bind()
или синтаксис полей открытого класса с учетом производительности.
Вопрос № 5: Как передать параметр обработчику события или обратному вызову?
Вы можете использовать функцию стрелки, чтобы обойти обработчик событий и передать параметры:
jsx harmony <button onClick={() => this.handleClick(id)} />This is an equivalent to calling `.bind`: ```jsx harmony <button onClick={this.handleClick.bind(this, id)} />
Apart from these two approaches, you can also pass arguments to a function which is defined as arrow function ```jsx harmony <button onClick={this.handleClick(id)} /> handleClick = (id) => () => {console.log("Hello, your ticket number is", id)
};
Вопрос № 6: Что такое синтетические события в React?
SyntheticEvent
— это кросс-браузерная оболочка собственного события браузера. Его API такой же, как и собственное событие браузера, включая stopPropagation()
и preventDefault()
, за исключением того, что события работают одинаково во всех браузерах.
Вопрос № 7: Что такое встроенные условные выражения?
Вы можете использовать либо операторы if, либо тернарные выражения, доступные в JS, для условного отображения выражений. Помимо этих подходов, вы также можете встроить любые выражения в JSX, заключив их в фигурные скобки, а затем логический оператор JS &&
.
jsx harmony <h1>Hello!</h1>
{
messages.length > 0 && !isLogin?
<h2>
You have {messages.length} unread messages.
</h2>:
<h2>You don't have unread messages.</h2>
}
Вопрос № 8: Что такое «ключевой» реквизит и в чем польза от его использования в массивах элементов?
key
— это специальный строковый атрибут, который должен включаться при создании массивов элементов. Свойство Key помогает React определить, какие элементы были изменены, добавлены или удалены.
Чаще всего в качестве ключа мы используем идентификатор из наших данных:
jsx harmony const todoItems = todos.map((todo) => <li key={todo.id}>{todo.text}
</li> )When you don't have stable IDs for rendered items, you may use the item *index* as a *key* as a last resort: jsx harmony const todoItems = todos.map((todo, index) => <li key={index}> {todo.text} </li> )
Примечание.
Использование индексов для ключей не рекомендуется, если порядок элементов может измениться. Это может отрицательно сказаться на производительности и вызвать проблемы с состоянием компонента.
Если вы извлекаете элемент списка как отдельный компонент, применяйте ключи к компоненту списка вместо тега li
.
В консоли появится предупреждающее сообщение, если реквизит key
отсутствует в элементах списка.
Вопрос № 9: Какая польза от рефов?
ref используется для возврата ссылки на элемент. Их следует избегать в большинстве случаев, однако они могут быть полезны, когда вам нужен прямой доступ к элементу DOM или экземпляру компонента.
Вопрос №10: Как создавать рефов?
Есть два подхода
Это недавно добавленный подход. Refs создаются с использованием React.createRef()
метода и присоединяются к элементам React с помощью атрибута ref
. Чтобы использовать refs во всем компоненте, просто назначьте ref свойству экземпляра в конструкторе.
jsx harmony class MyComponent extends React.Component { constructor(props) {super(props) this.myRef = React.createRef()
} render() {return <div ref={this.myRef} />
} }
Вы также можете использовать подход обратных вызовов ref независимо от версии React. Например, доступ к элементу ввода компонента панели поиска осуществляется следующим образом:
jsx harmony class SearchBar extends Component {
constructor(props) {
super(props);
this.txtSearch = null;
this.state = { term: '' };
this.setInputSearchRef = e => {
this.txtSearch = e;
}
}
onInputChange(event) {
this.setState({ term: this.txtSearch.value }); }
render() {
return (
<input value={this.state.term} onChange={this.onInputChange.bind(this)} ref={this.setInputSearchRef} />); }
}
Вы также можете использовать ссылки в функциональных компонентах, используя замыкания. Примечание. Вы также можете использовать встроенные обратные вызовы ref, хотя это не рекомендуется.