搜索
首页web前端前端问答react有哪些方法改变state

react有哪些方法改变state

Jan 06, 2023 am 09:18 AM
reactstate

react改变state的方法有:1、通过“this.setState({title:'React'});”方法修改state;2、通过“this.setState((preState, props)=>counter:preState.quantity+1)”方法修改state;3、通过“replaceState”方法改变组件的状态。

react有哪些方法改变state

本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。

react有哪些方法改变state?

在react中正确修改state

一,在react中可以通过this.state.{属性}的方式直接获取state,但当我们想要修改state的时候有许多的坑需要注意,以下 为三种常见的陷阱:

不能直接修改state。

组件直接修改state,并不会重新触发render。列如:

this.state.title='React';

正确修改方式是:

this.setState({title:'React'});
state的更新是异步的

调用setState时,组件state并不会立即改变,而是把要修改的状态放入事件队列中,而react优化了真正的执行时机,并且出于本身性能原因,可能会将多次setState的状态修改合并成一次状态修改。因此不要依靠当前的state计算下一个state,因为当真正执行状态修改时,有时候依赖的this.state并不能保证是最新的state,因为react本身会把多次state合并成一次,这时this.state还是旧state,因此也不能依赖当前的props计算下一个状态,因为props的更新也是异步。如:对于react常用的列子中有一个点击加号数值增加一的操作,点击一次+,数量会加1,如果连续点击两次,还是会加1,这是在react合并修改为一次的情况下,相当与执行了如下代码:

Object.assign(
previousState,
{quantity:this.state.quantity+1},
{quantity:this.state.quantity+1},
)

于是后面覆盖前面的操作,最终数值只加1,此时可以使用另一个函数作为参数的setState,这个函数有两个参数,第一个参数是本次组件修改前的状态,第二个参数是当前最新的props。

正确修改方式是:

this.setState((preState, props)=>counter:preState.quantity+1)
state的更新是一个合并的过程

 

当调用ssetState修改组件的状态时,只需要传入发生改变的state,而不是完整的state,因为组件state的更新时一个合并的过程,列如,一个组件的状态为:

this.state={

title:'React',

content:'React is an wondeful JS library'

}

注:当只需要修改title时,将修改的title传给setState即可:

 

this.setState({title:'ReactJs'});

react会合并最新的title到原来的状态,同时保留原来状态的content,最终合并state为:

this.state={
title:'ReactJs,
content:''React is an wondeful Js library
}

 

二,state与不可变对象

react官方把state当成不可变对象,一方面直接修改this.state,组件并不会重新render;另一方面,state中包含的所有状态都应该是不可变的对象,当state当中的某一个状态发生变化时,应该重新创建这个状态对象,而不是直接修改原来的state状态,那么当状态发生变化时,如何去创建新的状态呢,我们根据状态类型可以分为下面三种情况:

 

状态类型为不可变类型(number,string,bool,bull,undefined)

这种情况最简单,因为状态是不可变类型,所以直接给要修改的状态赋一个新值即可,列如下面我们要修改的count为number型,title(string),success(bool)三个状态:

 

this.setState({
count:1,
title:'React',
success:true
})

 

状态类型为数组

假如有一个数组类型的状态books,当想books中增加一本书时,既可使用数组的concat方法或者es6的扩展语法(apread syntax)

方法一:使用preState,concat创建新数组

 

 this.setState((preState)=>books:preState.books.concat(['React Guide']))

 

方法二:ES6 spread syntax

 

this.setState(preState=>books:[...preState,''React Guide])

 

当我们从books中截取部分元素作为新状态时,可以用数组的slice方法:

 

this.setState(preState=>books:preState.books.slice(1,3))

 

当从books中过滤部分元素后,作为新状态时,可以使用filter方法:

 

 this.setState(preState => {
        books: preState.books.filter(item => {

        return item != 'React';

        })
    })

 

注意:不要使用push,pop,shift,unshift,splice登方法修改数组类型的状态,因为这些方法都是在原数组的基础上修改的,而concat,slice,filter会返回一个新的数组。

 

方法三:状态的类型是普通对象(不包含:string,array)

 

使用es6的Object.assgin()方法

 

this.setState({

onwer:Object.assgin({},preState.onwer,{name:'Jason'});

})

 

使用对象扩展语法(Object spread properties):

this.setState(preState=>{
owner:{...preState.owner,name:'Jason'}
})

 

总结:

创建新的状态的关键是,避免使用会直接修改原对象的方法而是使用可以返回一个新对象的方法,当然可以使用Immutable的JS库(Immutable.js)实现类似的效果。

 

思考:

为什么React推荐组件状态的修改时不可变对象呢?

  1. 不可变对象的修改会返回一个新的对象,不用担心原对象在不小心的情况下修改导致的错误,方便程序的管理和调试
  2. 处于性能的考虑,对象组件的状态是不可变对象时,在组件的shouldComponentUpdate方法中仅需要比较前后两次状态对象的引用就可以判断状态是否真的改变,从而避免不必要的render调用

三:除了以上方法修改react组件的状态之外,我们还经常会用到replaceState改变组件的状态

 

replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除。使用语法:

replaceState(object nextState,[, function callback])

nextState,将要设置的新状态,该状态会替换当前的state。

callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。

如:

 class App extends React.Component{

     constructor(props);

      this.state={

      count:1

      title:'数字计算'

      }

}

handleClick=()=>{

  this.replaceState({

    count:this.state.count+1

  })

}

render(){
    return(
      <button onClick={this.onClick}>点我</button>
      )
  }

}

 

结果为:

 

{
count:1
}
推荐学习:《react视频教程

以上是react有哪些方法改变state的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
CSS:我可以在同一DOM中使用多个ID吗?CSS:我可以在同一DOM中使用多个ID吗?May 14, 2025 am 12:20 AM

No,youshouldn'tusemultipleIDsinthesameDOM.1)IDsmustbeuniqueperHTMLspecification,andusingduplicatescancauseinconsistentbrowserbehavior.2)Useclassesforstylingmultipleelements,attributeselectorsfortargetingbyattributes,anddescendantselectorsforstructure

HTML5的目的:创建一个更强大,更容易访问的网络HTML5的目的:创建一个更强大,更容易访问的网络May 14, 2025 am 12:18 AM

html5aimstoenhancewebcapabilities,Makeitmoredynamic,互动,可及可访问。1)ITSupportsMultimediaElementsLikeAnd,消除innewingtheneedtheneedtheneedforplugins.2)SemanticeLelelemeneLementelementsimproveaCceccessibility inmproveAccessibility andcoderabilitile andcoderability.3)emply.3)lighteppoperable popperappoperable -poseive weepivewebappll

HTML5的重要目标:增强网络开发和用户体验HTML5的重要目标:增强网络开发和用户体验May 14, 2025 am 12:18 AM

html5aimstoenhancewebdevelopmentanduserexperiencethroughsemantstructure,多媒体综合和performanceimprovements.1)SemanticeLementLike like,和ImproVereAdiability and ImproVereAdabilityAncccossibility.2)和TagsallowsemplowsemplowseamemelesseamlessallowsemlessemlessemelessmultimedimeDiaiiaemediaiaembedwitWithItWitTplulurugIns.3)

HTML5:安全吗?HTML5:安全吗?May 14, 2025 am 12:15 AM

html5isnotinerysecure,butitsfeaturescanleadtosecurityrisksifmissusedorimproperlyimplempled.1)usethesand andboxattributeIniframestoconoconoconoContoContoContoContoContoconToconToconToconToconToconTedContDedContentContentPrevulnerabilityLikeClickLickLickLickLickLickjAckJackJacking.2)

与较旧的HTML版本相比,HTML5目标与较旧的HTML版本相比,HTML5目标May 14, 2025 am 12:14 AM

HTML5aimedtoenhancewebdevelopmentbyintroducingsemanticelements,nativemultimediasupport,improvedformelements,andofflinecapabilities,contrastingwiththelimitationsofHTML4andXHTML.1)Itintroducedsemantictagslike,,,improvingstructureandSEO.2)Nativeaudioand

CSS:使用ID选择器不好吗?CSS:使用ID选择器不好吗?May 13, 2025 am 12:14 AM

使用ID选择器在CSS中并非固有地不好,但应谨慎使用。1)ID选择器适用于唯一元素或JavaScript钩子。2)对于一般样式,应使用类选择器,因为它们更灵活和可维护。通过平衡ID和类的使用,可以实现更robust和efficient的CSS架构。

HTML5:2024年的目标HTML5:2024年的目标May 13, 2025 am 12:13 AM

html5'sgoalsin2024focusonrefinement和optimization,notnewfeatures.1)增强performandemandeffifice throughOptimizedRendering.2)risteccessibilitywithrefinedibilitywithRefineDatientAttributesAndEllements.3)expliencernsandelements.3)explastsecurityConcerns,尤其是withercervion.4)

HTML5试图改进的主要领域是什么?HTML5试图改进的主要领域是什么?May 13, 2025 am 12:12 AM

html5aimedtotoimprovewebdevelopmentInfourKeyAreas:1)多中心供应,2)语义结构,3)formcapabilities.1)offlineandstorageoptions.1)html5intoryements html5introctosements introdements and toctosements and toctosements,简化了inifyingmediaembedingmediabbeddingingandenhangingusexperience.2)newsements.2)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。