美文网首页
react的setState与useState

react的setState与useState

作者: 雨落倾城夏微凉_e861 | 来源:发表于2020-07-24 15:50 被阅读0次

在之前的react版本中要往组件中添加状态要用类组件才可以,在新的react版本中加入了hooks使得函数组件也具备了添加状态的功能而且使用上也非常的方便。

在类组件中定义状态用state定义,但是修改状态必须要用到setState来修改,为了更好的感知性能,React 会延迟调用setState,然后通过一次传递更新多个组件。React 并不会保证 state 的变更会立即生效,我们测试一下:

class Count extends React.Component{
  state = {
    count: 1
  }
  handlecount = () => {
    this.setState({count: this.state.count+1})
    console.log("点击button " + this.state.count)
  }
  render(){
    return(
    <div>
      <div>{this.state.count}</div>
      <button onClick={this.handlecount}>add count</button>
    </div>
    )
  }
}

我在页面中定义了一个类组件并且添加状态赋予初始值1,添加一个button点击事件让count+1然后直接输出查看结果

1.png

页面已经变为了2,控制台还是1,如果我们开发时需要拿到最新的值做下面的处理,这样显然会出现问题。不过setState还给我们提供了第二个参数接收一个函数修改代码如下:

class Count extends React.Component{
  state = {
    count: 1
  }
  handlecount = () => {
    this.setState({count: this.state.count+1}, () => console.log("点击button " + this.state.count))
  }
  render(){
    return(
    <div>
      <div>{this.state.count}</div>
      <button onClick={this.handlecount}>add count</button>
    </div>
    )
  }
}

点击button查看效果


2.png

这次拿到了最新的值。

接下来用类组件和函数组件使用useState写两个小demo看看结果有什么不同;首先实现类组件:

class Count extends React.Component{
  state = {
    count: 1
  }
  handleClick = () => {
    setTimeout(() => alert(this.state.count), 2000)
  }
  handlecount = () => {
    this.setState({count: this.state.count+1})
  }
  render(){
    return(
    <div>
      <div>{this.state.count}</div>
      <button onClick={this.handleClick}>提交</button>
      <button onClick={this.handlecount}>add count</button>
    </div>
    )
  }
}

我重写了Count组件,新加了一个提交的按钮,给他添加了一个点击方法,用定时器控制2s后弹出count。我们进行这样的操作,点击提交后,快速点击add count按钮,等弹窗弹出查看count的值。显示如下:

3.png

弹出的值与页面一致,说明取到了最新的值。接下来再写一个函数组件做一样的操作,代码如下:

import React, {useState} from "react"
function Hooksdemo (){
  const [count, setCount] = useState(0);
  function handleClick (){
    setTimeout(() => alert(count), 2000)
  }
  function handlecount (){
    setCount(count+1)
  }
  return (
    <div>
      <div>{count}</div>
      <button onClick={handleClick}>提交</button>
      <button onClick={handlecount}>add count</button>
    </div>
    )
}
export default Hooksdemo

需要引入useState,和上面一样操作页面查看弹窗效果


4.png

发现和上面结果是不一样的。现在我们修改代码以达到上面的效果,引入useRef。修改如下

function Hooksdemo (){
  const [count, setCount] = useState(0);
  const uref = useRef();
  uref.current = count;
  function handleClick (){
    setTimeout(() => alert(uref.current), 2000)
  }
  function handlecount (){
    setCount(count+1)
  }
  return (
    <div>
      <div>{count}</div>
      <button onClick={handleClick}>提交</button>
      <button onClick={handlecount}>add count</button>
    </div>
    )
}
export default Hooksdemo
5.png 6.png

第一张图是输出的useRef(),发现他有一个current属性,我们把count的值赋给了他,最后弹出uref.current。结果和之前一样了,useRef页面重新渲染并不会创建一个新的对象,所以把值赋予current的属性改变的还是刚创建时的对象。

相关文章

网友评论

      本文标题:react的setState与useState

      本文链接:https://www.haomeiwen.com/subject/rhdjlktx.html