react-hooks

Hook的使用规则

只能在函数的最外层去使用,不要在循环中或者子函数中去调用

只能在react的函数组件中去调用,也可以在自定义的hooks中去调用

useState

useState 其实就是个状态逻辑函数,通过数组的解构方式去获取一个值和对应这个值的操作方法

const [xxx,setXxx] = useState('defaultValue')

并且第二个参数是个赋值函数,也可以去调用自定义函数去运行 

相对于class组件中的优点

  • 在状态管理中颗粒度更细
  • 代码相对与class而言也比较清晰 
  • 容易做状态分类
  • 采用平铺的写法

Props.children也可以采用这样的写法

const Parent = props => {

  const [count, setCount] = useState(0);

  return props.children(count, setCount);

};


const TestPage = () => {

  return (

      <Parent>

        {(count, setCount) => {

          return (

            <button onClick={() => {

                setCount(count + 1);

              }}

            >

              clickNum {count}

            </button>

          );

        }}

      </Parent>

  );

};

useEffect

useEffect 就是指明react在对dom进行更改后,需要运行的函数

因为hooks属于无状态的组件,所以也没有class组件生命周期一说

  • 也可用于做优化页面性能
  • 可以使用useEffect去模拟class的生命周期(简单理解来说)

useEffect第二个参数是所依赖的值(props传入的值),数组形式,可以写多个

它会判断props的传值和他的上次进行一次浅比较,如果发现有变化,才回去执行,无变化,则不执行。

useEffect(()=>{ 
 console.log('do something') 
},['depValue'])

模拟类的didMount 

useEffect(()=>{ console.log('do something') },[])

如需清除副作用,可以直接在回调函数中return出一个处理函数

useEffect(()=>{ 
 console.log('do something') 
  return ()=>{
   console.log('clear effect')
 }
})

副作用:指当前hooks在函数作用域以外所处理的事情

UseContext

无需使用组件嵌套的形式,就可以订阅react的上下文

换而言之 传统组建通信,数据流基本都是props向下派发的,但是context 可以直接无视子组件嵌套层级与底层的子组件直接通信  

典型例子就是redux 就是使用react提供的context的技术做的数据管理

使用UseContext的例子

const ctx = React.createContext();
const myContext = useContext(ctx);

const SubComponent = ()=>{
   const {count,setCount} = useContext(myContext);

   return <button
             onClick={()=>{
              setCount(coun+1)
               }}
              >
          {count}
        </button>
}

const App = ()=>{
  const [count,setCount] = useState(0);
  return <ctx.provider
            value={{
              count,
               setCount,
            }}
            >
       <div>
        <div>
          <subComponent />
        </div>
      </div>
     </ctx.provider>
}

useReducer

useReducer  自定义state 和redux类似

useReducer 返回一个state和dispatch方法,后者用于修改前者的值

useReducer 参数描述

 第一个参数 是处理函数 用于disptach后区分操作类型

 第二个参数 用于当前state的默认值   init初始值   (initialArg)

 第三个参数 作用与当前的state,相当于init (initialArg),是 一个函数需要将 init 函数作为 useReducer 的第三个参数传入,这样初始 state 将被设置为 init(initialArg)。

示例

const reducer = (state, action) => {
  switch (action.type) {
    case "acc": return { ...state, count: state.count + 1 };
    case "ded": return { ...state, count: state.count - 1 };
    case "save": save(123);
    default: return state;
  }

};

const save = state => state;

const TestPage = () => {

  const [state, dispatch] = useReducer(reducer,

    {

      count: 1,

      data: 

    },

    save

    //这个save方法可以单独抽离出来 进行逻辑判断 搭配useReducer的第三个参数使用,

  );

  return (

      <button onClick={() => {

          dispatch({

            type: "acc"

          });

        }}

      >
        {state.count}

      </button>
  );

};

useMemo

避免在每次渲染时都进行高开销的计算

缓存计算结果的值(写法类型useEffect)

如果props的依赖值没有发生变化  函数不会执行, 缓存上次计算的状态

传入 useMemo 的函数会在渲染期间执行。请不要在这个函数内部执行与渲染无关的操作,诸如副作用这类的操作属于useEffect 的适用范畴,而不是 useMemo。

如果没有提供依赖项数组,useMemo 在每次渲染时都会计算新的值。

示例

useMemo(()=>{

 console.log('do something')
 //复杂的逻辑计算

},[value])

useCallBack

useCallBack 缓存函数

第一个参数是回调函数

第二个是更新依赖项, 依赖项为空则直接缓存 ,反之依赖项发生变化 执行回调

传入子组件的的函数会被重新声明  使用useCallBack进行缓存

useMemo和useCallback的区别 

useMemo 计算结果是 return 回来的值, 主要用于 缓存计算结果的值 ,应用场景如: 需要 计算的状态

useCallback 计算结果是 函数, 主要用于 缓存函数,应用场景如: 需要缓存的函数,因为函数式组件每次任何一个 state 的变化 整个组件 都会被重新刷新,一些函数是没有必要被重新刷新的,此时就应该缓存起来,提高性能,和减少资源浪费。

useRef   

useRef会返回一个可变的ref对象  直接插入使用   ref.current值为当前dom

useImperativeHandle

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值

function FancyInput(props, ref) {

  const inputRef = useRef();

  useImperativeHandle(ref, () => ({

    focus: () => {

      inputRef.current.focus();

    }

  }));

  return <input ref={inputRef} ... />;

}

FancyInput = forwardRef(FancyInput);

  

React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中

useLayoutEffect

useLayoutEffect的执行时机是浏览器把内容真正渲染到界面之前和 componentDidMount 等价。相比于useEffect不会有闪烁的问题;

为什么会有闪烁的问题·

useEffect是dom渲染完毕后去异步执行的,如果在这个过程中在触发重新渲染,就会导致原本渲染的内容再被渲染一次,从而出现闪烁的现场。而useLayoutEffect相当于渲染之前同步进行的,等它这次操作执行完毕后在进行渲染,所以不会闪烁。

useDebugValue

useDebugValue 打印日志到react-dev-tools 第二个参数为可选为一个格式化参数,接受debug的值作为参数,并且返回一个格式化的值

原文地址:https://blog.csdn.net/csdn1050391437/article/details/120168784

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom