import React, { useState } from 'react';
import { PageContainer } from '@ant-design/pro-layout';
import { Card, Alert, Typography } from 'antd';
import { useIntl, FormattedMessage } from 'umi';
import styles from './Welcome.less';
// 父组件 export
default (): React.ReactNode => { const intl = useIntl(); const [n, setN] = useState(0); const [m, setM] = useState([{ a: 1, b: 2 }]); const add = () => { setN(i => i + 1); }; const addChild = () => { setM([{ a: 2, b: 2 }]); }; // onClickChild没传给子组件时子组件只更新传的props值更新子组件,当加了这个函数后memo无作用依旧没有优化性能的作用 // 当点击n时,就会重新执行App代码还是影响子组件重复渲染, // onClickChild空函数的地址会发生改变, // 所以说此时还是会执行Child的 // const onClickChild=()=>{ }; // usememo解决因函数更新而渲染自己的问题,就可以使用useMemo,使用它将函数重新封装 //第一个参数是函数,第二个参数是依赖,只有依赖变化时才会重新计算函数 ////使用useMemo重新写监听函数,当m变化时才会执行此代码 const onClickChild = React.useMemo(() => { return () => { console.log(m) } }, [m]) //等价于 // const onClickChild=useCallback(()=>{ // console.log(m) // },[m]) return ( <PageContainer> <div> <div> n:{n} <button onClick={add}>n+1</button> <button onClick={addChild}>m+1</button> </div>
//应用子组件
{/* <Child data={m} /> */}
<Child2 data={m} onClick={onClickChild} /> <Home></Home> </div> </PageContainer> ); }; const Child = (props: any) => { console.log('child执行了') return ( <div> child; </div> ) } const Child2 = React.memo(Child) const Child2demo = React.memo(Child,(pre,curr)=>{ console.log(pre,curr); // 打印的curr{ // data: [ {a: 1, b: 2}] // data-inspector-column: "6" // data-inspector-line: "95" // data-inspector-relative-path: "src/pages/Welcome.tsx" // onClick: ƒ () // } return curr.data[0].a===2 //为true不重新渲染,为false就重新渲染子组件,意思当点击m变成2就不渲染了 }) class Home extends React.Component { constructor(props) { super(props); this.state = { isMobile: "isMobile", show: 123, // 如果不是 dva 2.0 请删除 }; this.adds = this.adds.bind(this); } componentDidMount() { this.setState({ isMobile: 'eeee' }); } adds() { this.setState({ show: 7777 }); }; render() { console.log('fuqin'); return ( <div > dddddddddddd <button onClick={this.adds}>n+1</button> <Homecomponent></Homecomponent> </div> ); } } class Homecomponent extends React.Component { constructor(props) { super(props); this.state = { isMobile: "isMobile", show: 123, // 如果不是 dva 2.0 请删除 }; } componentDidMount() { this.setState({ isMobile: 'isMobile' }); } render() { console.log(2222); return ( <div > ffffffff </div> ); } }z