hook-useState

2020-06-22  本文已影响0人  skoll

示例代码

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

上一篇 下一篇

猜你喜欢

热点阅读