useState

作者: 就问你怕不怕 | 来源:发表于2021-12-07 10:18 被阅读0次

useState是react hooks中最常用且用法最简单的一个hook,关于其基础特性无需赘述,我们直接来了解其使用的两种方式。

useState的使用分为 值更新函数式更新

值更新:顾名思义,就是在setState方法中直接赋上一个值,比如setCount(1)
函数式更新:则是为setState方法中传入一个函数,该函数将接收先前的 state,并返回一个更新后的值,比如setCount(prevCount => prevCount - 1)

下面的计数器组件示例展示了 setState 的两种用法:

import { useState } from "react";
import * as ReactDOM from "react-dom";

function App() {
  function Counter({initialCount}) {
    const [count, setCount] = useState(initialCount);
    return (
      <>
        Count: {count}
        <button onClick={() => setCount(initialCount)}>Reset</button>
        <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
        <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
      </>
    );
  }
  return (
    <div>
      {Counter({initialCount:1})}
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

“+” 和 “-” 按钮采用函数式形式,因为被更新的 state 需要基于之前的 state。但是“重置”按钮则采用普通的赋值形式,因为它总是把 count 设置回初始值。

注意

与 class 组件中的 setState 方法不同,useState 不会自动合并更新对象。你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

  • 先看看class组件中如何更新对象:
import React from "react";
import * as ReactDOM from "react-dom";

class App extends React.Component{
  state = {
    myInfo: {name: 'man', age: 20, favous: '苹果'}
  }

  changeData = ()=>{
    const {myInfo} = this.state;
    // 仍然可使用对象形式
    this.setState({     
      myInfo: {
        ...myInfo,
        ...{favous: '橘子'}
      }
    });
  }

  render(){
    const {myInfo} = this.state;
    console.log(myInfo)
    return (
      <div>
        我的名字: {myInfo.name},
        我爱吃:{myInfo.favous}
        <br/>
        <button onClick={this.changeData}>我爱吃橘子</button>
      </div>
    );
  }
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

可以看到,在class组件中使用setState更新对象可以直接使用对象赋值方式。

  • 再来看看函数式组件如何更新对象:
import { useState } from "react";
import * as ReactDOM from "react-dom";

function App() {
  function Fruits(myInfo) {
    const [data, setData] = useState(myInfo);

    const changeData = ()=>{
      setData(prevState => {
        // 也可以使用 Object.assign
        return {...prevState, ...{favous: '橘子'}};  // 展开运算符
      });
    }
    return (
      <>
        我的名字: {data.name},
        我爱吃:{data.favous}
        <br/>
        <button onClick={changeData}>我爱吃橘子</button>
      </>
    );
  }

  const myInfo = {name: 'man', age: 20, favous: '苹果'};
  return (
    <div>
      {Fruits(myInfo)}
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

而在函数式组件中更新一个对象必须使用函数式更新,在函数里面返回一个新的对象。

相关文章

  • React Hooks——useState的源码流程

    React Hooks——useState 源码版本 16.8 useState 流程示意图 从useState源...

  • React Hooks

    一.useState 提示: useState 最好是在最顶层调用, 组件每次渲染的 useState 数量必须...

  • React Hooks

    一.useState hooks就是在函数组件中使用state通过useState实现的。 useState传入一...

  • 01-React-hooks-useState基本使用

    React-hooks-useState useState的基本用法 格式: 初始状态 useState的第一个参...

  • React-Hooks之保存状态和生命周期

    1.保存状态(useState) useState(initialState) 的参数 initialState ...

  • useState 实现原理

    useState 熟悉hooks的都知道,最常用的useState 大概用法 简单的实现一个useState 先模...

  • hook useEffect

    useState 最简单的 useState 用法是这样的:function Counter() { var [...

  • 常用React Hooks 方法

    useState 使用状态 const [n, setN] = React.useState(0)const [u...

  • reactHooks的使用

    useState的使用 在reactHooks中useState代替了原本的state,const [age,se...

  • Hooks

    useState 说明: 通过useState来定义数据,以及修改方式(即:set方式) 如上:loading即为...

网友评论

      本文标题:useState

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