3.6 KiB
3.6 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5a24c314108439a4d403616f | 复习如何使用 Props 和无状态函数组件 | 6 | 301411 | review-using-props-with-stateless-functional-components |
--description--
除了上一个挑战,你一直在将 props 传递给无状态的函数组件。这些组件就像纯函数,它们接收 props 作为输入,并在每次传递相同 props 时返回相同的视图。你可能会想知道什么是状态,下一个挑战将会更详细地讲述它。在此之前,我们先来回顾一下组件的术语。
无状态函数组件是一个函数,它接收 props 作为输入并返回 JSX。另一方面,无状态组件是一个类,它扩展了React.Component
,但是不使用内部状态(下一个挑战中讨论)。最后,状态组件是指维护其自身内部状态的组件,它简称组件或 React 组件。
一种常见的应用模式是尽可能减少状态组件并创建无状态的函数组件。这有助于将状态管理包含到应用程序的特定区域。反过来,通过更容易地跟踪状态变化如何影响其行为,可以改进应用程序的开发和维护。
--instructions--
在代码编辑器中有一个CampSite
组件,它把Camper
组件渲染为自己的子组件。定义Camper
组件,并为其分配默认 props{ name: 'CamperBot' }
。你可以在Camper
组件内部渲染任何你想要的代码,但是要确保有一个p
元素,它只包含作为prop
传递的name
值。最后,在Camper
组件上定义propTypes
,要求提供name
作为 prop,并验证它是string
类型。
--hints--
应该渲染CampSite
组件。
assert(
(function () {
const mockedComponent = Enzyme.mount(React.createElement(CampSite));
return mockedComponent.find('CampSite').length === 1;
})()
);
应该渲染Camper
组件。
assert(
(function () {
const mockedComponent = Enzyme.mount(React.createElement(CampSite));
return mockedComponent.find('Camper').length === 1;
})()
);
Camper
组件应该包含默认 props,它将字符串CamperBot
赋值给关键字name
。
assert(
/Camper.defaultProps={name:(['"`])CamperBot\1,?}/.test(
code.replace(/\s/g, '')
)
);
Camper
组件应该包含string
类型的name
prop。
assert(
/Camper.propTypes={name:PropTypes.string.isRequired,?}/.test(
code.replace(/\s/g, '')
)
);
Camper
组件应该包含一个p
元素,元素内是来自propname
的唯一文本。
assert(
(function () {
const mockedComponent = Enzyme.mount(React.createElement(CampSite));
return (
mockedComponent.find('p').text() ===
mockedComponent.find('Camper').props().name
);
})()
);
--seed--
--before-user-code--
var PropTypes = {
string: { isRequired: true }
};
--after-user-code--
ReactDOM.render(<CampSite />, document.getElementById('root'))
--seed-contents--
class CampSite extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Camper/>
</div>
);
}
};
// Change code below this line
--solutions--
class CampSite extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Camper/>
</div>
);
}
};
// Change code below this line
const Camper = (props) => {
return (
<div>
<p>{props.name}</p>
</div>
);
};
Camper.propTypes = {
name: PropTypes.string.isRequired
};
Camper.defaultProps = {
name: 'CamperBot'
};