zoukankan      html  css  js  c++  java
  • 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 id="hello">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;
  • 相关阅读:
    8u111-jdk-alpine 字体缺少FontConfiguration的NullPointerException错误解决方案
    Mybatis插件原理
    Mybaits 分页
    @requestBody 和@RequestParam
    Mybaits 生产mapper
    powerDesigner 生成SQL时没有注释问题
    HashMap 的 put过程
    Java的锁
    Java1.8 JVM配置 GC日志输出
    Windows 安装两个MYSQL实例
  • 原文地址:https://www.cnblogs.com/yuri2016/p/10374357.html
Copyright © 2011-2022 走看看