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

React Hooks UseRef的用法

         开发环境时Taro+React Native+TypeScript

export interface TimerRef{timeShow: ()=>{};getCurrentTime: () => number;
}// 修改这里:添加 props 参数,即使不使用也要保留位置
const Timer = forwardRef<TimerRef, {}>((props, ref) => {const [count, setCount] = useState(0);const timerRef = useRef<NodeJS.Timeout | null>(null);const memoryName = 'Time Pace'// 暴露方法给父组件useImperativeHandle(ref, ()=>({timeShow: ()=>{console.log("定时器的当前时间: current time = ", count)console.log("memoryName = ", memoryName)},getCurrentTime: ()=>{return count}}))const startTimer = () => {// 如果已经有定时器在运行,先清除if (timerRef.current !== null) {clearInterval(timerRef.current);}timerRef.current = setInterval(() => {setCount(prev => prev + 1);}, 1000);};const stopTimer = () => {if (timerRef.current !== null) {clearInterval(timerRef.current);timerRef.current = null; // 清除后重置为 null}};useEffect(() => {return () => {if (timerRef.current !== null) {clearInterval(timerRef.current);}};}, []);return (<div><p>计数: {count}</p><button className='btn' style={{marginRight: 20}} onClick={startTimer}>开始</button><button className='btn' onClick={stopTimer}>停止</button></div>);
})
import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef } from 'react'
import { View, Text, Button } from '@tarojs/components'
import './index.scss'interface IProps{color: string;size: string;originalPrice?: string;description?: string;likeStar?: string;price: number;
}const DressPaper = (props:IProps) => {const [price, setPrice] = useState(props.price)const [likeStar, setLikeStar] = useState(props.likeStar || 'star, ')const priceRef = useRef<HTMLSpanElement>(null)const preStarsNumRef = useRef(0)const timeRef = useRef<TimerRef>(null)// 改变价格const changeDressPrice = ()=>{setPrice(prePrice =>{return ++prePrice });// 使用useRef动态改变元素的样式if(priceRef.current){// const element = priceRef.current as unknown as HTMLElement;priceRef.current.style.color = 'blue'}}// 使用ref存储上一次的值// 增加like Star并记录上一次增加后的次数const addLikeStar = ()=>{setLikeStar(preLikeStar => {return preLikeStar + 'star, '})// useRef修饰的值跨越整个生命周期都不会改变,但当值改变时也可以更新在页面中preStarsNumRef.current++}//子组件的事件处理const handleSubShow = ()=>{console.log("通过ref在子组件中获取的当前时间 current time = ", timeRef.current?.getCurrentTime())timeRef.current?.timeShow()}return (<View><View className='container'><Text ref={priceRef} className='txt'>Price: {'$' + price}</Text><Text className='txt'>{likeStar}</Text><Text className='txt'>上一次增加的star个数为:{preStarsNumRef.current}</Text></View><View><Button className='btn' onClick={changeDressPrice}>change price</Button><Button className='btn' onClick={addLikeStar}>add like star</Button></View><View style={{backgroundColor: '#cc9999'}}><Text className='txt'>使用useRef做父子组件间的通信,存储定时器, 组件销毁时清除定时器</Text><Timer ref={timeRef}></Timer><Button className='btn' onClick={handleSubShow}>父组件调用子组件方法,修改子组件的属性</Button></View></View>);
}export default DressPaper;
import UseRefComponent from "../Hooks/UseRef";
<UseRefComponent color='blue' size='m' price={20}></UseRefComponent>

下面的是样式scss文件

.container {display: flex;flex-direction: column;padding: 20px;background-color: #ADD8E6;margin-bottom: 40px;
}.txt {height: 44px;padding: 15px 100px;margin-bottom: 7px;background-color: #FFE4E1;font-size: 26px;
}.btn {height: 64px;// padding: 15px 100px 15px 100px;margin-bottom: 7px;background-color: #D8BFD8;font-size: 28px;
}.buttonContainer {display: flex;flex-direction: row;justify-content: space-around;margin-bottom: 20px;
}.input {background-color: white;padding: 10px;border: 1px solid #ccc;border-radius: 5px;
}

http://www.xdnf.cn/news/18689.html

相关文章:

  • 高速CANFD收发器ASM1042在割草机器人轮毂电机通信系统中的适配性研究
  • 终结系统裸奔:Debian老旧版本安全加固终极指南
  • 梯度下降(线性回归为例)
  • 总结:Maven多仓库多镜像源配置
  • 【KO】前端面试五
  • MySQL存储过程详解
  • 【8位数取中间4位数】2022-10-23
  • 利用Prometheus监控服务器相关数据
  • 本地文件夹即时变身 Web 服务器(文件服务器)
  • 01数据结构-归并排序和计数排序
  • 用 Ansible 优雅部署 Kubernetes 1.33.3(RedHat 10)
  • 文件相关操作的函数和文件操作
  • AlexNet读取数据集 与VGG-11网络
  • 视频编码异常的表现
  • `strchr` 字符串查找函数
  • C++中的右值引用与通用引用:std::move与std::forward的正确使用 (Effective Modern C++ 条款25)
  • 《CF1245D Shichikuji and Power Grid》
  • 嵌入式学习 day57 驱动-驱动框架
  • 国产CANFD芯片技术特性与应用前景综述:以ASM1042系列为例
  • Java试题-选择题(14)
  • 番茄(西红柿)叶片病害检测数据集:12k+图像,10类,yolo标注
  • 2025-08-22 Python进阶10——魔术方法
  • 从原理到实践:朴素贝叶斯算法的魅力解析
  • 构建城市数字孪生底座:深度解析智慧城市全景视频拼接融合解决方案
  • ingress和service区别
  • 未来已来?AI 预测技术在气象、金融领域的应用现状与风险警示
  • python3GUI--Joy音乐播放器 在线播放器 播放器 By:PyQt5(附下载地址)
  • Java面试-== 和 equals() 方法的区别与实现原理
  • Unreal Engine UE_LOG
  • 电脑芯片大的32位与64位指的是什么