3.5 KiB
id, title, challengeType, forumTopicId, dashedName
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5a24c314108439a4d4036171 | 在用戶界面中渲染狀態 | 6 | 301409 | render-state-in-the-user-interface |
--description--
定義了組件的初始 state 之後,就可以在要渲染的 UI 中顯示它。 如果組件是有狀態的,它將始終可以訪問 render()
方法中 state
的數據。 就可以使用 this.state
訪問數據。
如果想在 render 方法的 return
中訪問 state 值,必須把這個值用花括號括起來。
state
是 React 組件中最強大的特性之一, 它可以跟蹤應用程序中的重要數據,並根據數據的變化渲染 UI。 如果數據發生變化,UI 也會隨之改變。 React 使用所謂的虛擬 DOM 來跟蹤幕後的變化。 當 state 數據更新時,它會使用該數據觸發組件的重新渲染 -- 包括接收 prop 數據的子組件。 React 只在必要的時候更新實際的 DOM, 這意味着你不必擔心 DOM 的變更, 只需聲明 UI 的外觀即可。
注意,如果組件是有狀態的,其它組件並不知道它的 state
。 它的 state
是完全封裝的,或者是侷限於組件本身的,除非你將 state 數據作爲 props
傳遞給子組件。 封裝 state
的概念非常重要,因爲它允許編寫特定的邏輯,然後將該邏輯包含並隔離在代碼中的某個位置。
--instructions--
在代碼編輯器中,MyComponent
是一個有狀態組件, 在組件的 render 方法中定義一個h1
標籤,該方法從組件的 state 渲染 name
的值。
注意: h1
應該只渲染來自 state
的值。 在 JSX 中,使用花括號 { }
編寫的任何代碼都將被視爲 JavaScript。 因此,要訪問 state
中的值,只需將引用括在花括號中即可。
--hints--
MyComponent
應該有一個鍵 name
,其值 freeCodeCamp
存儲在其 state 中。
assert(
Enzyme.mount(React.createElement(MyComponent)).state('name') ===
'freeCodeCamp'
);
MyComponent
應該在 div
中渲染一個 h1
標題元素。
assert(
/<div><h1>.*<\/h1><\/div>/.test(
Enzyme.mount(React.createElement(MyComponent)).html()
)
);
渲染的 h1
標題元素應該只包含從組件狀態渲染的文本。
async () => {
const waitForIt = (fn) =>
new Promise((resolve, reject) => setTimeout(() => resolve(fn()), 250));
const mockedComponent = Enzyme.mount(React.createElement(MyComponent));
const first = () => {
mockedComponent.setState({ name: 'TestName' });
return waitForIt(() => mockedComponent.html());
};
const firstValue = await first();
const getValue = firstValue.replace(/\s/g, '');
assert(getValue === '<div><h1>TestName</h1></div>');
};
--seed--
--after-user-code--
ReactDOM.render(<MyComponent />, document.getElementById('root'))
--seed-contents--
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'freeCodeCamp'
}
}
render() {
return (
<div>
{ /* Change code below this line */ }
{ /* Change code above this line */ }
</div>
);
}
};
--solutions--
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
name: 'freeCodeCamp'
}
}
render() {
return (
<div>
{ /* Change code below this line */ }
<h1>{this.state.name}</h1>
{ /* Change code above this line */ }
</div>
);
}
};