我们之前学习的一直是组件实例上的props,是可以通过this访问组件实例的,比如props,可以通过this.props访问,但是在函数式组件中,不存在组件实例。
function Person() {
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age + 1}</li>
</ul>
);
}
这是一个比较简单的函数式组件,和上文一样,想展示姓名,性别,年龄信息。
class Person extends React.Component {
static propTypes = {
name: PropTypes.string.isRequired,
sex: PropTypes.string,
age: PropTypes.number,
speak: PropTypes.func,
};
// 设置默认属性
static defaultProps = {
sex: "女",
age: 18,
};
state = {};
render() {
const { name, sex, age } = this.props;
// prop是只读的
// this.props.name = "jack";
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
<li>年龄:{age + 1}</li>
</ul>
);
}
}
类组件种有一行关键代码
const { name, sex, age } = this.props;
所有的props数据都是从this.props
,也就是组件实例对象中取出来的,而在函数式组件中this是undefined。
正确的获取数据方式是从参数中获取
<script type="text/babel">
function Person(props) {
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
</ul>
);
}
ReactDOM.render(<Person name="tom" sex="男" />, document.getElementById("test"));
</script>
完整代码,包括限制
<script type="text/babel">
function Person(props) {
const { name, sex } = props;
return (
<ul>
<li>姓名:{name}</li>
<li>性别:{sex}</li>
</ul>
);
}
Person.propTypes = {
name: PropTypes.string.isRequired,
sex: PropTypes.string,
age: PropTypes.number,
speak: PropTypes.func,
};
Person.defaultProps = {
sex: "女",
age: 18,
};
ReactDOM.render(
<Person name="tom" sex="男" />,
document.getElementById("test")
);
</script>