200 lines
5.3 KiB
Markdown
200 lines
5.3 KiB
Markdown
---
|
||
id: 5a24c314108439a4d4036166
|
||
title: Створення компонентів React
|
||
challengeType: 6
|
||
forumTopicId: 301381
|
||
dashedName: compose-react-components
|
||
---
|
||
|
||
# --description--
|
||
|
||
Оскільки завдання продовжують використовувати складніші композиції з компонентами React та JSX, слід зазначити один важливий момент. Візуалізація компонентів класу ES6 в інших компонентах нічим не відрізняється від візуалізації простих компонентів, які використовувалися в останніх кількох завданнях. Можна відтворювати елементи JSX, прості функціональні компоненти та компоненти класу ES6 в рамках інших компонентів.
|
||
|
||
# --instructions--
|
||
|
||
У редакторі коду компонент `TypesOfFood` вже відображає компонент з назвою `Vegetables`. Також, в останньому завданні є компонент `Fruits`.
|
||
|
||
Створіть два компоненти всередині `Fruits`: спочатку - `NonCitrus`, потім - `Citrus`. Обидва ці компоненти доступні у налаштуваннях за замовчуванням. Далі, додайте компонент класу `Fruits` до компонента `TypesOfFood` під заголовком `h1` та над `Vegetables`. У результаті отримуємо низку вкладених компонентів, яка використовує два різних типи компонентів.
|
||
|
||
# --hints--
|
||
|
||
Компонент `TypesOfFood` повинен показувати одинарний елемент `div`.
|
||
|
||
```js
|
||
assert(
|
||
(function () {
|
||
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
||
return mockedComponent.children().type() === 'div';
|
||
})()
|
||
);
|
||
```
|
||
|
||
Компонент `TypesOfFood` повинен показувати компонент `Fruits`.
|
||
|
||
```js
|
||
assert(
|
||
(function () {
|
||
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
||
return mockedComponent.children().childAt(1).name() === 'Fruits';
|
||
})()
|
||
);
|
||
```
|
||
|
||
Компонент `Fruits` повинен показувати компоненти `NonCitrus` та `Citrus`.
|
||
|
||
```js
|
||
assert(
|
||
(function () {
|
||
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
||
return (
|
||
mockedComponent.find('Fruits').children().find('NonCitrus').length ===
|
||
1 &&
|
||
mockedComponent.find('Fruits').children().find('Citrus').length === 1
|
||
);
|
||
})()
|
||
);
|
||
```
|
||
|
||
Компонент `TypesOfFood` повинен показувати компонент `Vegetables` нижче від компонента `Fruits`.
|
||
|
||
```js
|
||
assert(
|
||
(function () {
|
||
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
||
return mockedComponent.children().childAt(2).name() === 'Vegetables';
|
||
})()
|
||
);
|
||
```
|
||
|
||
# --seed--
|
||
|
||
## --before-user-code--
|
||
|
||
```jsx
|
||
class NonCitrus extends React.Component {
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h4>Non-Citrus:</h4>
|
||
<ul>
|
||
<li>Apples</li>
|
||
<li>Blueberries</li>
|
||
<li>Strawberries</li>
|
||
<li>Bananas</li>
|
||
</ul>
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
class Citrus extends React.Component {
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h4>Citrus:</h4>
|
||
<ul>
|
||
<li>Lemon</li>
|
||
<li>Lime</li>
|
||
<li>Orange</li>
|
||
<li>Grapefruit</li>
|
||
</ul>
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
class Vegetables extends React.Component {
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h2>Vegetables:</h2>
|
||
<ul>
|
||
<li>Brussel Sprouts</li>
|
||
<li>Broccoli</li>
|
||
<li>Squash</li>
|
||
</ul>
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
```
|
||
|
||
## --after-user-code--
|
||
|
||
```jsx
|
||
ReactDOM.render(<TypesOfFood />, document.getElementById('root'))
|
||
```
|
||
|
||
## --seed-contents--
|
||
|
||
```jsx
|
||
class Fruits extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
}
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h2>Fruits:</h2>
|
||
{ /* Change code below this line */ }
|
||
|
||
{ /* Change code above this line */ }
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
|
||
class TypesOfFood extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
}
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h1>Types of Food:</h1>
|
||
{ /* Change code below this line */ }
|
||
|
||
{ /* Change code above this line */ }
|
||
<Vegetables />
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
```
|
||
|
||
# --solutions--
|
||
|
||
```jsx
|
||
class Fruits extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
}
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h2>Fruits:</h2>
|
||
{ /* Change code below this line */ }
|
||
<NonCitrus />
|
||
<Citrus />
|
||
{ /* Change code above this line */ }
|
||
</div>
|
||
)
|
||
}
|
||
}
|
||
|
||
class TypesOfFood extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
}
|
||
render() {
|
||
return (
|
||
<div>
|
||
<h1>Types of Food:</h1>
|
||
{ /* Change code below this line */ }
|
||
<Fruits />
|
||
{ /* Change code above this line */ }
|
||
<Vegetables />
|
||
</div>
|
||
);
|
||
}
|
||
};
|
||
```
|