30分钟学会React Hook, Memo, Lazy

我们来学习React 16.8里的新特性。

1. 自行配置好React的环境,推荐你使用Create React APP, 你也可以下载本文档Zip解压到本地直接运行. https://github.com/yurizhang/fed-study/blob/master/my-project.zip

cd my-project

yarn install

2. 在pages目录下新建test目录,我们使用这个目录来学习.在这里新建t1.js和t2.js

t1.js

/* eslint-disable no-console */
/* eslint-disable react/button-has-type */

// import PageHeaderWrapper from '@/components/PageHeaderWrapper';
import React, {lazy, useState, useEffect} from "react";


const T2 = lazy(()=> import("./t2"));


const PageHeaderWrapper=(prop)=>{
    console.log("子组件刷新...");
   return (
     <>
       <div>{prop.loading}</div>
       <div>{prop.content}</div>
     </>
    )
}

// React.memo()可接受2个参数,第一个参数为纯函数的组件,第二个参数用于对比props控制是否刷新,与shouldComponentUpdate()功能类似。

const Memo = React.memo(PageHeaderWrapper, (prevProps, nextProps) => {
         console.log(prevProps, nextProps);
         return  prevProps.loading === nextProps.loading
        }
    
);
const rand=()=>{
    // console.log("define rand");
    const a=parseInt(Math.random()*10, 10);
    if(a>=5){
        return 1
    }
    return 0
    
}
const test=()=>{
    const [count, setCount] = useState(1);
    console.log('test 组件:',count);
    useEffect(() => {
        console.log('test组件:useEffect test',count);
        document.title = `You clicked ${count} times`;
        console.log('hello:', document.querySelector("#hello").innerHTML);

        // 让我们传给useEffect的副作用函数 返回一个新的函数。这个新的函数将会在组件下一次重新渲染之后执行。
        return function cleanup() {
            console.log('useEffect hello:',  document.querySelector("#hello").innerHTML);
            console.log('test组件:useEffect return ',count);
        };
    }, []);  // 给useEffect传第二个参数。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数(第一个参数)。

    return (
      <>
        <Memo loading={count} content='test2' />
        <div >Hell world!{count}</div>
        
        <React.Suspense fallback="T2 loading...">          
          <T2 />          
        </React.Suspense>

        <div>
          <p>You clicked {count} times</p>
          <button onClick={() => setCount(rand)}>
                Click me
          </button>
        </div>
      </>
    );
}





export default test;

t2.js 这里使用了axios,你要先安装一下,当然你也可以在你的模板文件public/index.htm里

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

/* eslint-disable no-console */
/* eslint-disable react/button-has-type */

import React, {useState, useEffect} from "react";

const T2=(prop)=>{

   const [message, setMessage]=useState(()=>{

        return 'start...';
   });

    function temp(){
        axios.get('http://route.showapi.com/1764-1').then(response=> {
            console.log(response.data.showapi_res_error);
            setMessage(response.data.showapi_res_error);
        })
   }   
   useEffect( () => {
         temp()
      }
   );  // 给useEffect传第二个参数。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数(第一个参数)。
   return (
     <>
       <div>T2. message: {message}</div>   
     </>
    )
}

export default T2;