react----state

点击了不会执行

import './App.css'
//总组件!!!!!!!,这里引入其他组件的
/*组件名应该和文件名一样 */
const App=()=>{

    /**
     * 设置当点击+的时候数字增大
     * 点击-的时候数字减小
     */
    const addHandler=()=>{
        //点击后数字+1
        a++
        alert('数字+1')

a
    }
    let a=1
    const lessHandler=()=>{
        //点击后数字-1
        a--
        alert('数字-1')
    }
    return <div className="App">
        <h1>{a}</h1>
        <button onClick={lessHandler}>-</button>
        <button onClick={addHandler}>+</button>
    </div>
}

//导出组件
export default App;

为什么没有反应??

我们的执行顺序是先点击按钮

在这里插入图片描述

再触发这个

在这里插入图片描述
后执行的不会影响先执行的

在组件渲染完毕后,再修改组件中的变量,不会使组件重新渲染。

解决办法

当我们修改变量后对组件进行重新渲染!!!!

这里我们就需要一个特殊的变量,当我们这个变量修改的时候组件就会重新渲染!!!!!!!!!!!!!

state!!!和props不同,state只属于当前的组件,其他组件无法访问,并且state是可变的,当其发生变化的时候相关组件会一起刷新

为什么state一改变就会自动刷新???是谁再刷新???

state相当于一个变量,这个变量再react中进行了注册,react会监控这个变量得变化,当state发生变化的时候,会自动触发发生重新渲染

如何使用?

在函数组件中我们需要钩子函数来获取这个state

导入包import{useState} from “react”

它需要一个值作为参数,这个值就是state的初始值,该函数会返回一个数组数组中第一个元素就是初始值。这只是一个初始值,直接修改不会触发组建的重新渲染

const res=useState(1)
    let a=res[0];

并不会修改!!!

第二个元素是一个方法

这里的a就相当于被勾出来的值

import './App.css'
import{useState} from "react"
//总组件!!!!!!!,这里引入其他组件的
/*组件名应该和文件名一样 */
const App=()=>{

    /**
     * 设置当点击+的时候数字增大
     * 点击-的时候数字减小
     */
    const addHandler=()=>{
        //点击后数字+1
        setConter(a+1)
        alert('数字+1')
    }
    let[a,setConter]=useState(1)
    const lessHandler=()=>{
        //点击后数字-1
        setConter(a-1)
        alert('数字-1')
    }
    return <div className="App">
        <h1>{a}</h1>
        <button onClick={lessHandler}>-</button>
        <button onClick={addHandler}>+</button>
    </div>
}

//导出组件
export default App;

使用state出现的问题

1.发生渲染之前我们要先用diff算法检查是不是有变化,如果有变化我们再调用渲染的函数,如果没有变化我们就不会调用渲染的函数

2.如果我们需要传递的是一个结构体,修改的时候使用的是新对象去替换已有的对象

那么我们要new一个结构体来传进去,而不能直接修改,因为state是不能直接修改的。而且我们的值可能发生丢失等等问题(因为是直接渲染)

在这里插入图片描述

3.当通过setState去修改一个state时,并不表示修改当前的state,它修改的是下一次渲染的state值

4.setState()会触发组件的重新渲染,它是异步的。

同步是什么?
我们调完setState立刻就直接渲染
什么是异步?
我们调完setState并不是立刻渲染

异步怎么体现?????

有一个组件渲染的队列,diff算法先会对比完所有的东西,都放到队列里面后我们再统一渲染!!!!!!!!!

在这里插入图片描述

setState(counter+1)会有安全隐患!!!!!!!!可能会出现计算错误的情况

当我们手速太快了,连续点击。因为是用旧值,两次setState都是同一个值,等于后面的就白点了。

如何解决?

可以通过为setState()传递回调函数的形式来修改state的值,setState中回调函数的返回值会成为新的state的值,回调函数执行时,react会将最新的state值作为参数传递

在这里插入图片描述

这里加了防抖设

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值