我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react有哪些方法改变state

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react有哪些方法改变state

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的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react有哪些方法改变state

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

react有哪些方法改变state

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

react更新state方法有哪些

react更新state方法有:1、通过key变化子组件,代码如“<Children key={this.state.key} a={this.state.a} b={this.state.b} />”;2、利用ref父组件调用子组件函数;3、通过父级给子级传数据,子级只负责渲染。
2022-11-22

html改变标签字体的方法有哪些

这篇文章主要介绍了html改变标签字体的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html改变标签字体的方法:1、使用font-family属性改变字体系列;2
2023-06-06

C#改变windows服务状态的方法有哪些

本篇内容主要讲解“C#改变windows服务状态的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#改变windows服务状态的方法有哪些”吧!C#windows服务状态、启动和停止服
2023-06-18

react创建组件有哪些方法

这篇文章主要介绍了react创建组件有哪些方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、函数式组件:(1)语法:function myConponent(props)
2023-06-14

react context优化的方法有哪些

本篇内容介绍了“react context优化的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言我们在使用react的过程中
2023-07-04

react改变css样式的两种方法

今天小编给大家分享的是react改变css样式的两种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。react改变css样式的方法:1、动态添加class,代码如“handlesh
2023-07-04

Ubuntu 16.04的改变有哪些

这期内容当中小编将会给大家带来有关Ubuntu 16.04的改变有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Ubuntu 16.04 (代号Xenial Xerus,意为好客的非洲地松鼠)不久就将
2023-06-13

react性能优化的方法有哪些

1. 使用生命周期方法:React的生命周期方法可以帮助我们优化组件的性能。例如,使用shouldComponentUpdate方法来控制组件是否需要重新渲染。2. 使用PureComponent:PureComponent是React提供
2023-09-13

React代码拆分的方法有哪些

本篇内容介绍了“React代码拆分的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!动态加载(import)es6提供import(
2023-07-05

LinuxDeepin 9.12 RC有哪些改变

本篇内容介绍了“LinuxDeepin 9.12 RC有哪些改变”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!较大变化 * 官方 Xfce
2023-06-17

React组件间通信的方法有哪些

这篇文章给大家分享的是有关React组件间通信的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、父子组件通信原理:父组件通过props(与vue中的props区分开)向子组件通信,子组件通过回调事件与
2023-06-25

php变量赋值的方法有哪些

这篇文章主要介绍“php变量赋值的方法有哪些”,在日常操作中,相信很多人在php变量赋值的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php变量赋值的方法有哪些”的疑惑有所帮助!接下来,请跟着小编
2023-07-02

编程热搜

目录