React Hooks的useState、useRef使用

React Hooks 是 React 16.8 版本引入的新特性,它允许你在不编写 class 的情况下使用 state 和其他 React 特性。其中,useState 和 useRef 是两个常用的 Hooks。

1. useState

useState 是一个允许你在函数组件中添加 state 的 Hook。

使用说明:

  • useState 返回一个状态变量和一个设置该变量的函数。
  • 如果传递给 useState 的初始值是 undefined,则返回的状态变量初始值为 undefined
  • 你可以在组件的任何地方调用 useState,但通常建议在组件的顶层调用它。

代码示例:

import React, { useState } from 'react';

function Example() {
// 声明一个初始值为 "A" 的状态变量 name
const [name, setName] = useState('A');

return (
<div>
<p>Hello, my name is {name}.</p>
<button onClick={() => setName('B')}>Change Name</button>
</div>
);
}

2. useRef

useRef 是一个可以存储任意数据类型的不可变(只读)引用(比如一个 DOM 元素或一个 React 组件)。ref 是一个响应式的引用,这意味着即使它的调用点没有发生改变,它的指向也会随着组件渲染而更新。

使用说明:

  • useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传递的参数(或 undefined)。
  • .current 的值在组件的整个生命周期内保持不变。
  • ref 对象在组件的整个生命周期内保持不变。

代码示例:

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

function Timer() {
const count = useRef(0); // 使用 useRef 存储 count 的初始值
const [seconds, setSeconds] = useState(0); // 使用 useState 来存储当前的秒数
const [countdown, setCountdown] = useState(10); // 使用 useState 来存储倒计时时间(10秒)
const interval = setInterval(() => { // 使用 setInterval 来实现倒计时功能,每秒更新一次 seconds 的值
setSeconds((seconds) => seconds + 1); // seconds 每秒自增 1,当 seconds 大于等于 countdown 时,停止倒计时并清除 interval 以清除倒计时动画
if (seconds >= countdown) { // 当 seconds 大于等于 countdown 时,清除 interval 并调用 clearTimeout 来停止倒计时动画并显示“Game Over”信息,然后调用 setCountdown 来重置倒计时时间(重新开始倒计时)和调用 setSeconds 来重置 seconds 的值(重新开始计时)
clearInterval(interval); // 当倒计时结束后,清除 interval 以停止倒计时动画并显示“Game Over”信息,然后调用 setCountdown 来重置倒计时时间(重新开始倒计时)和调用 setSeconds 来重置 seconds 的值(重新开始计时)
} else { // 当 seconds 小于 countdown 时,继续倒计时动画并显示当前的秒数和剩余的倒计时时间(每秒更新一次)
count.current = seconds; // 将 seconds 的值赋给 ref 的 current 属性以在父组件中通过 useEffect 来使用这个值并在控制台打印这个值,然后通过 countdownRef.current = countdown; 将 countdown 的值赋给 ref 的 current 属性以在父组件中通过 useEffect 来使用这个值并在控制台打印这个值,这样就可以在父组件中获取到当前秒数和剩余的倒计时时间并在控制台打印它们了。注意这里使用 ref 来存储当前的秒数和剩余的倒计时时间是因为它们需要在父组件中通过 useEffect 来使用并在控制台打印它们,而 ref 是唯一可以在函数组件和父组件之间共享数据的 Hook。
  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Hooks 是 React 16.8 中新增的特性,它允许函数组件中使用 state 和其他 React 特性,从而使函数组件具有类组件的能力。 使用 React Hooks 需要先引入 ReactuseStateuseEffect 等钩子函数,然后在函数组件中使用它们。 useState useState 是最常用的 Hook 之一,它可以让我们在函数组件中使用 stateuseState 接收一个初始值作为参数,并返回一个数组,数组的第一个元素是当前 state 的值,第二个元素是更新 state 的函数。 例如,下面的代码在函数组件中使用useState 来保存一个计数器: ``` import React, { useState } from 'react'; function Counter() { 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,它可以在函数组件中使用副作用。副作用包括数据获取、订阅或手动修改 DOM 等操作。useEffect 接收一个函数作为参数,该函数会在组件渲染完成后执行。 例如,下面的代码使用 useEffect 来更新页面标题: ``` import React, { useState, useEffect } from 'react'; function PageTitle() { 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> ); } ``` useContext useContext 可以让我们在函数组件中使用 Context。Context 是一种在组件树中传递数据的方法,它可以避免通过 props 层层传递数据。 例如,下面的代码使用 useContext 来获取全局的主题: ``` import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); function ThemeButton() { const theme = useContext(ThemeContext); return ( <button style={{ background: theme.background, color: theme.foreground }}> I am styled by theme context! </button> ); } ``` 使用 useContext 前需要先创建一个 Context,可以使用 React.createContext 方法来创建。 除了上述三个 Hook,还有 useReducer、useCallback、useMemo、useRefHook 可以使用使用这些 Hook 可以让函数组件更加强大和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值