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

react:React Hook函数

使用规则

只能在组件中或者其他自定义的Hook函数中调用

只能在组件的顶层调用,不能嵌套在iffor、 其他函数中

基础Hook 函数

useState

useState是一个hook函数,它允许我们向组件中添加一个状态变量,从而控制影响组件的渲染结果

示例1

function App() {

  // 创建一个状态变量
  // count: 状态变量,setCount: 更新状态变量的函数
  const [count, setCount] = useState(0)

  return (
    <div>
      <p>当前数值是:{count}</p>
      <button onClick={() => setCount(count + 1)}>加一</button>
    </div>
  )
}

在这里插入图片描述

示例2

function App() {
  const [userName, setUserName] = useState("111");

  return (
    <div>
      <input
        type="text"
        value={userName}
        placeholder="请输入"
        onChange={(e) => setUserName(e.target.value)}
      />
      <div>当前输入值是:{userName}</div>
    </div>
  );
}

在这里插入图片描述

注意:

  • react中,状态被认为是只读的,直接修改状态不能引发视图的更新
  • 对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
function App() {
  const [form, setForm] = useState({
    age: 0
  })

  return (
    <div>
      <p>当前年龄是:{form.age}</p>
      <button onClick={() => setForm({
        ...form,
        age: form.age + 1
      })}>加一</button>
    </div>
  )
}

useRef

获取、操作DOM

function App() {
  // 使用 useRef生成ref对象,并绑定到dom上
  const inputRef = useRef(null);

  // 获取dom
  const getDom = () => {
    console.log(inputRef.current);
  };

  return (
    <div>
      <input type="text" ref={inputRef} placeholder="请输入" />
      <button onClick={getDom}>获取dom</button>
    </div>
  );
}

在这里插入图片描述

useEffect

useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求、更改DOM

function App() {
  const [content, setContent] = useState("");
  const [note, setNote] = useState("");
  useEffect(() => {
    // 获取每日英语
    function getEnglish() {
      fetch("https://api.oioweb.cn/api/common/OneDayEnglish")
        .then((res) => res.json())
        .then((data) => {
          console.log(data);
          setContent(data.result.content);
          setNote(data.result.note);
        });
    }

    getEnglish();
  }, []);
  return (
    <div>
      <div>英文:{content}</div>
      <div>翻译:{note}</div>
    </div>
  );
}

在这里插入图片描述

不同依赖项说明

  • 没有依赖项,组件初始渲染+组件更新时执行
  • 空数组依赖,只在初始渲染时执行一次
  • 添加特定依赖项,组件初始渲染+特性依赖项变化时执行

没有依赖项

function App() {
  const [content, setContent] = useState(0);
  useEffect(() => {
    console.log("副作用执行了");
  });
  return (
    <div>
      <button onClick={() => setContent(content + 1)}>{content}</button>
    </div>
  );
}

空数组依赖

function App() {
  const [content, setContent] = useState(0);
  useEffect(() => {
    console.log("副作用执行了");
  }, []);
  return (
    <div>
      <button onClick={() => setContent(content + 1)}>{content}</button>
    </div>
  );
}

特性依赖变化

function App() {
  const [content, setContent] = useState(0);
  useEffect(() => {
    console.log("副作用执行了");
  }, [content]);
  return (
    <div>
      <button onClick={() => setContent(content + 1)}>{content}</button>
    </div>
  );
}

清除副作用

useEffect中编写的由渲染本身引起的对接组件外部的操作, 社区也叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清除副作用。

useEffect(() => {
  console.log("副作用执行了");
  return () => {
    console.log("清除副作用");
  };
}, []);

清除副作用的函数最常见的执行时机是在组件卸载时自动执行。

function App() {
  const [show, setShow] = useState(true);
  return (
    <div>
      父组件
      <button onClick={() => setShow(false)}>卸载Son组件</button>
      {show && <Son />}
    </div>
  );
}
function Son() {
  const [currentDate, setCurrentDate] = useState("");

  useEffect(() => {
    const timer = setInterval(() => {
      const newDate = new Date().toLocaleTimeString();
      setCurrentDate(newDate);
      console.log("当前时间:", newDate);
    }, 1000);

    return () => {
      // 不清除副作用,即使组件不适用了,定时器还会执行
      clearInterval(timer);
    };
  }, []);

  return (
    <div>
      <div>子组件</div>
      <div>当前时间是:{currentDate}</div>
    </div>
  );
}

在这里插入图片描述

自定义Hook

自定义Hook是以use打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

function App() {

  const [state, toggle] = useToggle()

  return (
    <div>
      { state && <div>这是一个div</div> }
      <button onClick={toggle}>切换</button>
    </div>
  )
}

function useToggle(){
  // 可复用的逻辑代码
  const [state, setState] = useState(true)

  const toggle = () => {
    setState(!state)
  }

  // 那些状态和方法需要在其他组件中使用,则返回
  return [state, toggle]
}

在这里插入图片描述

通用思路

  • 声明一个以use大头的函数
  • 在函数体内封装可以复用的逻辑
  • 将组件中用的的状态或者回调函数return出去(对象或者数组形式)
  • 在那个组件中用到这个逻辑,就执行这个函数,结构出来状态和回调进行使用
function App() {

  const [content, note] = useOneDayEnglish();

  return (
    <div>
      <div>英文:{content}</div>
      <div>翻译:{note}</div>
    </div>
  );
}


function useOneDayEnglish() {
  const [content, setContent] = useState("");
  const [note, setNote] = useState("");
  useEffect(() => {
    // 获取每日英语
    function getEnglish() {
      fetch("https://api.oioweb.cn/api/common/OneDayEnglish")
        .then((res) => res.json())
        .then((data) => {
          console.log(data);
          setContent(data.result.content);
          setNote(data.result.note);
        });
    }

    getEnglish();
  }, []);

  return [content, note];
}

在这里插入图片描述


http://www.kler.cn/a/319515.html

相关文章:

  • 第74期 | GPTSecurity周报
  • STM32单片机WIFI语音识别智能衣柜除湿消毒照明
  • 鸿蒙进阶篇-属性动画-animateTo转场动画
  • 少儿学习Scratch编程的好处和坏处
  • 使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行
  • Springboot整合Prometheus+grafana实现系统监控
  • MySQL篇(存储引擎)(持续更新迭代)
  • 杂牌鼠标侧键设置
  • C++:AB5 点击消除
  • 基于大数据的电子产品需求数据分析系统的设计与实现(Python Vue Flask Mysql)
  • 每日一题|2306. 公司命名|哈希映射、集合运算
  • FastAPI挂载静态资源
  • 单词记忆的化境:用思想的流水去淹没坚硬的石块
  • 【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计
  • 三种springboot启动时加载方式
  • 使用Renesas R7FA8D1BH (Cortex®-M85)和微信小程序App数据传输
  • 黑盒测试 | 挖掘.NET程序中的反序列化漏洞
  • 统信服务器操作系统【d版系统上Ansible工具】配置方法
  • MySQL:表的约束
  • 2.Seata 1.5.2 集成Springcloud-alibaba
  • 【算法】贪心+堆排序实现大根堆及标准库容器类的融合使用
  • python 2024-10
  • Angular面试题八
  • 13.第二阶段x86游戏实战2-动态模块地址
  • Unicode编码如何转换为汉字
  • DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞