美文网首页
hook-useState

hook-useState

作者: skoll | 来源:发表于2020-06-22 21:18 被阅读0次

    示例代码

    import React ,{useState} from "react"
    
    function Example(props){
        const [count,setCount]=useState(0)
        const [friut,setFriut]=useState("apple")
        const [name,setName]=useState(props.name)
        // 当你需要在组件里面添加state,就可以使用hook了
        // 1. 这里只是执行了初始化的state,如果props发生变化怎么操作。。
        
        let handelSetCount=function(){
            setCount(count+1)
        }
    
        //click之类的事件就可以这样写。 
        return (
            <>
                <p>You click {count} times</p>
                <button onClick={handelSetCount}>
                    click me
                </button>
                <button onClick={()=>setFriut("banana")}>
                    click me{friut}
                </button>
                <button onClick={()=>setName("nb")}>
                    click me{name}-{props.name}
                </button>
    
            </>
        )
    }
    export default Example
    

    注意

    1 .setState 和上次相同的值,是不会触发组件渲染的
    2 .useState 只会在初始化代码的时候执行一次,并不是每次渲染组件都会执行
    3 .多个useState的情况

    1 .设置多个useState的时候,每个添加的时候都是添加到一个数组里面
    2 .删除和添加一个新的useState都是相当于对一个数组操作
    3 .如果在运行时添加,减少,修改,if操作的话,那些顺序就会乱,所以是不能使用if的
    

    4 .useState不会把新的state和旧的state进行合并,而是直接替换
    5 .每次渲染都是独立的闭包

    1 .每一次渲染都有自己的props和state
    2 .每一次渲染都有自己的事件处理函数
    3 .当点击更新状态的时候,函数组件都会重新被调用,那么每次渲染都是独立的,取到的值不会受后面操作的影响
    function Counter2(){
      let [number,setNumber] = useState(0);
      function alertNumber(){
        setTimeout(()=>{
          // alert 只能获取到点击按钮时的那个状态
          alert(number);
        },3000);
      }
      return (
          <>
              <p>{number}</p>
              <button onClick={()=>setNumber(number+1)}>+</button>
              <button onClick={alertNumber}>alertNumber</button>
          </>
      )
    }
    
    //这个例子也可以用在这里
    

    6 .函数式更新:如果新的state需要通过使用之前的state计算出,那么可以讲回调函数当作参数传递给setState,该回调函数接受之前的state,并返回一个更新后的值
    7 .惰性初始化state

    1 .initState 参数只会在组件初始化的渲染中起作用,后续渲染时会被忽略
    2 .如果初始state需要通过复杂的计算获取,那么可以传入一个函数,在计算中返回初始值,这个函数只会在初始渲染的时候被调用
    function Example(props){
        function initState(){
            return props.count
        }
        // 这个函数只会在初始渲染的时候执行一次,后续重新渲染组件时,该函数就不会再被调用
    
        let [count,setCount]=useState(initState)
        return (
            <>
               <p>{count}</p>
               <button onClick={()=>setCount(count+10)}>+</button>
               <button onClick={()=>setCount(10)}>setCounter</button>
            </>
        )
    }
    
    export default Example
    

    性能优化

    1 .Hook内部使用Object.is来比较新旧state是否相等
    2 .和组件中的setState方法不同,如果你修改状态的时候,传的值没有发生变化,是不会重新渲染的
    3 .setState不会自动合并更新对象,,只能自己写函数式的setState来实现,他走的是直接替换的操作

    减少渲染次数

    1 .默认情况:只要父组件状态变化了,子组件也会重新渲染
    2 .一般优化:类组件,使用pureComponent 函数组件:使用react.memo,将函数组件传递给memo之后,就会返回一个新的组件,新组件的功能,如果接受的属性不变,就不会重新渲染函数
    3 .在setState里面

    1 .使用useState,每次更新都是独立的,也就是说每次更新都会生成一个新的值,即使使用了react.memo,也还是会重新渲染
    2 .useMemo:组件内部进行优化,创建函数和依赖项作为参数传入useMemo,他仅会在某个依赖项改变的时候才重新计算memoized值,有助于避免每次渲染都进行高开销的计算
    3 .useCallback:接收一个内联回调函数参数和一个依赖项数组,子组件依赖父组件的状态,useCallback会返回改回调函数的memoized版本,改回调函数仅会在某个依赖项改变时才会更新
    

    设置state的两种方式

    1 .setCount(c=>c+1) 函数传参的方式,c 此时是之前的count,返回的值替代count
    2 .setCount(100) 直接传入一个新值 ,代替count

    相关文章

      网友评论

          本文标题:hook-useState

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