前端学习案例-React Hooks『useState』实现

 第一步 安装环境

 npm init -y

 yarn add vite -D

 第二步 演示usestate的功能

const {useState}=React

function App(){
    const [count,setCount]=useState(0)
    return (
        <div>
            <h1>{count}</h1>
            <button onClick={()=>setCount(count+1)}>+1</button>
        </div>
    )
}

ReactDOM.render(
    <App/>,
    document.querySelector("#app")
)

第三步 手动封装替代

const MyReact = (() => {
  let _state;
  function useState(initialState) {
    debugger
    _state = _state == undefined ? initialState : _state;
    return [_state, _setState];
  }
  const _setState = (newState) => {
    _state = newState;
    render();
  };
  return {
    useState,
  };
})();
function render() {
  ReactDOM.render(<App />, document.querySelector("#app"));
}
const { useState } = MyReact;
function App() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}
ReactDOM.render(<App />, document.querySelector("#app"));

实现-1操作

const { useState } = React;
function App() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <button onClick={()=>setCount(count=> count - 1)}>-1</button>
    </div>
  );
}
ReactDOM.render(<App />, document.querySelector("#app"));

手动封装替代

const MyReact = (() => {
  let _state;
  function useState(initialState) {
    _state = _state == undefined ? initialState : _state;
    return [_state, _setState];
  }
  const _setState = (newState) => {
    if(typeof newState==="function"){
        _state=newState(_state)
    }else{
        _state = newState;
    }
    render();
  };
  return {
    useState,
  };
})();
function render() {
  ReactDOM.render(<App />, document.querySelector("#app"));
}
const { useState } = MyReact;
function App() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <button onClick={()=>setCount(count=> count - 1)}>-1</button>
    </div>
  );
}
ReactDOM.render(<App />, document.querySelector("#app"));

实现判断操作

const { useState } = React;
function App() {
  const [count, setCount] = useState(0);
  const [flag, setFlag] = useState(false);

  return (
    <div>
      <h1>{count}</h1>
      <h1>{flag ? "打开状态" : "关闭状态"}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <button onClick={() => setCount((count) => count - 1)}>-1</button>
      <button onClick={() => setFlag((flag) => (flag = !flag))}>
        {flag ? "关闭" : "打开"}
      </button>
    </div>
  );
}
ReactDOM.render(<App />, document.querySelector("#app"));

手动封装

const MyReact = (() => {
  const states = [],
    stateSetters = [];
  var stateIndex = 0;
  function createState(initialState, stateIndex) {
    return states[stateIndex] !== undefined ? states[stateIndex] : initialState;
  }
  function createStateSetter(stateIndex) {
    return function (newState) {
      if (typeof newState === "function") {
        states[stateIndex] = newState(states[stateIndex]);
      } else {
        states[stateIndex] = newState;
      }
      render();
    };
  }
  function useState(initialState) {
    states[stateIndex] = createState(initialState, stateIndex);
    if (!stateSetters[stateIndex]) {
      stateSetters.push(createStateSetter(stateIndex));
    }
    const _state = states[stateIndex];
    const _setState = stateSetters[stateIndex];
    stateIndex++;
    return [_state, _setState];
  }
  return {
    useState,
  };
  //   let _state=[]
  //   function useState(initialState) {
  //     _state = _state == undefined ? initialState : _state;
  //     return [_state, _setState];
  //   }
  //   const _setState = (newState) => {
  //     if(typeof newState==="function"){
  //         _state=newState(_state)
  //     }else{
  //         _state = newState;
  //     }
  //     render();
  //   };
  //   return {
  //     useState,
  //   };
  function render() {
    stateIndex = 0;
    ReactDOM.render(<App />, document.querySelector("#app"));
  }
})();

const { useState } = MyReact;
function App() {
  const [count, setCount] = useState(0);
  const [flag, setFlag] = useState(false);

  return (
    <div>
      <h1>{count}</h1>
      <h1>{flag ? "打开状态" : "关闭状态"}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <button onClick={() => setCount((count) => count - 1)}>-1</button>
      <button onClick={() => setFlag((flag) => (flag = !flag))}>
        {flag ? "关闭" : "打开"}
      </button>
    </div>
  );
}
ReactDOM.render(<App />, document.querySelector("#app"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值