if/else
, &&,
null
和三元运算符( condition ? expressionIfTrue : expressionIfFalse
)来做出有关呈现内容和何时呈现的条件决策。但是,还有一个重要的话题要讨论,它可以让你将这些概念中的任何一个或全部与另一个强大的React功能结合起来:道具。使用props来有条件地呈现代码对于React开发人员来说非常普遍 - 也就是说,他们使用给定prop的值来自动决定渲染内容。在此挑战中,您将设置子组件以根据道具进行渲染决策。您还将使用三元运算符,但您可以看到在最后几个挑战中涵盖的其他几个概念在此上下文中可能同样有用。 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()
方法正确计算每个回合,以便用户知道他们玩了多少次。这也用于让用户知道组件已经实际更新,以防它们连续两次赢或输。 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!
."); }; '
```
{'Turn: ' + this.state.counter}