上节课我们已经学习了如来完成一个todo
,并不是像我们所说的那样直接在页面上勾选了checkbox
就行了,而是要和state
来挂钩。那么这节课我们来讲一讲对props
的限制。
回顾
在开始这节课的内容之前我们来对上节课的内容来做一个简单的回顾
checkbox
不能通过event.target.value
拿勾选状态,应该用event.target.checked
state
在哪,修改state
的方法就在哪- 事件绑定一定得是一个函数
以上便是我们上节课的主要需要注意的要点,接下来,我们来进行这节课的内容。
为什么要限制
我们来看一下我们的代码
export default class App extends Component { state = { todos: [] }; add = dataObj => {...}; update = (id, done) => {...} render() { const { todos } = this.state; return ( ... <List todos={todos} update={this.update} /> ... ) } }
我们来看一个问题,我们是不是给List
组件传东西了?这个传递方式是什么?是不是props
?但是我们有给这个props
做类型以及必要性的限制吗?没有吧,如果别人要用我们的组件,不知道要传的话是不是就会很麻烦?所以说我们来做一下限制。
安装
那么我们限制props
是不是要借助我们的prop-types
?但是脚手架并没有给我集成prop-types
所以说我们要自己安装一下。那么打开命令行,执行npm install prop-types
就可以了。但是一定要记得在我们项目的目录下执行才可以。否则的话就安装到别的地方去了。
限制
那么我们给List
组件的props
来加一点限制吧:
import React, { Component } from 'react' import PropTypes from 'prop-types'; ... export default class List extends Component { static propTypes = { todos:PropTypes.array.isRequired, update:PropTypes.func.isRequired }; render() {...} }
我们来看一下代码,我们是不是给List
组件传了两个东西?一个是todos
是一个数组,而且必传,另一个是一个函数而且也必传。
那么我们加了类型和必要性的限制,那么我们来看一下效果如果我没有传update
。
这就出了错误警告说我们标记了update
是一个必须项,但是现在我们得到的值却是undefined
。
如果我们todos
传的不是数组,而是一个对象的话,那么会怎么样?我们来想一想,我们是不是在List
组件中用map
方法加工了todos
?那么对象有map
方法吗?是不是会报错?我们再看一下效果:
首先,是不是提醒我们todos
是一个对象,但是我们要求的是数组。然后后面是关于对象使用map
方法的一个报错。
以上便是对props
的限制
总结
prop-types
需要手动安装prop-types
不是必要的,但是加了可以更加规范,方便维护
Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.
Link of this article:https://work.lynchow.com/article/todolist_limit_props/