美文网首页
React Hook 新特性的初体验

React Hook 新特性的初体验

作者: 罗彬727 | 来源:发表于2019-03-19 16:18 被阅读0次

    React 提供 Hook Api

    • useState

    • 类型: string | number | boolean | Array | Object
    • 描述: useState是一个函数,代表是组件里的一份状态,一个组件可以初始化多份状态。具体用法如下,必须要初始化完之后再用,不用通过改变顺序
    import React, {useState} from 'react';
    
    export default (props)=>{
        // 返回一个数组,
        let [count, setCount] = useState(0);
        let [list, setList] = useState([
            {title: '华泰'}
        ]);
        let [count, setCount] = useState({
            title: '华泰'
        });
        return(
            <div>{count}</div>
            <button onClick={()=> setCount(count+1)}>改变值</button>
        )
    }
    
    • useEffect(fn, []) 异步执行

    -# useLayoutEffect(fn,[]) 同步执行

    • 描述: useEffect是一个函数,它类似于class 组件的componentDidMount(),componentDidUpdate(), componentWillUnmount(),生命周期, 如需在对应的生命周期函数中做什么操作可以在此hook中操作。不会阻塞视图渲染,异步执行。
    import React, {useState, useEffect} from 'react';
    
    export default (props)=>{
        let [count, setCount] = useState(0);
    
        
        
        /*  
            1.如不传第二个参数,每次组件渲染都会执行。
            2.如传对应的变量数据,变量更新之后就会调用。
            3.如传空数组, 类似componentDidMount
        */
        useEffect(()=>{},[count]) 
    
        useEffect(()=>{
            // .... ...
            // 最后可以返回一个函数,代表下次组件渲染更新, 可以在里面清楚定时器,解绑事件等操作
            return ()=>{
                
            }
        },[]) 
    
        return(
            <div>{count}</div>
            <button onClick={()=> setCount(count+1)}>改变值</button>
        )
    }
    
    • React.Memo(fn)

    • 描述: 这个并不算一个hook, 它是用来优化组件渲染的,只会对比porps, 我们知道React组件父组件渲染更新,子组件也会同时渲染,如子组件接收的props 并未更改,子组件其实可以不用更新的。
    import React from 'react'
    
    export default React.Memo((props)=>{
        return(
            <div>
                <p>{props.count}</p>
                <p>我是一个只接收porps 的视图组件</p>
            </div>
        )
    })
    
    • useMemo(fn, [])

    • 描述: 用法更useEffect类似, 这个hook类似 shouldComponentUpdate 生命周期,优化组件是否渲染,
      同步执行。
    import React, {useState} from 'react';
    
    export default (props)=>{
       
        let [count, setCount] = useState(0);
        let [list, setList] = useState([
            {title: '华泰'}
        ]);
    
        let Childs = useMemo(()=><Child vlaue={list} / >, [list])
      
        return(
            <div>
                <div>{count}</div>
                {Childs}
                <button onClick={()=> setCount(count+1)}>改变值</button>
            </div>
        )
    }
    

    -# userContext(Context)

    //  App.js 
    import React, {useState, createContext} from 'react'
    import Counter from './component/Counter'
    
    
    let params = {name: "阿里巴巴",age: 10}
    export const CountCtx = createContext(params)
    export default (props)=>{
        let [obj, setAge] = useState(params)
        let handleChange = ()=>{
            setAge({
               ...obj,
               age: obj.age+2
            })
        }
        return(
            <CountCtx.Provider value={obj}>
                <Counter/>
                <button onClick={ handleChange }>改变数字{obj.age}</button>
            </CountCtx.Provider >
        )
    }
    
    // Counter.js
    
    import React, { useContext } from "react"
    import { CountCtx } from "../App"
    
    function Counter() {
        const params = useContext(CountCtx)
        console.log(params)
        return (
            <div>{params.name} is {params.age}</div>
        )
    }
    
    export default Counter
    
    // Child.js
    import React, {useContext} from 'react'
    import { CountCtx } from "../App"
    
    export default function (props) {
        let params = useContext(CountCtx)
        return(
            <div>
                 <div>{params.name} is {params.age}</div>
                <p>我是Child组件</p>
            </div>
        )
    
    
    • userRef() 获取节点对象。

    
    import React, {useState, useRef , useEffect} from 'react'
    
    export default (props)=>{
        let [count, setCount] = useState(0);
        // 返回一个对象
        let node = useRef()
        
        useEffect(()=>{
            console.log(node.current)
        },[count])
    
        return(
            <button ref={node} id="btn" onClick={ ()=> setCount(count+1) }>{count}</button>
        )
    }
    
    

    相关文章

      网友评论

          本文标题:React Hook 新特性的初体验

          本文链接:https://www.haomeiwen.com/subject/rghnmqtx.html