1. import React, { useCallback, useState, memo } from 'react';
    2. import ReactDOM from 'react-dom';
    3. var SubFunctionComponent = memo((props) => {
    4. console.log('SubFunctionComponent render');
    5. return (
    6. <div>
    7. <h1>我是函数组件,数据从函数组件传过来,值是 {props.count}</h1>
    8. <button onClick={props.onClick}>function +1</button>
    9. </div>
    10. )
    11. })
    12. class SubClassComponent extends React.PureComponent {
    13. render() {
    14. console.log('SubClassComponent render');
    15. return (
    16. <div>
    17. <h1>我是类组件,数据从函数组件传过来,值是 {this.props.count} </h1>
    18. <button onClick={this.props.onClick}>class +1</button>
    19. </div>
    20. )
    21. }
    22. }
    23. function AppFunction() {
    24. const [count, setCount] = useState(0);
    25. console.log('App组件 render');
    26. const [inputVal, setInputVal] = useState(0);
    27. // 函数组件要使用 useCallBack 返回一个带缓存的回调 、 相当于 class 组件的 classField
    28. const handleClick = useCallback(() => setCount(count + 1), [count]);
    29. return (
    30. <div className="App">
    31. <SubClassComponent count={count} onClick={handleClick} />
    32. <SubFunctionComponent count={count} onClick={handleClick} />
    33. <input
    34. value={inputVal}
    35. type="number"
    36. onChange={(e) => setInputVal(parseInt(e.target.value) || 0)} />
    37. </div>
    38. );
    39. }
    40. class AppClass extends React.Component {
    41. state = {
    42. count: 0,
    43. inputVal: 0
    44. }
    45. // 使用 class field 方式来解决
    46. handleClick = () => {
    47. const { count } = this.state;
    48. this.setState({ count: count + 1 })
    49. }
    50. render() {
    51. console.log('主组件 render');
    52. const { count, inputVal } = this.state;
    53. return (
    54. <div className="App">
    55. <SubClassComponent count={count} onClick={this.handleClick} />
    56. <input
    57. value={inputVal}
    58. type="number"
    59. onChange={(e) => this.setState({ inputVal: parseInt(e.target.value) || 0 })} />
    60. </div>
    61. );
    62. }
    63. }
    64. ReactDOM.render(
    65. (<><AppFunction /><AppClass /></>),
    66. document.getElementById('root')
    67. );