手写reacthooks的useState

5,957次阅读
没有评论

共计 1784 个字符,预计需要花费 5 分钟才能阅读完成。

前言

关于 react hooks 的 useState, 在写 hooks 的时候经常用到,我在之前也有文章写过 reactHooks 中 useState 的使用小结
关于 useState 这个 hooks,我们如何手写实现呢?

useState 使用小结

1、接收任意类型的入参数,可以是数组、对象、函数等。

2、可以被多次调用,每调用一次都可以解构出不同的状态变量。

3、setState 也可以传入回调函数。改回调函数会被自动传入当前对应的状态变量。

4、被结构出来的状态变量和更改状态变量的方法是 1 对 1 绑定的。

5、调用 setState 后,要重新 render 函数组件

使用 useState 的案例

import React, {useState} from "react";

export default function App() {
  // 声明一个新的叫做“count”的 state 变量
  const [count, setCount] = useState([0]);
  const [name, setName] = useState("haorooms");
  const [haorooms, setHaorooms] = useState(() => "欢迎 haorooms");
  return (

You clicked {count} {count[0]} times

Call me {name}

{name} is haorooms blog?

{haorooms} is good blog?

); }

手写 react hooks 的 useState

import ReactDOM from "react-dom";

let state = [];
let setters = [];
let stateIndex = 0;

const getStateByFn = (v, params) => {if (typeof v === "function") {const _newState = v(params);
    if (!_newState) throw "You must be return state";
    return _newState;
  }
  return v;
};

function createSetter(index) {return function (newState) {state[index] = getStateByFn(newState, state[index]);
    render();};
}

function useState(initialState) {state[stateIndex] = state[stateIndex]
    ? getStateByFn(state[stateIndex])
    : getStateByFn(initialState);
  setters.push(createSetter(stateIndex));
  let value = state[stateIndex];
  let setter = setters[stateIndex];
  stateIndex++;
  return [value, setter];
}

function render() {
  stateIndex = 0;
  ReactDOM.render(, document.getElementById("root"));
}
export default function App() {
      // 声明一个新的叫做“count”的 state 变量
      const [count, setCount] = useState([0]);
      const [name, setName] = useState("haorooms");
      const [haorooms, setHaorooms] = useState(() => "欢迎 haorooms");
      return (

You clicked {count} {count[0]} times

Call me {name}

{name} is haorooms blog?

{haorooms} is good blog?

); }

上面代码直接 copy 出来,作为 app.js 直接引入既可以测试了!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1784字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)