React-state响应式内部数据(类组件&Hook两种方式整理)

类组件

在类组件中要定义内部数据,由两种方案

  1. 构造器里面定义state属性,在这个对象中定义你需要的数据

    constructor(){
    super()
    this.state = {
    count:1
    }
    }

  2. 在类的下面直接定义一个属性state(推荐)

    state = {
    count:10
    }

页面要使用state数据

复制代码
<p>{this.state.count}</p>

建议大家在React中使用内部state数据的时候,使用解构的方式将内容解构出来

复制代码
const {count} = this.state
return (
    <div>
    <p>{count}</p>
    <button onClick={this.increment}>+</button>
</div>
)

内部数据修改方式

  1. 修改基本数据类型

    this.setState({
    count:20
    })

调用setState这个函数,React才能检测到数据发生变化,再次调用render渲染页面内容

  1. 对象合并
    在调用setState的时候,我们传递一个新的对象给函数,将函数里面要修改的内容和原来的内容进行合并,不会产生替换覆盖。
  1. 修改对象的时候
    如果提供了一个新对象,将新对象地址覆盖原来对象的地址。
    如果要修改数组里指定的内容
    尽量将state的数据解构出来,修改完成过后在替换原来的state里面的对象。
    不要频繁操作state,频繁操作state会带来额外的性能开销。
  1. 强制更新页面

    this.forceUpdate()

这个函数是父组件提供的一个函数,用于React组件强制更新。

在开发过程中尽量不要使用。比较消耗性能

关于setState特点

setState这个函数在修改数据的时候,默认是异步函数。

你在修改数据的时候,不想影响代码的执行。

立即获取到修改过后的值,无法实现。

复制代码
this.setState({
    count:20
},()=>{
    console.log(this.state.count);
})

提供一个回调函数,可以在回调函数里面获取到修改过后的值。

修改数据也可以提供一个回调

复制代码
this.setState(()=>{
            // 执行一些代码,记录日志
            return {
                count:20
            }
        })

这种方式修改数据后,也可以通过回调获取到结果

复制代码
this.setState(()=>{
            // 执行一些代码,记录日志
            return {
                count:20
            }
        },()=>{
            console.log(this.state.count);
        })

setState不总是异步的。。。

如果setState这个函数是放在定时器或者延时器中使用,立即变成同步任务

复制代码
setTimeout(() => {
            this.setState({
                count: 10
            })
            console.log(this.state.count);
        }, 2000);

计算属性

在React中没有像Vue中提供了专门computed来计算属性,类组件中采用get、set存取器的方式来完成计算属性功能

复制代码
get total(){
        return this.state.cartList.reduce((sum,next)=>{
            return sum+=next.price * next.num
        },0)ttotal
    }

使用total属性的时候,不要把他当成函数来用

复制代码
{this.total}

HOOK内部响应式数据

基本语法

复制代码
const [count,setCount] = useState(0)

修改函数的函数名字可以自己定义,但是一般约定熟成的规范使用set开发,驼峰命令的方式来进行修改

修改基本类型

复制代码
const [count,setCount] = useState(0)
const [username,setUsername] = useState("xiaowang")


const changeState = ()=>{
        // setCount就是用于修改count的函数
        setCount(1)
    }

修改引用类型

复制代码
const [user,setUser] = useState({id:1,name:"xiaowang"})

const changeUsername = ()=>{
        setUser({
            ...user,
            name:"小张"
        })
    }
  1. 修改用户数据的时候,需要返回一个user对象,不能直接修改之前user,更新state的数据
  2. 修改的时候,会用你传递进去的对象覆盖原来的对象,不会合并对象.
  3. setState可以合并对象

修改数据的时候还可以使用函数的方式

复制代码
setCount(()=>{
            // 执行验证
            return 10
        })
异步数据修改

调用修改函数对state进行数据赋值,默认情况下异步的.

复制代码
setCount(10)

console.log(count) 0

传递函数进去,修改数据同步的方式来执行.

复制代码
setCount(()=>{
    return 10
})
console.log(count) 10
相关推荐
snows_l1 分钟前
JavaScript 性能优化实战大纲
前端
asfdsfgas9 分钟前
Angular CDK 响应式工具实操指南:自适应布局构建技巧
javascript·ecmascript·angular.js
文心快码BaiduComate14 分钟前
文心快码3.5S开发古风射覆小游戏,它帅到我了!
前端·后端·程序员
佛系菜狗1 小时前
防抖和节流-防抖鸿蒙版本实现
前端
不一样的少年_1 小时前
老板问我:AI真能一键画广州旅游路线图?我用 MCP 现场开图
前端·人工智能·后端
东方石匠1 小时前
Javascript常见面试题
前端·javascript·面试
恋猫de小郭1 小时前
Flutter 也有类 React Flow 的节点流程编辑器,快来了解下刚刚开源的 vyuh_node_flow
android·前端·flutter
性野喜悲1 小时前
<script setup lang=“ts“>+uniapp实现轮播(swiper)效果
前端·javascript·vue.js·小程序·uni-app
wangdaoyin20101 小时前
UniApp 在手机端(Android)打开选择文件和文件写入
android·前端·uni-app
用户497357337981 小时前
高端Web全栈工程师精品就业实战班课程 从零打造Web架构师
前端