import React, { useCallback, useState, memo } from 'react';import ReactDOM from 'react-dom';var SubFunctionComponent = memo((props) => { console.log('SubFunctionComponent render'); return ( <div> <h1>我是函数组件,数据从函数组件传过来,值是 {props.count}</h1> <button onClick={props.onClick}>function +1</button> </div> )})class SubClassComponent extends React.PureComponent { render() { console.log('SubClassComponent render'); return ( <div> <h1>我是类组件,数据从函数组件传过来,值是 {this.props.count} </h1> <button onClick={this.props.onClick}>class +1</button> </div> ) }}function AppFunction() { const [count, setCount] = useState(0); console.log('App组件 render'); const [inputVal, setInputVal] = useState(0); // 函数组件要使用 useCallBack 返回一个带缓存的回调 、 相当于 class 组件的 classField const handleClick = useCallback(() => setCount(count + 1), [count]); return ( <div className="App"> <SubClassComponent count={count} onClick={handleClick} /> <SubFunctionComponent count={count} onClick={handleClick} /> <input value={inputVal} type="number" onChange={(e) => setInputVal(parseInt(e.target.value) || 0)} /> </div> );}class AppClass extends React.Component { state = { count: 0, inputVal: 0 } // 使用 class field 方式来解决 handleClick = () => { const { count } = this.state; this.setState({ count: count + 1 }) } render() { console.log('主组件 render'); const { count, inputVal } = this.state; return ( <div className="App"> <SubClassComponent count={count} onClick={this.handleClick} /> <input value={inputVal} type="number" onChange={(e) => this.setState({ inputVal: parseInt(e.target.value) || 0 })} /> </div> ); }}ReactDOM.render( (<><AppFunction /><AppClass /></>), document.getElementById('root'));