【React hooks】useState (原理) 与useEffect (用法)

本文探讨了React Hooks中的useState原理和实现,强调了闭包在其中的作用。在多个useState使用时,通过改进将_state转换为数组并利用index解决相互影响问题。然而,这种方式存在顺序改变可能导致错误的问题。此外,文章指出异步操作中,useState的更新并不总是立即反映在console.log中,需要使用useRef或useContext来解决。最后,文章介绍了useEffect作为afterRender的替代,模拟生命周期函数,并详细解析了不同生命周期的行为。
摘要由CSDN通过智能技术生成

简单的原理

如下例子,使用useState函数,可以得到初始值n=0,随后每一次调用setN都可以更新n,并渲染App

import React from "react";
import ReactDOM from "react-dom";
const rootElement = document.getElementById("root");

function App() {
   
  const [n, setN] = React.useState(0);
  return (
    <div className="App">
      <p>{
   n}</p>
      <p>
        <button onClick={
   () => setN(n + 1)}>+1</button>
      </p>
    </div>
  );
}

ReactDOM.render(<App />, rootElement);

查了资料后了解到,useState等hooks是用到了闭包,外部储存一个变量_state(此处为了方便称呼如此命名,不代表官方就是叫这个)来保存目标数据,每次setN的时候,就是讲n改为_state的,不然重新渲染App的时候,又会走const [n, setN] = React.useState(0);这个函数,又会重置为初始值,所以要用到闭包

简单的实现

那么用野路子,简单的实现一下这个功能


import React from "react";
import ReactDOM from "react-dom";
const rootElement = document.getElementById("root");


let _state; // 把 state 存储在外面
 
function useState(initialValue) {
   
  _state = _state === undefined ? initialValue : _state; // 如果没有 _state,说明是第一次执行,把 initialValue 复制给它
  function setState(newState) {
   
    _state = newState;    //实际修改的是_state,重新渲染也会去拿_state
    render();
  }
  return [_state, setState];
}
//简单的实现render
const render = ()=>{
   
  ReactDOM.render(<App />, rootElement);
}

function App() {
   
  const [n, setN] = React.useState(0);
  return (
    <div className="App">
      <p>{
   n}</p
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值