--- id: 5a24c314108439a4d4036188 title: Render Conditionally from Props challengeType: 6 isRequired: false videoUrl: '' localeTitle: Procesamiento condicional de apoyos --- ## Description
Hasta ahora, ha visto cómo usar if/else , &&, null y el operador ternario ( condition ? expressionIfTrue : expressionIfFalse ) para tomar decisiones condicionales sobre qué representar y cuándo. Sin embargo, hay un tema importante que queda por discutir que te permite combinar cualquiera o todos estos conceptos con otra poderosa característica React: accesorios. El uso de utilería para generar condicionalmente el código es muy común entre los desarrolladores de React, es decir, utilizan el valor de una prop determinada para tomar decisiones automáticamente sobre qué representar. En este desafío, configurará un componente secundario para tomar decisiones de representación basadas en accesorios. También usará el operador ternario, pero puede ver cómo varios de los otros conceptos que se cubrieron en los últimos desafíos podrían ser igual de útiles en este contexto.
## Instructions
El editor de código tiene dos componentes que están parcialmente definidos para usted: un padre llamado GameOfChance y un hijo llamado Results . Se utilizan para crear un juego simple en el que el usuario presiona un botón para ver si gana o pierde. Primero, necesitará una expresión simple que retorne aleatoriamente un valor diferente cada vez que se ejecute. Puedes usar Math.random() . Este método devuelve un valor entre 0 (incluido) y 1 (exclusivo) cada vez que se llama. Entonces, para probabilidades 50/50, use Math.random() > .5 en su expresión. Estadísticamente hablando, esta expresión devolverá true 50% del tiempo, y false el otro 50%. En la línea 30, reemplace el comentario con esta expresión para completar la declaración de la variable. Ahora tiene una expresión que puede usar para tomar una decisión aleatoria en el código. A continuación necesitas implementar esto. Procese el componente Results como un elemento secundario de GameOfChance y pase la expression como un prop llamado fiftyFifty . En el componente Results , escriba una expresión ternaria para representar el texto "You win!" o "You lose!" basado en la propuesta fiftyFifty que se transmite desde GameOfChance . Finalmente, asegúrese de que el método handleClick() esté contando correctamente cada turno para que el usuario sepa cuántas veces ha jugado. Esto también sirve para que el usuario sepa que el componente se ha actualizado en caso de que gane o pierda dos veces seguidas.
## Tests
```yml tests: - text: El componente GameOfChance debe existir y representarse en la página. testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).find("GameOfChance").length, 1, "The GameOfChance component should exist and render to the page.");' - text: GameOfChance debería devolver un único elemento de button . testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).find("button").length, 1, "GameOfChance should return a single button element.");' - text: 'GameOfChance debe devolver una sola instancia del componente Results , que tiene un prop llamado fiftyFifty .' testString: 'assert(Enzyme.mount(React.createElement(GameOfChance)).find("Results").length === 1 && Enzyme.mount(React.createElement(GameOfChance)).find("Results").props().hasOwnProperty("fiftyFifty") === true, "GameOfChance should return a single instance of the Results component, which has a prop called fiftyFifty.");' - text: GameOfChance estado de GameOfChance debe inicializar con una propiedad de counter configurada en un valor de 1 . testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).state().counter, 1, "GameOfChance state should be initialized with a property of counter set to a value of 1.");' - text: 'Cuando el componente GameOfChance se procesa por primera vez en el DOM, se debe devolver un elemento p con el texto interno de Turn: 1 .' testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).find("p").text(), "Turn: 1", "When the GameOfChance component is first rendered to the DOM, a p element should be returned with the inner text of Turn: 1.");' - text: 'Cada vez que se hace clic en el botón, el estado del contador debe incrementarse en un valor de 1, y se debe representar un solo elemento p en el DOM que contiene el texto "Turn: N", donde N es el valor del estado del contador.' testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const comp = Enzyme.mount(React.createElement(GameOfChance)); const simulate = () => { comp.find("button").simulate("click"); };const result = () => ({ count: comp.state("counter"), text: comp.find("p").text() });const _1 = () => { simulate(); return waitForIt(() => result())}; const _2 = () => { simulate(); return waitForIt(() => result())}; const _3 = () => { simulate(); return waitForIt(() => result())}; const _4 = () => { simulate(); return waitForIt(() => result())}; const _5 = () => { simulate(); return waitForIt(() => result())}; const _1_val = await _1(); const _2_val = await _2(); const _3_val = await _3(); const _4_val = await _4(); const _5_val = await _5(); assert(_1_val.count === 2 && _1_val.text === "Turn: 2" && _2_val.count === 3 && _2_val.text === "Turn: 3" && _3_val.count === 4 && _3_val.text === "Turn: 4" && _4_val.count === 5 && _4_val.text === "Turn: 5" && _5_val.count === 6 && _5_val.text === "Turn: 6", "Each time the button is clicked, the counter state should be incremented by a value of 1, and a single p element should be rendered to the DOM that contains the text "Turn: N", where N is the value of the counter state."); }; ' - text: 'Cuando el componente GameOfChance se monta por primera vez en el DOM y cada vez que se hace clic en el botón a continuación, se debe devolver un único elemento h1 que muestre aleatoriamente ¡ You Win! o You Lose! .' testString: 'async () => { const waitForIt = (fn) => new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250)); const comp = Enzyme.mount(React.createElement(GameOfChance)); const simulate = () => { comp.find("button").simulate("click"); };const result = () => ({ h1: comp.find("h1").length, text: comp.find("h1").text() });const _1 = result(); const _2 = () => { simulate(); return waitForIt(() => result())}; const _3 = () => { simulate(); return waitForIt(() => result())}; const _4 = () => { simulate(); return waitForIt(() => result())}; const _5 = () => { simulate(); return waitForIt(() => result())}; const _6 = () => { simulate(); return waitForIt(() => result())}; const _7 = () => { simulate(); return waitForIt(() => result())}; const _8 = () => { simulate(); return waitForIt(() => result())}; const _9 = () => { simulate(); return waitForIt(() => result())}; const _10 = () => { simulate(); return waitForIt(() => result())}; const _2_val = await _2(); const _3_val = await _3(); const _4_val = await _4(); const _5_val = await _5(); const _6_val = await _6(); const _7_val = await _7(); const _8_val = await _8(); const _9_val = await _9(); const _10_val = await _10(); const __text = new Set([_1.text, _2_val.text, _3_val.text, _4_val.text, _5_val.text, _6_val.text, _7_val.text, _8_val.text, _9_val.text, _10_val.text]); const __h1 = new Set([_1.h1, _2_val.h1, _3_val.h1, _4_val.h1, _5_val.h1, _6_val.h1, _7_val.h1, _8_val.h1, _9_val.h1, _10_val.h1]); assert(__text.size === 2 && __h1.size === 1, "When the GameOfChance component is first mounted to the DOM and each time the button is clicked thereafter, a single h1 element should be returned that randomly renders either You Win! or You Lose!."); }; ' ```
## Challenge Seed
```jsx class Results extends React.Component { constructor(props) { super(props); } render() { return (

{ /* change code here */ }

) }; }; class GameOfChance extends React.Component { constructor(props) { super(props); this.state = { counter: 1 } this.handleClick = this.handleClick.bind(this); } handleClick() { this.setState({ counter: 0 // change code here }); } render() { let expression = null; // change code here return (
{ /* change code below this line */ } { /* change code above this line */ }

{'Turn: ' + this.state.counter}

); } }; ```
### After Test
```js console.info('after the test'); ```
## Solution
```js // solution required ```