--- id: 5a24c314108439a4d4036188 title: Render Conditionally from Props challengeType: 6 isRequired: false videoUrl: '' localeTitle: 从道具有条理地渲染 --- ## Description
到目前为止,您已经了解了如何使用if/else&&, null和三元运算符( condition ? expressionIfTrue : expressionIfFalse )来做出有关呈现内容和何时呈现的条件决策。但是,还有一个重要的话题要讨论,它可以让你将这些概念中的任何一个或全部与另一个强大的React功能结合起来:道具。使用props来有条件地呈现代码对于React开发人员来说非常普遍 - 也就是说,他们使用给定prop的值来自动决定渲染内容。在此挑战中,您将设置子组件以根据道具进行渲染决策。您还将使用三元运算符,但您可以看到在最后几个挑战中涵盖的其他几个概念在此上下文中可能同样有用。
## Instructions
代码编辑器有两个部分为您定义的组件:名为GameOfChance的父GameOfChance和名为Results的子级。它们用于创建一个简单的游戏,用户按下按钮以查看它们是赢还是输。首先,您需要一个简单的表达式,每次运行时都会随机返回一个不同的值。您可以使用Math.random() 。每次调用此方法时,此方法返回0 (包括)和1 (不包括)之间的值。因此,对于50/50赔率,请在表达式中使用Math.random() > .5 。从统计学上讲,这个表达式将在50%的时间内返回true ,而在其他50%时则返回false 。在第30行,用此表达式替换注释以完成变量声明。现在您有了一个表达式,您可以使用该表达式在代码中做出随机决策。接下来,您需要实现此功能。将Results组件渲染为GameOfChance的子GameOfChance ,并将expression作为名为fiftyFifty的prop fiftyFifty 。在Results组件中,编写一个三元表达式来呈现文本"You win!"或者"You lose!"基于从GameOfChance传入的fiftyFifty道具。最后,确保handleClick()方法正确计算每个回合,以便用户知道他们玩了多少次。这也用于让用户知道组件已经实际更新,以防它们连续两次赢或输。
## Tests
```yml tests: - text: GameOfChance组件应存在并呈现给页面。 testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).find("GameOfChance").length, 1, "The GameOfChance component should exist and render to the page.");' - text: GameOfChance应返回单个button元素。 testString: 'assert.strictEqual(Enzyme.mount(React.createElement(GameOfChance)).find("button").length, 1, "GameOfChance should return a single button element.");' - text: GameOfChance应返回Results组件的单个实例,其中有一个名为fiftyFifty的prop。 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: 应该使用counter设置为值1的属性初始化GameOfChance状态。 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: '当GameOfChance组件首次呈现给DOM时,应返回一个p元素,内部文本为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: 每次单击该按钮时,计数器状态应增加值1,并且应将单个p元素呈现给包含文本“Turn:N”的DOM,其中N是计数器状态的值。 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: 首次将GameOfChance组件安装到DOM时,每次单击该按钮时,应返回单个h1元素,随机呈现You Win!或者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 ```