200 lines
4.5 KiB
Markdown
200 lines
4.5 KiB
Markdown
---
|
|
id: 5a24c314108439a4d4036166
|
|
title: Compor componentes do React
|
|
challengeType: 6
|
|
forumTopicId: 301381
|
|
dashedName: compose-react-components
|
|
---
|
|
|
|
# --description--
|
|
|
|
Enquanto os desafios continuam a usar composições mais complexas com componentes React e JSX, há um ponto importante a se notar. Renderizar componentes de classe de estilo ES6 dentro de outros componentes não é diferente de renderizar componentes simples que você usou nos últimos desafios. Você pode renderizar elementos JSX, componentes funcionais sem estado e componentes de classe ES6 dentro de outros componentes.
|
|
|
|
# --instructions--
|
|
|
|
No editor de código, o componente `TypesOfFood` já está renderizando um componente chamado `Vegetables`. Além disso, há o componente `Fruits` do último desafio.
|
|
|
|
Aninhe dois componentes dentro de `Fruits` — primeiro `NonCitrus`, e depois `Citrus`. Ambos os componentes são fornecidos nos bastidores. Em seguida, aninhe o componente de classe `Fruits` dentro do componente `TypesOfFood`, abaixo do elemento de título `h1` e acima de `Vegetables`. O resultado deve ser uma série de componentes aninhados, que usa dois tipos de componentes diferentes.
|
|
|
|
# --hints--
|
|
|
|
O componente `TypesOfFood` deve retornar um único elemento `div`.
|
|
|
|
```js
|
|
assert(
|
|
(function () {
|
|
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
|
return mockedComponent.children().type() === 'div';
|
|
})()
|
|
);
|
|
```
|
|
|
|
O componente `TypesOfFood` deve retornar o componente `Fruits`.
|
|
|
|
```js
|
|
assert(
|
|
(function () {
|
|
const mockedComponent = Enzyme.mount(React.createElement(TypesOfFood));
|
|
return mockedComponent.children().childAt(1).name() === 'Fruits';
|
|
})()
|
|
);
|
|
```
|
|
|
|
O componente `Fruits` deve retornar o componente `NonCitrus` e o componente `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
|
|
);
|
|
})()
|
|
);
|
|
```
|
|
|
|
O componente `TypesOfFood` deve retornar o componente `Vegetables` abaixo do componente `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>
|
|
);
|
|
}
|
|
};
|
|
```
|