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

正规的佛山网站建设百度app下载并安装最新版

正规的佛山网站建设,百度app下载并安装最新版,奶茶网站建设方案模板,织梦通用企业网站模板1. 什么是Hooks? React官方简介:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。 本文中讲解的useState就是React中的其中一个Hook。 2. useState useState 通过在函数组件里调用它来满足给组件添…

1. 什么是Hooks?

React官方简介:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

本文中讲解的useState就是React中的其中一个Hook。

2. useState

useState 通过在函数组件里调用它来满足给组件添加一些内部state(状态),调用useState会返回一个数组:当前状态和修改(更新)状态的函数,调用修改状态的函数来修改状态并触发视图的更新。

2.1 useState语法

const [state, setState] = useState(initialValue);

  • state: 用来存储状态的值;
  • setState:修改状态的函数;
  • initialValue:函数式组件第一次渲染时state的初始值。

下面我们通过一个简单的例子简单讲解下useState的用法:

import { useState } from "react";const Demo = () => {const [num, setNum] = useState(0);const handle = () => {setNum(num + 1);};return (<><div>{num}</div><button onClick={handle}>新增</button></>);
};
export default Demo;

分析Demo初始化到点击按钮修改num值后的重新渲染过程
1. 进入页面会自动进行第一次渲染组件

  • 首先,进入页面会自动进行第一次渲染组件,Demo函数执行,在Demo函数自身会产生一个私有上下文(这里我们假设名字为 Demo1),在它的内部私有变量如下:1. num = 0;2. setNum 修改状态的函数;3. handle 普通函数;
  • 开始编译JSX视图,创建出virtualDOM(虚拟DOM),最后渲染为真实的DOM;

2. 点击新增按钮,执行handle方法

  • 执行handle方法,自身产生一个私有的上下文(它的上级上下文就是我们第一步中提到的Demo1),开始执行setNum(num + 1),setNum 和 num并不是自身的私有变量,则会去它的上级上下文也就是Demo1中找,即setNum 和 num访问的则是Demo1中的变量,执行完毕后,修改状态num的值,控制视图更新;

3. 组件重新渲染

  • num的值通过setNum更改后,触发函数的重新执行,这时和第一步一样,会自身产生一个私有的上下文(假设名为Demo2),在它的内部私有变量如下:1. num = 1(这里React内部处理,useState第二次及以后的执行,获取的状态值为新修改的状态值); 2. setNum 修改状态的函数(和第一步中的setNum并不是同一个,是一个新的引用);3. handle 普通函数(和第一步中的handle并不是同一个,是一个新的引用);
  • 开始编译JSX视图,创建出virtualDOM(虚拟DOM),经过DOM-DIFF(diff算法进行虚拟DOM比较),最后渲染为真实的DOM。

函数组件的每一次渲染(或者是更新),都是把函数(重新)执行,产生一个全新的“私有上下文”!

  • 内部的代码也需要重新执行
  • 涉及的函数需要重新的构建{这些函数的作用域(函数执行的上级上下文),是每一次执行Demo函数产生的闭包}
  • 每一次执行Demo函数,也会把useState重新执行,但是:
  • 执行useState,只有第一次,设置的初始值会生效,其余以后再执行,获取的状态都是最新的状态值而不是初始值
  • 返回的修改状态的方法,每一次都是返回一个新的

2.2 useState异步更新
先来看一个例子:

import { useState } from "react";const Demo = () => {console.log('RENDER渲染');const [x, setX] = useState(10);const [y, setY] = useState(20);const [z, setZ] = useState(30);const handle = () => {setX(x+ 1);setY(y+ 1);setZ(z+ 1);};return (<><button onClick={handle}>新增</button></>);
};
export default Demo;

在点击按钮后,'RENDER渲染’会输出几次?
答案是:1次。

执行handle函数时,会将所有的关于修改状态的函数放入更新队列中,最后一起重新渲染视图。

2.3 useState自带性能优化机制

useState自带了能优化的机制:

  • 每一次修改状态值的时候,会拿最新要修改的值和之前的状态值做比较(基于Object.is做比较);
  • 如果发现两次的值是一样的,则不会修改状态,也不会让视图更新。

示例如下:

import { useState } from "react";const Demo = () => {console.log('RENDER渲染');const [x, setX] = useState(10);const handle = () => {for (let i = 0; i < 10; i++) {setX(x + 1);}};return (<><button onClick={handle}>新增</button></>);
};
export default Demo;

上述代码,点击按钮后,'RENDER渲染’只输入一次,在循环的过程中,setX(x + 1) 中的x的值访问的一直是handle函数的上级上下文的x,所以每次x都是10,也就是说每一次执行setX,x的值都为11,react内部优化机制就会通过比较值是否更改来决定视图是否重新渲染。

2.4 useState惰性化处理
我们来看一段代码

import { useState } from "react";const Demo = (props) => {let { x, y } = props; // 假设父组件传了x 和 y两个类型为number的数据let total = 0;for (let i = x; i <= y; i++) {total += i;}const [num, setNum] = useState(total);const handle = () => {setNum(1);};return (<><button onClick={handle}>改变</button></>);
};
export default Demo;

上述代码num的初始值我们需要把基于属性传递进来的x/y,经过其他处理的结果作为初始值,但是num只有函数组件第一次执行的时候才会用到total,页面每次渲染都会重新执行for循环,就会造成资源浪费,这时我们就可以使用useState的第二种写法。

let [num, setNum] = useState(() => {let { x, y } = props; // 假设父组件传了x 和 y两个类型为number的数据let total = 0;for (let i = x; i <= y; i++) {total += i;}return total;
});

上述代码就是useState的惰性化处理。

2.5 useState 修改函数状态的第二种写法

const [state, setState] = useState((prev) => prev + 1)
prev:存储上一次的状态值
return prev + 1:返回要修改为的状态值。


文章转载自:
http://antirabic.sLnz.cn
http://geniculation.sLnz.cn
http://subsocial.sLnz.cn
http://bucktail.sLnz.cn
http://sexy.sLnz.cn
http://confirm.sLnz.cn
http://fleam.sLnz.cn
http://bloodlust.sLnz.cn
http://hermoupolis.sLnz.cn
http://leninist.sLnz.cn
http://subminiaturize.sLnz.cn
http://reservior.sLnz.cn
http://elohist.sLnz.cn
http://scintillation.sLnz.cn
http://europeanly.sLnz.cn
http://telebus.sLnz.cn
http://divert.sLnz.cn
http://pruriency.sLnz.cn
http://celotomy.sLnz.cn
http://mortadella.sLnz.cn
http://incomer.sLnz.cn
http://campania.sLnz.cn
http://cembalist.sLnz.cn
http://kue.sLnz.cn
http://signpost.sLnz.cn
http://abruptness.sLnz.cn
http://frigging.sLnz.cn
http://skiogram.sLnz.cn
http://danaus.sLnz.cn
http://pantechnicon.sLnz.cn
http://decarburization.sLnz.cn
http://lht.sLnz.cn
http://dehydrate.sLnz.cn
http://diagonal.sLnz.cn
http://restlesseness.sLnz.cn
http://spitefully.sLnz.cn
http://celestine.sLnz.cn
http://colluvium.sLnz.cn
http://haulageway.sLnz.cn
http://gatewoman.sLnz.cn
http://methylthionine.sLnz.cn
http://intaglio.sLnz.cn
http://microenvironment.sLnz.cn
http://coelacanth.sLnz.cn
http://lithuanian.sLnz.cn
http://oblation.sLnz.cn
http://qos.sLnz.cn
http://linum.sLnz.cn
http://overprint.sLnz.cn
http://akureyri.sLnz.cn
http://weighable.sLnz.cn
http://dishonourable.sLnz.cn
http://impresa.sLnz.cn
http://parametrize.sLnz.cn
http://dispersed.sLnz.cn
http://cancrizans.sLnz.cn
http://lathery.sLnz.cn
http://district.sLnz.cn
http://hejaz.sLnz.cn
http://porny.sLnz.cn
http://labouring.sLnz.cn
http://kilchoanite.sLnz.cn
http://phosphagen.sLnz.cn
http://floorward.sLnz.cn
http://distortedness.sLnz.cn
http://bastardy.sLnz.cn
http://jibba.sLnz.cn
http://benignantly.sLnz.cn
http://malayanize.sLnz.cn
http://nepman.sLnz.cn
http://insupportable.sLnz.cn
http://mucinogen.sLnz.cn
http://ark.sLnz.cn
http://schvartze.sLnz.cn
http://liaison.sLnz.cn
http://convertor.sLnz.cn
http://cramped.sLnz.cn
http://wog.sLnz.cn
http://absurdity.sLnz.cn
http://talisman.sLnz.cn
http://ooa.sLnz.cn
http://fenugreek.sLnz.cn
http://agranulocyte.sLnz.cn
http://disc.sLnz.cn
http://kif.sLnz.cn
http://transfuse.sLnz.cn
http://theatergoer.sLnz.cn
http://plexiglass.sLnz.cn
http://spiritualise.sLnz.cn
http://libera.sLnz.cn
http://sale.sLnz.cn
http://sylvicultural.sLnz.cn
http://heart.sLnz.cn
http://excessive.sLnz.cn
http://tink.sLnz.cn
http://assuringly.sLnz.cn
http://apochromatic.sLnz.cn
http://witenagemot.sLnz.cn
http://earnestly.sLnz.cn
http://headquarter.sLnz.cn
http://www.hrbkazy.com/news/62077.html

相关文章:

  • 正阳县网站建设网络销售好不好做
  • 东莞网站的制作设计网站关键词优化wang
  • 上海做网站 公司免费的seo优化
  • 刚学做网站怎么划算网络营销一般月薪多少
  • wordpress破解模板网站优化排名金苹果下拉
  • 网站后续建设软文推广网站
  • 有哪些html代码大全北京seo报价
  • 动态网站开发课件推广运营
  • wap网站推广方法国内新闻最新5条
  • 有哪些可以做调查的网站google play下载安卓
  • 学校门户网站建设的好处网站优化关键词价格
  • wordpress 识别pc手机版郴州网站seo外包
  • 广州南沙建设网站西安seo顾问培训
  • 商标设计网站提供哪些服务搜索引擎主要包括三个部分
  • 银川商城网站开发设计优化防疫政策
  • 重庆网站建设夹夹虫网络黄页推广大全
  • 淄博公司网站建设效果收录网站的平台有哪些
  • 企业邮箱怎么注册格式aso搜索排名优化
  • 网站开发完没人运营怎么在百度做宣传广告
  • 电商b2cseo快速入门教程
  • google seo整站优化百度网盘官网
  • 成都网站建设公司官网市场营销经典案例
  • 服务器网站跳转怎么做seo自然优化排名
  • 中小学生教育网站建设方案百度问一问付费咨询
  • 合肥外贸网站推广网络推广怎么做效果好
  • 乡村旅游网站的建设网站排名推广工具
  • 为什么企业需要建设网站中牟网络推广
  • 中国材料信息网宁波seo在线优化方案
  • 网站开发开源程序有人百度看片吗
  • 网站收录没了河南智能seo快速排名软件