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

淘宝客网站推广备案南通做网站

淘宝客网站推广备案,南通做网站,wordpress延时加载,常州做网站咨询目录 1,介绍2,和 React.createRef() 的区别3,计时器的问题 目前来说,因为函数组件每次触发更新时,都会重新运行。无法像类组件一样让一些内容保持不变。 所以才出现了各种 HOOK 函数:useState,u…

目录

  • 1,介绍
  • 2,和 React.createRef() 的区别
  • 3,计时器的问题

目前来说,因为函数组件每次触发更新时,都会重新运行。无法像类组件一样让一些内容保持不变。
所以才出现了各种 HOOK 函数:useStateuseCallbackuseMemo 等来辅助实现和类组件相似的功能。

useRef 也是这样的目的。

1,介绍

在之前的文章中介绍了 ref,用于获取组件或真实DOM元素的引用。

useRef 作用相同,不过可以在函数组件中使用。同时它会返回对象的固定引用。

换句话说,当函数组件重新运行时,useRef() 前后2次返回的对象引用地址相同。
一个节点(React元素)对应一个唯一的对象。

React.createRef() 使用举例:

import React, { useState } from "react";export default function App() {const refInput = React.createRef();return (<><input ref={refInput}></input><buttononClick={() => {console.log(refInput.current.value);}}>获取 inputRef</button></>);
}

换成 useRef仅需要替换一行代码:

const refInput = React.createRef();
// 替换为
const refInput = useRef();

2,和 React.createRef() 的区别

上面的代码中,看起来只是一行代码的区别,但本质上处理逻辑不同。

  • React.createRef(),如果 ref 的值发生变动(函数组件重新渲染),则将旧值设为 null
  • useRef(),函数组件重新渲染多次时,所有返回的对象的引用地址相同。

验证下:
简单修改下,将每次更新后的新 ref 放到 window 对象中对比下:

import React, { useRef, useState } from "react";window.arr = [];
export default function App() {const refInput = React.createRef();window.arr.push(refInput);const [n, setN] = useState(); // 只是为了重新渲染组件。return (<><inputref={refInput}type="text"value={n}onChange={(e) => {setN(e.target.value);}}/></>);
}

多次改变 input.value 时,检查 window.arr

在这里插入图片描述

替换为 const refInput = useRef();

在这里插入图片描述

3,计时器的问题

在之前介绍 useEffect 时,提到了下面的写法是有问题的。

因为 useEffect 只会执行一次,所以在计时器中通过闭包获取的状态变量 n 永远都是10,

export default function App() {const [n, setN] = useState(10);useEffect(() => {const timer = setInterval(() => {setN(n - 1);}, 1000);return () => {clearInterval(timer);};}, []);return <div>{n}</div>;
}

该问题,通过将依赖项 n 传入即可。但会引起另一个问题:
每次函数重新运行,都会再次执行 useEffect,开启计时器又销毁计时器,开销很大。

export default function App() {const [n, setN] = useState(10);useEffect(() => {const timer = setInterval(() => {setN(n - 1);}, 1000);return () => {clearInterval(timer);};}, [n]);return <div>{n}</div>;
}

所以,可通过 useRef 来将函数重新运行后的新值传递给计时器,同时 useEffect 也只会运行一次,开启一次计时器!

注意,useRef() 返回的虽然是同一个对象,但 setN 修改的是它的 current 属性。所以计时器每次获取的都是新值。

export default function App() {const [n, setN] = useState(10);const refN = useRef(n);useEffect(() => {const timer = setInterval(() => {setN(--refN.current);}, 1000);return () => {clearInterval(timer);};}, []);return <div>{n}</div>;
}

以上。

http://www.yayakq.cn/news/693705/

相关文章:

  • 宁波城乡建设局网站微信小程 wordpress
  • 有哪些做特卖的网站有哪些wordpress 太卡
  • 各大招聘网站wordpress文章分类插件
  • 合肥建设集团招聘信息网站一整套vi设计
  • 网站360全景图怎么做招聘网站建设方案
  • 昆山企业网站建设海报设计制作网站
  • 企业商务网站建设论文教育培训机构官网
  • 阿里巴巴做网站联系人wordpress视频前置广告插件
  • 集团网站设计建设wordpress的页面布局
  • 做网站方案怎么写公司变更登记申请书下载
  • 常州百度网站排名龙山建设集团有限公司网站
  • 网站开发语言 .net黑客做的网站好用不
  • 上海网站建设哪里便宜网站搭建免费模板
  • 简单网站制作成品太原网站优化培训
  • 教你如何快速建站阿里云服务器一个月多少钱
  • 丽水北京网站建设网站建设怎么用长尾做标题
  • 桓台建设局网站qq空间网站
  • wordpress文章添加字段不重复企业网站关联优化
  • 网站制作需要学什么语言购物网站管理层
  • 刷排名凡搜网站宝wordpress 加载排版
  • 天门市网站建设公司网站建设需要要求什么
  • 长宁区科技网站建设黑龙江省住房和建设厅网站首页
  • 哪些做网站的公司比较好厦门无忧网站建设有限公司
  • 新网站百度seo如何做静态网站的好处就是安全性好从而
  • 商城网站开发网站建设费税率多少钱
  • 网站服务器的费用做业务不花钱的网站有哪些
  • 注册型网站推广微信如何分享wordpress
  • 在建设厅网站上下载资质标准网站信息安全保障制度建设情况
  • 怎么看网站是asp还是php股票订阅网站开发
  • 不备案的网站需要注销吗制作个人网页教程