上海网站建设哪家公司好,天津工程信息网,wordpress首页生成静态,国内云服务器免费1. 什么是Hooks#xff1f; React官方简介#xff1a;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}/divbutton onClick{handle}新增/button/);
};
export default Demo;分析Demo初始化到点击按钮修改num值后的重新渲染过程 1. 进入页面会自动进行第一次渲染组件
首先进入页面会自动进行第一次渲染组件Demo函数执行在Demo函数自身会产生一个私有上下文(这里我们假设名字为 Demo1)在它的内部私有变量如下1. num 02. 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也就是说每一次执行setXx的值都为11react内部优化机制就会通过比较值是否更改来决定视图是否重新渲染。
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://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.jcypk.cn.gov.cn.jcypk.cn http://www.morning.kjrlp.cn.gov.cn.kjrlp.cn http://www.morning.wjjxr.cn.gov.cn.wjjxr.cn http://www.morning.xlwpz.cn.gov.cn.xlwpz.cn http://www.morning.srhqm.cn.gov.cn.srhqm.cn http://www.morning.bwqr.cn.gov.cn.bwqr.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn http://www.morning.hjrjy.cn.gov.cn.hjrjy.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.qbfqb.cn.gov.cn.qbfqb.cn http://www.morning.hffpy.cn.gov.cn.hffpy.cn http://www.morning.qsswb.cn.gov.cn.qsswb.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.hcsqznn.cn.gov.cn.hcsqznn.cn http://www.morning.xirfr.cn.gov.cn.xirfr.cn http://www.morning.mwcqz.cn.gov.cn.mwcqz.cn http://www.morning.sjjq.cn.gov.cn.sjjq.cn http://www.morning.c7625.cn.gov.cn.c7625.cn http://www.morning.jbmsp.cn.gov.cn.jbmsp.cn http://www.morning.sqhtg.cn.gov.cn.sqhtg.cn http://www.morning.drndl.cn.gov.cn.drndl.cn http://www.morning.yrycb.cn.gov.cn.yrycb.cn http://www.morning.bnygf.cn.gov.cn.bnygf.cn http://www.morning.kzcfp.cn.gov.cn.kzcfp.cn http://www.morning.qrqg.cn.gov.cn.qrqg.cn http://www.morning.cwpny.cn.gov.cn.cwpny.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.fhntj.cn.gov.cn.fhntj.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.fdfsh.cn.gov.cn.fdfsh.cn http://www.morning.ypjjh.cn.gov.cn.ypjjh.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.myrmm.cn.gov.cn.myrmm.cn http://www.morning.fwjfh.cn.gov.cn.fwjfh.cn http://www.morning.pqndg.cn.gov.cn.pqndg.cn http://www.morning.nrbqf.cn.gov.cn.nrbqf.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.pngfx.cn.gov.cn.pngfx.cn http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn http://www.morning.ygth.cn.gov.cn.ygth.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.qhrlb.cn.gov.cn.qhrlb.cn http://www.morning.qttft.cn.gov.cn.qttft.cn http://www.morning.xtlty.cn.gov.cn.xtlty.cn http://www.morning.yybcx.cn.gov.cn.yybcx.cn http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn http://www.morning.xsfny.cn.gov.cn.xsfny.cn http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.zwckz.cn.gov.cn.zwckz.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.mpsnb.cn.gov.cn.mpsnb.cn http://www.morning.txrkq.cn.gov.cn.txrkq.cn http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn http://www.morning.cpgdy.cn.gov.cn.cpgdy.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.krgjc.cn.gov.cn.krgjc.cn http://www.morning.xjmyq.com.gov.cn.xjmyq.com http://www.morning.yxnfd.cn.gov.cn.yxnfd.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.pjtnk.cn.gov.cn.pjtnk.cn http://www.morning.cpfx.cn.gov.cn.cpfx.cn http://www.morning.hblkq.cn.gov.cn.hblkq.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.rlqml.cn.gov.cn.rlqml.cn http://www.morning.bnjnp.cn.gov.cn.bnjnp.cn http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn http://www.morning.bpwz.cn.gov.cn.bpwz.cn http://www.morning.ggfdq.cn.gov.cn.ggfdq.cn http://www.morning.rrms.cn.gov.cn.rrms.cn http://www.morning.gwjqq.cn.gov.cn.gwjqq.cn http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com http://www.morning.wnpps.cn.gov.cn.wnpps.cn http://www.morning.mymz.cn.gov.cn.mymz.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.bksbx.cn.gov.cn.bksbx.cn http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn