首页 > 其他分享 >React hooks

React hooks

时间:2022-08-23 14:45:37浏览次数:45  
标签:count const hooks setCount React state useState return

React hooks

最近闲来无事,Vue3的语法写的有点疲了,想起来以前还用React框架搭建过项目,回来拉取了一个React框架准备再复习一下React,感叹当年学习React的艰辛过程啊,记录一下React的hooks吧。以下几个是开发过程中可能常用的hooks,后续开发遇到新的会继续补充

useState

const [count,setCount] = useState(0)

返回一个state以及更新state的函数。
在初始渲染期间,返回的状态和传入的值是相同的
setCount则是用来更新这个count。它接收一个新的count值并将组件的一次重新渲染加入到队列中

数据更新后后续渲染的该值始终是更新后最新的值

示例
import { useState } from "react";

function Home() {
    const [count, setCount] = useState(0);
    return (
        <div>
            <div>这是useState渲染的{count}</div>
            <button onClick={() => setCount(count + 1)}>count+1</button>
        </div>
    );
}

export default Home;

useEffect

接收一个包含命令式、并且有空能有副作用的函数代码

  • 处理副作用

    在函数组件主体内,改变DOM、添加订阅、设置定时器、记录日志以及包含其他副作用的操作都是不被允许的,因为这可能会产生莫名奇妙的Bug。

    使用useEffect完成副作用操作,赋值给useEffect的函数会在组件渲染到屏幕后执行(这个我熟啊!这他妈不是Mounted生命周期?!)

    默认情况下这个函数在渲染结束后执行,同是也可以让它在某些值改变的时候执行(这个又很类似于watch)

  • 清除effect

    通常组件卸载的时候要清除effect创建的如订阅器、计时器等资源,这个时候往往需要一个函数来清除
    可以在useEffect函数返回一个清除函数。

    示例
    function Home() {
      const [count, setCount] = useState(0);
      useEffect(() => {
          console.log("组件渲染完成后打印", count + 1);
          /**清除副作用 */
          return count > 10 ? setCount(1) : setCount(count);
      });
      return (
          <div>
              <div>这是useState渲染的{count}</div>
              <button onClick={() => setCount(count + 1)}>count +1</button>
          </div>
      );
    }
    

    useContext

    const value = useContext(MyContext)
    

接收一个context对象(React.createContext的返回值)并返回该context的当前值。当前的context值由上层组件中距离当前组件最近的<MyContext.Provider>的value prop决定

当组件上层最近的<MyContext.Provider>更新时,hooks就会触发重渲染,并使用最新传递给 MyContext provider 的 context value 值。

示例
import React, { useContext, useEffect, useState } from "react";

const background = {
   pink: { color: "pink" },
   orange: { color: "orange" },
};

const bgcContext = React.createContext(background.orange);

function Home() {
   const [count, setCount] = useState(0);
   useEffect(() => {
       console.log("组件渲染完成后打印", count + 1);
       /**清除副作用 */
       return count > 10 ? setCount(1) : setCount(count);
   });
   return (
       <div>
           <div>这是useState渲染的{count}</div>
           <button onClick={() => setCount(count + 1)}>count +1</button>
           <bgcContext.Provider value={background.pink}>
               <ButtonWrap></ButtonWrap>
           </bgcContext.Provider>
       </div>
   );
}

function ButtonWrap() {
   return (
       <div>
           <MyButton></MyButton>
       </div>
   );
}

function MyButton() {
   const bgcGround = useContext(bgcContext);
   return (
       <button style={{ background: bgcGround.color }}>
           最深层的button按钮捏
       </button>
   );
}

export default Home;

useReducer

useState的替代方案,搭配dispatch方法,当状态有多种选择时,可以考虑使用,或者有多个状态时,可以使用dispatch进行统一的管理。

const [state,dispatch] = useReducer(reducer,initialArg,init)

废话少说,直接上代码!

const initState = { title: "默认title", count: 0 };
const reducer = (state, action) => {
   switch (action.type) {
       case "cao":
           return {
               //注意这边一定要拓展运算符处理
               ...state,
               title: "卧槽",
           };
       case "woqu":
           return { ...state, title: "我去" };
       case "count":
           return { ...state, count: state.count + 1 };
   }
};
function Titler() {
   const [state, dispatch] = useReducer(reducer, initState);
   return (
       <div>
           <button onClick={() => dispatch({ type: "cao" })}>我是一个标题按钮</button>
           <button onClick={() => dispatch({ type: "woqu" })}>我是另一个标题按钮</button>
           <button onClick={() => dispatch({ type: "count" })}>+1</button>
           <div>{state.title}</div>
           <div>{state.count}</div>
       </div>
   );
}

标签:count,const,hooks,setCount,React,state,useState,return
From: https://www.cnblogs.com/JsonPig/p/16616110.html

相关文章

  • 利用webhooks在企业微信中启用群机器人发送消息
    以企业微信PC端为例,利用webhooks在企业微信中启用群机器人接收、发送消息。1.添加机器人并获取webhooks地址获得webhook地址如:https://qyapi.weixin.qq.com/cgi-bin/w......
  • react-router-dom v6 路由参数
    1.通过state传参(HashRouter会丢失,BrowserRouter不会丢失)传参页面import{useNavigate}from"react-router-dom";constnavigate=useNavigate()navigate("/ho......
  • react三大核心之一props
    -html标签可以在标签上写自定义属性,那么react的组件,也可以像传属性一项,给组件传props;react组件接收到传入的属性后,会自动塞进实例的props属性中,通过this.props可以拿到外......
  • React报错之React Hook 'useEffect' is called in function
    正文从这开始~总览为了解决错误"ReactHook'useEffect'iscalledinfunctionthatisneitheraReactfunctioncomponentnoracustomReactHookfunction",可以将......
  • 实现最简单的 React DOM Diff 算法
    实现最简单的ReactDOMDiff算法本文写于2022年08月22日定义VNode与VNodeList类型首先我们定义一个简单的VNode类型。typeFlag="Placement"|"Delet......
  • 手写实现react hooks
    实现一些简单的reacthooks........在钩子函数中不要使用if判断,避免钩子错乱建立数组映射,建立多组钩子初始化数组和索引,全局使用lethookIndex=0lethookState=[......
  • react面试题
    react事件机制在得到dom树之后,react会处理属性上是否有事件,react不会把事件绑定到真正的节点上,而是把所有的事件绑定在document(最外层节点)上,部分事件除外,如audio、video的......
  • React 源码-React 事件全解
    事件系统reactv17事件绑定事件绑定在函数setInitialDOMPropertiessetInitialDOMProperties将在complete阶段执行functionsetInitialDOMProperties(tag:st......
  • vscode中react标签自动补全
    在vscode中编写react时,发现标签没有自动补全,写起来不太灵活,查资料发现:默认在js文件中JSX语法无法自动补全,解决方法如下:文件=》首选项=》设置搜索"emmet.includeLanguages"......
  • react组件三大核心之一state
    -<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="wi......