什么是函数组件

  1. props 传递数据
  2. props 传递函数
    1. 以属性方式传递数据和函数
  3. props 类型检查
  4. 函数组件无法代替 class组件
  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. // 对 Component的props属性进行类型检查
  4. Parent.propTypes = {
  5. onChange: PropTypes.func.isRequired,
  6. // 数组对象
  7. value: PropTypes.arrayOf(PropTypes.object).isRequired
  8. }
  9. function Parent(props) {
  10. const {value, onChange} = props
  11. return (
  12. <div>
  13. Parent
  14. </div>
  15. )
  16. }
  17. export default Parent

函数组件的特点

  • 纯函数,输入 props,输出 jsx
  • 没有 this,没有实例,没有生命周期函数,没有 state
  • memo优化,类似 PureComponent
  • useEffect优化生命周期

class组件

  1. class List extends React.Component {
  2. constructor(props) {
  3. super(props)
  4. }
  5. render() {
  6. const {data} = this.props
  7. return (
  8. <ul>
  9. <ListItem {...props}/>
  10. </ul>
  11. )
  12. }
  13. }
  14. function ListItem({data}) {
  15. return data.map(row => <li key={row.id}>{row.title}</li>)
  16. }

function组件

  1. function List(props) {
  2. return (
  3. <ul>
  4. <ListItem {...props}/>
  5. </ul>
  6. )
  7. }
  8. export default List
  9. function ListItem({data}) {
  10. return data.map(row => <li key={row.id}>{row.title}</li>)
  11. }

TableList函数组件

  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. import { Table, Popconfirm, Button } from 'antd'
  4. TodoList.propTypes = {
  5. onDelete: PropTypes.func.isRequired,
  6. tbody: PropTypes.array.isRequired,
  7. }
  8. function TodoList(props) {
  9. const { onDelete, tbody } = props
  10. const renderAction = (text, record) => {
  11. return (
  12. <Popconfirm title="Delete?" onConfirm={() => onDelete(record.id)}>
  13. <Button>删除</Button>
  14. </Popconfirm>
  15. )
  16. }
  17. const columns = [
  18. {
  19. title: 'Name',
  20. dataIndex: 'name',
  21. },
  22. {
  23. title: 'Actions',
  24. dataIndex: 'action',
  25. render: (text, record) => renderAction,
  26. }
  27. ]
  28. return (
  29. <Table
  30. rowKey={ record => record.id }
  31. dataSource={ tbody }
  32. columns={ columns }
  33. />
  34. )
  35. }
  36. export default TodoList