摘要:在大多数情况下,我们期望这些是一种特定类型或一组类型也称为或。例如,几天前我们构建的组件接受一个称为的属性,我们期望它是一个字符串。必需类型可以通过在任意个属性类型中附加中描述来将需要传递给一个组件根据需要设置是非常有用的。
本文转载自:众成翻译
译者:iOSDevLog
链接:http://www.zcfy.cc/article/3818
原文:https://www.fullstackreact.com/30-days-of-react/day-8/
我们正在考虑如何在今天重新使用React组件,这样我们不仅可以在应用而且可以在团队中共享我们的组件。
唷! 我们做了第二周(相对毫发)! 通过这一点,我们已经讨论了React(props,state,生命周期挂钩函数,JSX等)的大部分基本特性。 在本节中,我们将看一下注解我们的组件。
PropTypes您可能已经注意到我们在组件中使用了props 。 在大多数情况下,我们期望这些是一种特定类型或一组类型(也称为object 或string)。 React提供了一种定义和验证这些类型的方法,使我们能够轻松暴露组件API。
文档化不仅是好习惯,对于构建也是有益的reusable react components.
React.PropTypes对象导出一堆不同的类型,我们可以用它来定义组件的prop应该是什么类型的。 我们可以在ES6类风格的React prop中使用propTypes方法来定义它们:
class Clock extends React.Component { // ... } Clock.propTypes = { // key is the name of the prop and // value is the PropType }
使用React.createClass() 形式, 我们定义一个propTypes的key
例如,我们可以将Clock组件的形式重写为:const Clock = React.createClass({ proptypes: {} });
从这个prop里面,我们可以定义一个对象,它具有一个prop的key作为我们定义的prop的名称,它应被定义的类型(或类型)的一个值。
例如,几天前我们构建的Header 组件接受一个称为title 的属性,我们期望它是一个字符串。 我们可以将其类型定义为字符串:
class Header extends React.Component { // ... } Header.propTypes = { title: React.PropTypes.string }
React有很多类型可供选择,在React.PropTypes 对象上导出,甚至允许我们定义一个自定义的对象类型。 看看可用类型的总体列表:
[](#basic-types)基本类型React暴露了我们可以开箱即用的几种基本类型。
类型 | 例子 | 类 |
---|---|---|
String | "hello" | React.PropTypes.string |
Number | 10, 0.1 | React.PropTypes.number |
Boolean | true / false | React.PropTypes.bool |
Function | const say => (msg) => console.log("Hello world") | React.PropTypes.func |
Symbol | Symbol("msg") | React.PropTypes.symbol |
Object | {name: "Ari"} | React.PropTypes.object |
Anything | "whatever", 10, | {} |
可以告诉React我们希望它传递_anything_可以使用React.PropTypes.node来呈现:
类型 | 例子 | 类 |
---|---|---|
A rendererable | 10, "hello" | React.PropTypes.node |
Clock.propTypes = { title: React.PropTypes.string, count: React.PropTypes.number, isOn: React.PropTypes.bool, onDisplay: React.PropTypes.func, symbol: React.PropTypes.symbol, user: React.PropTypes.object, name: React.PropTypes.node }
我们已经看过如何使用props从父组件到子组件进行通信。 我们可以使用函数从子组件到父组件进行通信。 当我们想要操作一个子组件的父组件时,我们会经常使用这种模式。
集合类型我们可以通过我们的props中的可迭代的集合。 当我们通过我们的活动通过一个数组时,我们已经看到了如何做到这一点。 要将组件的proptype声明为数组,我们可以使用 React.PropTypes.array 注解。
我们也可以要求数组只能使用某种类型的对象 React.PropTypes.arrayOf([]).
类型 | 例子 | 类 |
---|---|---|
Array | [] | React.PropTypes.array |
Array of numbers | [1, 2, 3] | React.PropTypes.arrayOf([type]) |
Enum | ["Red", "Blue"] | React.PropTypes.oneOf([arr]) |
可以使用React.PropTypes.oneOfType([types])来描述可以是几种不同类型之一的对象。
Clock.propTypes = { counts: React.PropTypes.array, users: React.PropTypes.arrayOf(React.PropTypes.object), alarmColor: React.PropTypes.oneOf(["red", "blue"]), description: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.instanceOf(Title) ]), }对象类型
可以定义需要某个特定类型的特定类型或实例的类型。
类型 | 例子 | 类 |
---|---|---|
Object | {name: "Ari"} | React.PropTypes.object |
Number object | {count: 42} | React.PropTypes.objectOf() |
Instance | new Message() | React.PropTypes.objectOf() |
Object shape | {name: "Ari"} | React.PropTypes.shape() |
Clock.propTypes = { basicObject: React.PropTypes.object, numbers: React.PropTypes .objectOf(React.PropTypes.numbers), messages: React.PropTypes .instanceOf(Message), contactList: React.PropTypes.shape({ name: React.PropTypes.string, phone: React.PropTypes.string, }) }React类型
我们也可以通过React元素从父组件到子组件。 这对于构建模板和提供模板的定制非常有用。
类型 | 例子 | 类 |
---|---|---|
Element | React.PropTypes.element |
Clock.propTypes = { displayEle: React.PropTypes.element }
当我们使用_element_时,React希望我们能够接受一个多带带的子组件。 也就是说,我们将无法传递多个元素。
// Invalid for elementsName
可以通过在_任意_个属性类型中附加.isRequired中描述来将需要传递给一个组件:
Clock.propTypes = { title: React.PropTypes.name.isRequired, }
根据需要设置prop是非常有用的。当组件依赖于一个prop被它的父组件传递,如果没有它将不会工作。
自定义类型最后,还可以传递一个函数来定义自定义类型。 我们可以做一个单一属性或验证数组。 自定义函数的一个要求是,如果验证确定_not_ 传递,则期望我们返回一个 Error 对象:
类型 | 例子 | 类 |
---|---|---|
Custom | "something_crazy" | function(props, propName, componentName) {} |
CustomArray | ["something", "crazy"] | React.PropTypes.arrayOf(function(props, propName, componentName) {}) |
UserLink.propTypes = { userWithName: (props, propName, componentName) => { if (!props[propName] || !props[propName].name) { return new Error( "Invalid " + propName + ": No name property defined for component " + componentName ) } } }默认属性
rendered, so we can define a common title instead by setting it"s default prop value.有时,我们希望能够为属性设置默认值。 例如,我们昨天构建的组件可能不需要传递标题。 如果不是,我们仍然需要一个标题来渲染,所以我们可以通过设置它的默认支持值来定义一个通用的标题。
要设置默认的prop值,我们可以在组件上使用defaultProps对象键。
Header.defaultProps = { title: "Github activity" }
当使用React.createClass() 形式时,我们可以定义一个名为getDefaultProps() 的对象键,该对象键将返回具有默认值道具的对象。
React.createClass({ getDefaultProps: () => ({ name: "Github activity" }) })
呃,今天我们浏览了很多文档。 使用组件的propTypes 和defaultProps 属性构建可重用组件是一个好主意。 不仅可以使开发人员之间进行沟通变得更加容易,而且在离开组件几天后我们也可以轻松回收。 接下来,我们将回到代码,并开始将某些风格整合到我们的组件中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/84671.html
摘要:今天我们将讨论创建组件的最终方案,即无状态函数的纯组件。今天我们正在研究一种处理提出的复杂数据的方法,称为体系结构。第天部署介绍今天,我们将探讨部署我们的应用所涉及的不同部分,以便外界可以使用我们的应用。 本文转载自:众成翻译译者:iOSDevLog链接:http://www.zcfy.cc/article/3758原文:https://www.fullstackreact.com/3...
摘要:但是使用标记将告诉浏览器处理路由就像服务器端路由一样。组件需要一个称为的属性指向要渲染的客户端路由。发生这种情况的原因是响应路由器将渲染与路径匹配的所有内容除非另有指定。属性预计将是一个函数将在对象连同和路由配置时调用。 本文转载自:众成翻译译者:iOSDevLog链接:http://www.zcfy.cc/article/3815原文:https://www.fullstackrea...
摘要:我们将讨论三种不同的软件测试范例单元测试功能测试和集成测试。在中单元测试通常不需要浏览器可以快速运行不需要写入断言本身通常是简单而简洁的。集成测试最后我们将研究的最后一种测试是集成测试。 本文转载自:众成翻译译者:iOSDevLog链接:http://www.zcfy.cc/article/3809原文:https://www.fullstackreact.com/30-days-of...
摘要:去营救有一种方法我们把我们的归约器分成多个归约器每个都只负责状态树的叶子。此外我们还学习了如何扩展以使用多个归约器和动作以及多个连接的组件。 本文转载自:众成翻译译者:iOSDevLog链接:http://www.zcfy.cc/article/3825原文:https://www.fullstackreact.com/30-days-of-react/day-20/ 使用Redux,...
摘要:在我们的应用中添加太多的复杂度来加载外部数据之前今天我们将快速了解如何在应用中重复组件元素。出于性能原因使用虚拟尝试限制在重新视图时需要更新的元素的数量。 本文转载自:众成翻译译者:iOSDevLog链接:http://www.zcfy.cc/article/3826原文:https://www.fullstackreact.com/30-days-of-react/day-13/ 今...
阅读 3432·2021-09-30 09:59
阅读 2174·2021-09-13 10:34
阅读 560·2019-08-30 12:58
阅读 1485·2019-08-29 18:42
阅读 2164·2019-08-26 13:44
阅读 2905·2019-08-23 18:12
阅读 3304·2019-08-23 15:10
阅读 1605·2019-08-23 14:37