Files
freeCodeCamp/curriculum/challenges/russian/03-front-end-libraries/react/set-state-with-this.setstate.russian.md

86 lines
6.6 KiB
Markdown
Raw Normal View History

---
id: 5a24c314108439a4d4036173
title: Set State with this.setState
challengeType: 6
isRequired: false
videoUrl: ''
localeTitle: Установить состояние с this.setState
---
## Description
<section id="description"> Предыдущие проблемы охватывали <code>state</code> компонента и как инициализировать состояние в <code>constructor</code> . Существует также способ изменения компоненты <code>state</code> . React предоставляет способ обновления <code>state</code> компонента, называемого <code>setState</code> . Вы вызываете метод <code>setState</code> в своем классе компонентов следующим образом: <code>this.setState()</code> , передавая объект с парами ключ-значение. Ключами являются ваши свойства состояния, а значения - это обновленные данные состояния. Например, если мы сохраняем <code>username</code> в состоянии и хотим его обновить, он будет выглядеть так: <blockquote> this.setState ({ <br> имя пользователя: &#39;Lewis&#39; <br> }); </blockquote> React ожидает, что вы никогда не измените <code>state</code> напрямую, вместо этого всегда используйте <code>this.setState()</code> когда происходят изменения состояния. Кроме того, вы должны отметить, что React может выполнять несколько обновлений состояния, чтобы повысить производительность. Это означает, что обновления состояния через метод <code>setState</code> могут быть асинхронными. Существует альтернативный синтаксис метода <code>setState</code> который обеспечивает способ решения этой проблемы. Это редко необходимо, но хорошо помнить об этом! Для получения дополнительной информации обратитесь к <a target="_blank" href="https://facebook.github.io/react/docs/state-and-lifecycle.html">документации React</a> . </section>
## Instructions
<section id="instructions"> В редакторе кода есть элемент <code>button</code> который имеет обработчик <code>onClick()</code> . Этот обработчик запускается, когда <code>button</code> получает событие click в браузере и запускает метод <code>handleClick</code> определенный в <code>MyComponent</code> . В методе <code>handleClick</code> обновите <code>state</code> компонента, используя <code>this.setState()</code> . Задайте свойство <code>name</code> в <code>state</code> равным строке <code>React Rocks!</code> , Нажмите кнопку и просмотрите обновленное состояние. Не беспокойтесь, если вы не совсем понимаете, как работает код обработчика кликов. Это связано с предстоящими проблемами. </section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Состояние <code>MyComponent</code> должно инициализироваться с помощью пары значений ключа <code>{ name: Initial State }</code> .'
testString: 'assert(Enzyme.mount(React.createElement(MyComponent)).state("name") === "Initial State", "The state of <code>MyComponent</code> should initialize with the key value pair <code>{ name: Initial State }</code>.");'
- text: <code>MyComponent</code> должен отображать заголовок <code>h1</code> .
testString: 'assert(Enzyme.mount(React.createElement(MyComponent)).find("h1").length === 1, "<code>MyComponent</code> should render an <code>h1</code> header.");'
- text: 'Представленный <code>h1</code> заголовок должен содержать текст, отображаемый из состояния компонента.'
testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); const first = () => { mockedComponent.setState({ name: "TestName" }); return waitForIt(() => mockedComponent.html()); }; const firstValue = await first(); assert(/<h1>TestName<\/h1>/.test(firstValue), "The rendered <code>h1</code> header should contain text rendered from the component&apos;s state."); };'
- text: 'Вызов метода <code>handleClick</code> на <code>MyComponent</code> должен установить свойство name в состоянии равным <code>React Rocks!</code> ,'
testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const mockedComponent = Enzyme.mount(React.createElement(MyComponent)); const first = () => { mockedComponent.setState({ name: "Before" }); return waitForIt(() => mockedComponent.state("name")); }; const second = () => { mockedComponent.instance().handleClick(); return waitForIt(() => mockedComponent.state("name")); }; const firstValue = await first(); const secondValue = await second(); assert(firstValue === "Before" && secondValue === "React Rocks!", "Calling the <code>handleClick</code> method on <code>MyComponent</code> should set the name property in state to equal <code>React Rocks!</code>."); };'
```
</section>
## Challenge Seed
<section id='challengeSeed'>
<div id='jsx-seed'>
```jsx
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'Initial State'
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
// change code below this line
// change code above this line
}
render() {
return (
<div>
<button onClick={this.handleClick}>Click Me</button>
<h1>{this.state.name}</h1>
</div>
);
}
};
```
</div>
### After Test
<div id='jsx-teardown'>
```js
console.info('after the test');
```
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
```
</section>