react hook useState 不会立刻刷新

react-useStateRef

useRef and UseState together!

How to use

Installation

$ npm i react-usestateref
import useState from 'react-usestateref'
function MyComponent(){
  var [state,setState,ref]=useState(0)
  // ref.current will always have the latest state  
}

As you can see it’s 100% backward compatible. You can replace all your useState with this import and you will always have the latest state.

Motivation:

Many StackOverflow questions that people struggling to get the current state

  • https://stackoverflow.com/questions/54069253/usestate-set-method-not-reflecting-change-immediately
  • https://stackoverflow.com/questions/60438537/usestate-shows-previous-value-always
  • https://stackoverflow.com/questions/57847594/react-hooks-accessing-up-to-date-state-from-within-a-callback
  • https://stackoverflow.com/questions/55874789/using-react-hooks-why-are-my-event-handlers-firing-with-the-incorrect-state

In React when functions accessing the state they receive the state from the moment
the function defined - not the current state.

So if the state changed, your functions and effects my use older state.

Using useRef, can solve it because it have always one value. But when you update the Ref it’s not re-render.

See the example code:

function MyComponent(){
  var [counter,setCounter]=useState(0)
  function increment(){
    setCounter(counter+1)
    alert(counter) // will show 0 since the state not updated yet.			
  }
  useEffect(()=>{
    alert(counter) // Whatever is the current state. It always alert 0
    return ()=>{
        alert(counter) // On unmount it still alert 0, even if you called increment many times.
    }
  },[])
  return (
  <div>
    Current number: {counter}
    <button onClick={increment}>
      Increment
    </button>
  </div>)
}

To solve it I created a new hook useStateRef

See it in action:

import useState from 'react-usestateref' // see this line
function MyComponent(){
  var [counter,setCounter,counterRef]=useState(0)
  function increment(){
    setCounter(counter+1)
    alert(counterRef.current) // will show 1
  }
  useEffect(()=>{
    alert(counterRef.current) // Always show the last value
    return ()=>{
        alert(counterRef.current) // // Always show the last value
    }
  },[])
  return (
  <div>
    Current number: {counter}
    <button onClick={increment}>
      Increment
    </button>
  </div>)
}

It’s fully support the useState API, so you can change your useState to useStateRef and it will not break your app.

Contribution

  • Star & fork this project.
  • I’m open to your contribution.
  • Better documentation or whatever your like. Just open a PR
文章转载自 https://github.com/Aminadav/react-useStateRef
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值