当前位置: 首页 > news >正文

reatc的几个基础的hooks

Hook 是什么?Hook 是一个特殊的函数,它可以让你“钩入” React 的特性。以前写react使用的是class无状态组件,现在使用hooks,其实就是在函数作用域中进行操作。所以又叫做函数式组件。

一,useState

作用:定义该函数组件的变量

参数:初始 state

返回:当前 state 以及更新 state 的函数(它的参数则是新的state值)

示例:我们不能在代码中直接修改count的值,而是应该把新的值传入setCount函数,从而返回新的count值。

  import React, { useState } from 'react';

  function Example() {
    const [count, setCount] = useState(0);//数组解构
    return (
      <div>
        <p>You clicked {count} times</p>
        <button onClick={() => setCount(count + 1)}>
         Click me
        </button>
      </div>
    );
  }

二,useEffect

作用:你可以把 useEffect Hook 看做 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个函数的组合。在组件的生命周期执行函数。

1,无需清除时

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

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

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

组件的初次渲染完成会执行一次useEffect中的函数。

而后每次update都会重新执行一次useEffect中的函数。

2,需要清除时

每个 effect 都可以返回一个清除函数。当组件卸载时,如果有return,则会执行这里的代码。

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

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);
  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);//这里执行监听
    return function cleanup() {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);//组件卸载时,执行返回的函数,不再监听
    };
  });
  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}

3,优化为没变化时不执行effect

常规使用时每次组件渲染和更新都执行effect,有时候effect依赖的内容没变化,就不需要执行,这时候,可以给effect传入第二个参数:一个数组。如果数组中有多个值,则会比较这几个值,有一个不相等则执行effect。这个数组叫依赖表,类似于vue中的computed,当依赖项发生了变化,就会执行其中的函数。

useEffect(() => {
  document.title = `You clicked ${count} times`;
}, [count]); // 仅在 count 更改时更新

三,useContext

如果想要组件之间共享状态,可以使用useContext
React 的 Context API 是一种在应用程序中深入传递数据的方法,而无需手动一个一个在多个父子孙之间传递 prop

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

也就是说父组件必须先声明 Provier 组件,并声明 value属性。

import React,{useContext}  from 'react';
import './App.css';
//创建context
const numberContext = React.createContext();
//它返回一个具有两个值的对象
//{Provider , Consumer}
function App(){
  //使用Provider为所有子孙提供value值
  return (
    <numberContext.Provider value={520}>
        <div>
        <ShowAn />
        </div>
    </numberContext.Provider>
  )
}

function ShowAn(){
  //使用Consumer从上下文获取value
//调用useContext,传入从React.createContext获取的上下文对象。
  const value = useContext(numberContext);//这里就可以直接取到父组件传进来的值了
  return(
    <div>
      the answer is {value}
    </div>

  )
}
export default App;

相关文章:

  • EN 14846建筑五金件锁和闩锁—CE认证
  • 一幅长文细学Vue目录
  • 运营业务指标--分类型探讨
  • 软考中活动图,关键路径、最早开始时间等
  • dotnet6 docker 部署
  • 【步骤详解】Docker一键部署微服务详细教程
  • LTC4056/TP4056国产替代DP4056锂电池充电保护芯片
  • VUE页面添加水印
  • 小米软开一面
  • 创建型模式-抽象工厂模式(三)
  • 美术作品登记版权如何收费?
  • 计算机毕业论文基于Python实现的仓库库存管理系统进销存储系统
  • 人工神经网络 人工智能,人工智能神经网络技术
  • 基于springboot的手办定制销售系统毕业设计源码031800
  • 《每日一题》NO.46:何为WAT/CP/FT?
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【RocksDB】TransactionDB源码分析
  • css布局,左右固定中间自适应实现
  • ECMAScript6(0):ES6简明参考手册
  • httpie使用详解
  • Java知识点总结(JavaIO-打印流)
  • js递归,无限分级树形折叠菜单
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP 7 修改了什么呢 -- 2
  • React16时代,该用什么姿势写 React ?
  • Redis 中的布隆过滤器
  • Webpack 4x 之路 ( 四 )
  • 从伪并行的 Python 多线程说起
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 数组的操作
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我与Jetbrains的这些年
  • 再次简单明了总结flex布局,一看就懂...
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • $.ajax()方法详解
  • (09)Hive——CTE 公共表达式
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转) Face-Resources
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core引入性能分析引导优化
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 事件模型教程(二)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [HTML]Web前端开发技术28(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [J2ME]url请求返回参数非法(java.lang.illegalArgument)