react hookHooksreact

react中hooks使用详解

2021-08-26  本文已影响0人  瓯海

useState

const [ count ,setCount] = useState(parameter)

useEffect

useEffect(() => {
    console.log('开始订阅')
    return () => {
      console.log('取消订阅')
    }
  }, [count])

useContext

在组件中使用共享的Context有两种方式

Context Hook允许我们通过Hook来直接获取某个Context的值

 const maincontext = useContext(Maincontext)  // 直接获取传入的value值 
  //简化context获取值得操作,直接通过usecontext就可以获取到传入的value值
  //但是第一步操作仍然不能少
  const usecontext = useContext(Usecontext)
  console.log(maincontext, usecontext)

useReducer

import React, { useState, useReducer } from 'react'

function reducer(state, action) {

  switch (action.type) {
    case "add":
      return { ...state, count: state.count + 1 };
    case "sub":
      return { ...state, count: state.count - 1 }
    default:
      return state
  }
}
export default function Home() {
  // const [count, setCount] = useState(0)
  const [state, dispatch] = useReducer(reducer, { count: 0 })  //拆分usestate
  //将改变state状态统一进行管理
  return (
    <div>
      <h2>当前计数:{state.count}</h2>
      <button onClick={e => dispatch({ type: "add" })}>+1</button>
      <button onClick={e => dispatch({ type: "sub" })}>+1</button>
    </div>
  )
}

useCallback 和 useMemo

 const sub = useCallback(     ///子组件在没有数据改变情况下不会重新渲染
    () => {
      console.log("sub被执行")
      setCount(count - 1)
    }, [count],
  )
//返回的是对象
  const info = useMemo(() => {
    return { name: "jack", age: 18 };
  }, []);

useRef

常用的ref是两种用法

import React, { useRef, useState, useEffect } from 'react'

export default function UseRefDemo1() {
  const divRef = useRef()
  const iptRef = useRef()
  const [count, setCount] = useState(0)
  const countRef = useRef(count)  //只能保持初始值,
  useEffect(() => {            //通过useEffect可以保存上一次的值
    countRef.current = count
  }, [count])
  function changeBtn() {
    divRef.current.innerHTML = "world"
    iptRef.current.focus()
  }
  return (
    <div>
      <div ref={divRef}>hello</div>
      <input ref={iptRef} type="" name="" id="" />
      <button onClick={e => changeBtn()}>点击</button>
      <h2  >CountRef:{countRef.current}</h2>
      <h2>count: {count}</h2>
      <button onClick={e => setCount(count + 1)}>+1</button>
    </div>
  )
}

useImperativeHandle

理解useImperativeHandle的用法先来看一下ref和forwardRef结合使用

import React, { forwardRef, useRef, useImperativeHandle } from 'react'
//父组件通过ref建立联系,子组件通过forwardRef接收ref
const Btn = forwardRef((props, ref) => {
  const forwardRef = useRef()
  //下面需要利用子组件的ref
  return <input ref={forwardRef} type="text" />
})
export default function RefDemo() {
  const btnRef = useRef()
  return (
    <div>
      <Btn ref={btnRef} ></Btn>
      <button onClick={e => btnRef.current.focus()}>点击</button>
    </div>
  )
}
import React, { forwardRef, useRef, useImperativeHandle } from 'react'
//父组件通过ref建立联系,子组件通过forwardRef接收ref
//useImperativeHandle 作用只暴露父组件需要的子组件方法和属性
const Btn = forwardRef((props, ref) => {
  const forwardRef = useRef()
  useImperativeHandle(ref, () => ({
    focus: () => {    //父组件只需要focus方法,只暴露子组件focus方法
      forwardRef.current.focus();
    }
  }), [forwardRef.current])  //子组件的ref发生更新时重新渲染
  //下面需要利用子组件的ref
  return <input ref={forwardRef} type="text" />
})
export default function RefDemo() {
  const btnRef = useRef()
  return (
    <div>
      <Btn ref={btnRef} ></Btn>
      <button onClick={e => btnRef.current.focus()}>点击</button>
    </div>
  )
}

-这里子组件就只暴露了focus方法,其他的方法是没有暴露的,让代码的逻辑性更加严谨

useLayoutEffect

上一篇 下一篇

猜你喜欢

热点阅读