react-hooks简单同步异步处理小技巧

import React, { useState, useEffect, useReducer } from 'react';
import { useImmer } from "use-immer"
import './App.css';


function reducer(state: { count: number; }, action: { type: any; }) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
}

function App() {
  // 定义
  const [state, setState] = useImmer({
    people: [
      {
        name: '马云',
        englishName: 'Jack Ma'
      },
      {
        name: '马化腾',
        englishName: 'Pony Ma'
      },
      {
        name: '李彦宏',
        englishName: 'Robin Li'
      }
    ]
  })

  const [num, setNum] = useState(1);

  const [stateReducer, dispatchReducer] = useReducer(reducer, {count:999});
  useEffect(() => {
    console.log(num);
    //处理异步数据
  }, [num])

  useEffect(() => {
    console.log(state);
  }, [state.people[2]])

  const onClick = () => {
    setNum((num) => {
      console.log(num,"点击之前的变化");
      //处理异步数据
      return num = 2
    })
  }
  const onClick1 = () => {
    setState((state: { people: { name: string; }[]; }) => { state.people[2].name = '陈强' })
    console.log(state);//异步
  }
  const onClick2 = () => {
    dispatchReducer({ type:"increment"})
    console.log(stateReducer.count);//异步
  }
  return (
    <div className="App">
      <h1>我是useReducer----{stateReducer.count}</h1>
      <h1>{num}</h1>
      <ul>
        {state.people.map(item => <li key={item.englishName}>{item.name}</li>)}
      </ul>
      <button onClick={onClick}>点击</button>
      <button onClick={onClick1}>复杂数据处理</button>

      <button onClick={onClick2}>我要修改stateReducer</button>
    </div>
  );
}

export default App;

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗨,玉麟

打赏19.88源码双手奉上

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值