学习react 笔记四 (Hooks)

Posted 奥特曼 

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习react 笔记四 (Hooks)相关的知识,希望对你有一定的参考价值。

一、使用hooks

因为函数组件是无状态的 所以 react提供了Hooks 能够把 把函数组件变成有状态的组件(提供state)

在React v16.8之前:class组件(提供状态) + 函数组件(展示内容)

React v16.8及其以后:

1.class 组件(提供状态)+ 函数组件(展示内容)

2.Hooks(提供状态) + 函数组件(展示内容)

3.混用以上两种方式:部分功能用class组件,部分功能用Hooks

使用步骤

1.导入 useState 函数

2.调用 useState,传入初始值,返回状态修改状态的函数

3.使用

(1)在jsx中展示状态

(2)特定的时机调用修改状态的函数来改状态

  普通写法

import React,  useState  from 'react'

const Ren = function () 
  const num = useState(0)
   const number = num[0]
   const add = num[1]
  return <div>
    <div>初始值 number</div>
    <div onClick=() =>  add(number + 1) >点击 加1</div>
  </div>

 useState(0) 就是定义初始值变量

number 是 返回的装填 add 是 要修改状态的函数

结构写法

import React,  useState  from 'react'

const Ren = function () 
  const num = useState(0)
  // 第一个参数是 状态 第二个参数是要修改状态的函数
  const [number, add] = num
  return <div>
    <div>初始值 number</div>
    <div onClick=() =>  add(number + 1) >点击 加1</div>
  </div>

二、表单元素

import React,  useState  from 'react'
import ReactDOM from 'react-dom/client'

const Ren = function () 
  const num = useState(0)
  // 结构写法
  const [number, setNum] = num
  function getNum () 
    console.log(number)
  
  return <div>
    <input value=number onChange=(e) =>  setNum(e.target.value) ></input>
    /* <div onClick=() =>  console.log(number) >点击获取</div> */
    <div onClick=getNum>点击获取</div>
  </div>



const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(
  <React.StrictMode>
    <Ren />
  </React.StrictMode>
)

只需要给value 绑定初始值 onChange的 时候调用函数就可以啦

 三、useState和setState的两种写法

import React,  useState  from 'react'
import ReactDOM from 'react-dom/client'

const Ren = function () 
  // const num = useState(0)
  // 第二种写法
  const num = useState(() => 0)
  // 结构写法
  const [number, setNum] = num

  function addNum () 
    // console.log(number)
    setNum(number + 1) //覆盖num
    setNum(number + 1) // 覆盖num
    setNum(number + 1) // 覆盖num
  

  return <div>
    <input value=number onChange=(e) =>  setNum(e.target.value) ></input>
    <div onClick=addNum>点击+1</div>
  </div>



const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(
  <React.StrictMode>
    <Ren />
  </React.StrictMode>
)

useState 第一种写法

const num = useState(0)
useState 第二种写法
const num = useState(() => 0)

本质上是没有区别的 只不过第二种是一个函数  可以在里面做一些判断、打印

在上面setNum 中执行了三遍  但是每次点击输出的结果只是加1 类似于每次都是直接去修改 number 类似于 覆盖 第二次修改覆盖第一次

如果想执行多变 react提供了另一种写法

  function addNum () 
    setNum((a) =>  return a + 1 ) // 上一次执行完在执行下一次
    setNum((a) =>  return a + 1 )
    setNum((a) =>  return a + 1 )
  

他会去等 第一行执行完毕了 再去执行第二行 

函数倒计时案例

import React,  useState  from 'react'
import ReactDOM from 'react-dom/client'

const Ren = function () 
  console.log('执行啦')
  // const [number, setNum] = useState(3)
  const [number, setNum] = useState(() => 
    console.log('useState只执行一遍')
    return 3
  )

  function addNum () 
    console.log('函数内部')
    const timer = setInterval(() => 
      setNum((a) => 
        if (a == 1) clearInterval(timer)
        return a - 1
      )

    , 1000)
  
  return <div>
    <div>number</div>
    <button onClick=addNum>倒计时</button>
  </div>



const root = ReactDOM.createRoot(document.getElementById('root'))

root.render(
  <React.StrictMode>
    <Ren />
  </React.StrictMode>
)

useState只会执行一次 这个值保存在react里 如果执行多次的话 那么每次初始值都是3永远都改变不了 
而值发生改变了整个函数组件都会重新执行一遍

 四、定义useState的两种形式

第一种就是正常定义了


  const [a, setA] = useState(0)

  const [b, setB] = useState(1)

第二种

  const [obj, setObj] = useState( c: 1, d: 1 )
 
  const objEdit = () => 
    // 直接把当前值替换了
    // setObj( c: 2 )
    // 如果想改变一个值
    setObj( ...obj, c: 2 )
  

 <button onClick=objEdit>c,d+1</button>
  <div>obj.c,obj.d </div>

建议还是使用第一种哈 看起来清晰

以上是关于学习react 笔记四 (Hooks)的主要内容,如果未能解决你的问题,请参考以下文章

react-hooks

手把手教你React Hooks

React Hooks - 将状态设置为初始状态

React核心 -- React-Hooks

React核心 -- React-Hooks

React核心 -- React-Hooks