或许看到这个标题大家都懵了,哎呀,只顾这学类式组件,怎么都忘了还有一个函数式组件。那么今天,他来了。
回顾
按照惯例,我们都是要对上节课内容来做一个简单的回顾的。
但是上节课我们学了啥啊?上节课就一个要点,类组件能不写构造器就不写构造器。如果真的要写构造器,那么就要接收props
并且传给super
。就这么一点那么好,我们开始学习函数式组件如何使用props
。
函数式组件
我不知道大家还记不记得我们之前就说过,组件的三大核心属性其实是组件实例的三大核心属性。那么函数哪有实例?函数连实例都没有,我们怎么还能用组件三大属性之一的props
呢?
其实,函数式组件虽然没有实例,而且函数式组件在我们所说的组件三大核心属性中,state
和我们即将要学习的refs
这两大属性确实是不支持,但是,函数式组件是可以支持props
的
大家可能很好奇为啥呀?函数都没有实例为啥还能使用props
呢?虽然说函数没有实例,但是函数能接收参数啊,props
是不是外面传进去的啊?那我函数把props
当成参数用就是了。
我们来先看一个例子:
function Person() { return ( <ul> <li>姓名:{name}</li> <li>性别:{gender}</li> <li>年龄:{age + 1}</li> </ul> ); } ReactDOM.render(<Person name="jingxun" age={18} gender="男"/>, document.getElementById("test"));
我们先仿照之前类式组件中来写一下。但是大家是不是发现问题出现了?我们在类式组件里面写的时候解构了this.props
并且赋值给了name
,age
,gender
所以说类式组件里面我们可以使用这几个变量。但是我们的函数式组件没接到props
啊,我们也没有这几个变量可以用啊。那我们怎么办?
我们也说了函数是可以传参数的,而且和类式组件也很相似,我们在组件标签传入属性,react
都帮我收集好成为一个对象,那么我们是不是只要在函数设置一个参数来接收就行了啊?就好比我们类式组件的构造器方法一样,那么好,我们来修改一下代码:
function Person(props) { const { name, age, gender } = props; return ( <ul> <li>姓名:{name}</li> <li>性别:{gender}</li> <li>年龄:{age + 1}</li> </ul> ); } ReactDOM.render(<Person name="jingxun" age={18} gender="男"/>, document.getElementById("test"));
如果我们这样修改一下代码那是不是就可以了呢?我们看一下页面:
我们看,页面渲染成功了,而且控制台也没有报错。
或许大家现在心思就又开始活泛起来了,既然我们能通过传参方式来用props,
那么能不能通过这种方式来用state
啊?当然这是不可能的,除非用react
最新版本出的react hooks
才行。包括refs
在不引入react hooks
的前提下,函数式组件也是用不了的。但这都是后话了。我们在这就不在多说了。
可能大家又要问了,那我们函数式组件能不能对props
进行限制呢?当然可以。但有一点,函数里面有static
这个概念吗?这是没有的,所以说如果函数式组件想要限制props
就只能写在外面。也就是我们之前写的Person.propTypes
和Person.defaultProps
。只要加了这两个属性,那么我们就能对props
进行限制,那我们来看一下代码:
function Person(props) { const { name, age, gender } = props; return ( <ul> <li>姓名:{name}</li> <li>性别:{gender}</li> <li>年龄:{age + 1}</li> </ul> ); } Person.propTypes = { name: PropTypes.string.isRequired, gender: PropTypes.string, age: PropTypes.number } Person.defaultProps ={ age: 18, gender:"男" } ReactDOM.render(<Person name={123} />, document.getElementById("test"));
我们上面代码是限制了name
为字符串,而且必须,gender
为字符串,默认为男,age
为数字,默认为18。那我就来试一下功能,只传name
但是格式不对,看看上面效果
大家看一下,页面正常渲染了,提醒name
的格式不对。所以我们到此就完成了函数式组件使用props
。但是我还是建议用类式组件吧,这函数式组件实在是没有什么意思。当然如果后面学习了react hooks
的话,大家再把函数式组件捡起来也是可以的。
总结
- 函数式组件目前只能使用
props
- 函数式组件使用参数来接收
props
- 函数式组件可以限制
props
但是只能写在函数体外
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/func_props/