react怎么改变组件状态

在react中,可以利用setState()来修改组件的状态。setState()是用于更新组件状态state的方法,该方法可以对组件state的更改排入队列,也可获取最新的状态,语法为“this.setState( { 要修改的部分数据 } )”。

react怎么改变组件状态

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

一、有状态组件和无状态组件

1.先理解一下什么是状态:

定义:

是用来描述事物在某一时刻的形态的数据 ,  一般称为state。(可以简单理解为状态就是数据)
例如:9月23号时书的库存数量; 18岁时人的身高. vue中也有相关的概念

特点:

能被改变,改变了之后视图会有对应的变化 (双向数据绑定)

2.有状态组件和无状态组件

有状态组件:能定义state的组件。类组件就是有状态组件。

无状态组件:不能定义state的组件。函数组件又叫做无状态组件

注意:

2019年02月06日,React 16.8版本中引入了 React Hooks,从而函数式组件也能定义自己的状态了。【相关推荐:Redis视频教程、编程教学】

本文主要讲解类组件的状态

3.类组件的状态

1)定义状态

使用 state = { } 来做初始化

import React from "react";export default class Hello extends React.Component {  // 这里的state就是状态  state = {    list:  [{ id: 1, name: "给我一个div" }],    isLoading : true  };}

登录后复制

2)在视图中使用

 render() {    return (                  

姓名-{this.state.name}

            

登录后复制            {this.state.list.map((item) => (            {item.name}             ))}                    {this.state.isLoading ? “正在加载” : “加载完成”}      >    );  }

二、事件绑定

1.格式

元素>

注意

React 事件名采用驼峰命名法,比如:onMouseEnter、onFocus、 onClick ……

2.示例

import React from 'react'import ReactDOM from 'react-dom'const title = 

react中的事件

export default class Hello extends React.Component {  fn() {    console.log('mouseEnter事件')  }  render() {    return (      
 console.log('click事件') }            onMouseEnte r = { this.fn }      
    )  }}const content = (  
    {title}    {}  
)ReactDOM.render ( content , document.getElementById ('root') )

登录后复制

注意事项

事件名是小驼峰命名格式

在类中补充方法

this . fn不要加括号:

onClick={ this.fn( ) } 此时会先调用fn(),然后将fn的执行结果当做click事件的处理函数

别忘记了写this

三、事件处理-this指向问题

1.问题代码:

class App extends React.Component {        // 组件状态      state = {        msg: 'hello react'      }            // 事件处理函数      handleClick() {            console.log(this) // 这里的this是 undefined      }            render() {            console.log(this) // 这里的this是当前的组件实例 App                  return (              
                                  
        )      }}

登录后复制

结果是这样:

render方法中的this指向的是当前react组件。事件处理程序中的this指向的是undefined

2.原因:

class类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用,所以类中的函数this指向了undefined

3.解决事件函数this指向:

方式1:

在事件处理程序外套一层箭头函数

缺点:需要在处理函数外额外包裹一个箭头函数, 结构不美观

优点:

前面讲过在 {this.handleClick ( )}这里面调用处理函数的时候不要加小括号,不然里面的程序会立即执行掉,现在在外面包裹一层箭头函数之后,不仅可以加上小括号,还能实现传参,后面会用到

class App extends React.Component {  state = {    msg: 'hello react'  }  handleClick () {    console.log(this.state.msg)  }  render () {    return (      
              
    )  }}

登录后复制

方式2:使用bind

通过bind()方法改变函数this指向并不执行该函数的特性解决

class App extends React.Component {  state = {    msg: 'hello react'  }  handleClick () {    console.log(this.state.msg)  }  render () {    return (      
              
    )  }}

登录后复制

方式3:

在class中声明事件处理函数的时候直接使用箭头函数

class App extends React.Component {  state = {    msg: 'hello react'  }  handleClick = () => {    console.log(this.state.msg)  }  render() {    return (      
              
    )  }}

登录后复制

优点:

代码简洁,直观,使用最多的一种方式

四、修改组件的状态

注意:

不能通过直接修改state中的值来让视图变化 ! ! !
通过this.setState()方法修改

在react中,setstate是用于更新组件状态state的方法;setState()将对组件state的更改排入队列,并通知React需要使用更新后的state重新渲染此组件及其子组件。

1.语法:

语法:this.setState( { 要修改的部分数据 } )
这是继承自React.Component的修改类组件状态的方法

state = {    count: 0,    list: [1, 2, 3],    person: {      name: 'jack',      age: 18    }  }    // 【不推荐】直接修改当前值的操作:  this.state.count++  ++this.state.count  this.state.count += 1  this.state.count = 1  this.state.list.push(4)  this.state.person.name = 'rose'    // 【推荐】不是直接修改当前值,而是创建新值的操作:  this.setState({    count: this.state.count + 1,    list: [...this.state.list, 4],    person: {      ...this.state.person,    // 要修改的属性,会覆盖原来的属性,这样,就可以达到修改对象中属性的目的了        name: 'rose'    }  })

登录后复制

五、表单处理-受控组件

HTML中表单元素是可输入的,即表单维护着自己的可变状态(value)。但是在react中,可变状态通常是保存在state中的,并且要求状态只能通过setState进行修改。React中将state中的数据与表单元素的value值绑定到了一起,由state的值来控制表单元素的值受控组件:value值受到了react控制的表单元素

示例代码:

class App extends React.Component {  state = {    msg: 'hello react'  }  handleChange = (e) => {    this.setState({      msg: e.target.value    })  }   // value 绑定state 配合onChange事件双向绑定  render() {    return (      
              
    )  }}

登录后复制

注意事项

使用受控组件的方式处理表单元素后,状态的值就是表单元素的值。即:想要操作表单元素的值,只需要通过this.setState( { 要修改的部分数据 } )操作对应的状态即可

六、表单处理-非受控组件-ref

受控组件是通过 React 组件的状态来控制表单元素的值非受控组件是通过手动操作 DOM 的方式来控制ref:用来在 React 中获取 DOM 元素

示例代码:

import { createRef } from 'react'class Hello extends Component {  txtRef = createRef()  handleClick = () => {    // 文本框对应的 DOM 元素    // console.log(this.txtRef.current)    // 文本框的值:    console.log(this.txtRef.current.value)  }  render() {    return (      
                      
    )  }}

登录后复制

(学习视频分享:编程基础视频)

以上就是react怎么改变组件状态的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2924056.html

(0)
上一篇 2025年3月11日 18:53:28
下一篇 2025年3月8日 07:21:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue3编译做了哪些优化

    vue3编译优化有:1、引入了 patchFlag,用来标记动态内容;在编译过程中会根据不同的属性类型打上不同的标识,从而实现了快速diff算法。2、Block Tree。3、静态提升,是将静态的节点或者属性提升出去。4、预解析字符串化,当…

    2025年3月11日 编程技术
    200
  • vue渲染函数使用哪个命令

    vue渲染函数使用“render”命令。vue中是使用模板HTML语法组建页面的,使用render函数可以用js语言来构建DOM。因为vue是虚拟DOM,所以在拿到template模板时也要转译成VNode的函数,而用render()函数构…

    2025年3月11日 编程技术
    200
  • React父组件怎么调用子组件的方法

    调用方法:1、类组件中的调用可以利用React.createRef()、ref的函数式声明或props自定义onRef属性来实现;2、函数组件、Hook组件中的调用可以利用useImperativeHandle或forwardRef抛出子组…

    2025年3月11日
    200
  • react怎么设置div高度

    react设置div高度的方法:1、通过css方式实现div高度;2、在state中声明一个对象C,并在该对象中存放更换按钮的样式,然后获取A并重新设置C中的“marginTop”即可。 本教程操作环境:Windows10系统、react1…

    2025年3月11日
    200
  • react 怎么改变列表状态

    react改变列表状态的方法:1、打开相应的react文件;2、循环一个列表,然后通过index改变原数组项;3、通过state更改原数组,使列表重新渲染即可。 本教程操作环境:Windows10系统、react18.0.0版、Dell G…

    2025年3月11日
    200
  • web前端与前端有什么区别

    前端是一个泛指,范畴更广泛,web前端属于web开发的前端,是一个明确的范围,方向更明确;前端开发包括了移动前端开发和web前端开发,即包括了PC端开发和移动端领域的开发,而web前端开发主要指传统的PC端网页开发,这是它们之间最大的区别。…

    2025年3月11日
    200
  • Web3.0来了,它对前端友好吗?

    最近 web3.0 的呼声真的是越来越高,也越来越疯狂。对于我们前端来说,我们需要具备什么技术呢?它对前端友好吗?下面本篇文章就来带大家聊聊,希望对大家有所帮助! 首先先介绍一下 web3.0 是如何衍生的 互联网 我们先聊一下啥是web,…

    2025年3月11日
    200
  • 实例详解如何给轮播图做自适应的高度

    本篇文章给大家带来了关于前端的相关知识,其中主要介绍了怎么给轮播图做一个自适应的高度,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。 不知道大家有没有遇到这样的需求或者说看到类似的效果,就是列表进去详情看轮播图的时候,当手指滚动轮播图时…

    2025年3月11日 编程技术
    200
  • 总结5个前端开发中很棒的资源

    本篇文章给大家带来了关于前端开发的相关知识,其中主要跟大家分享前端开发中5个很赞的资源,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。 Web 开发社区非常庞大,要找到可靠且准确的资源让人觉得慌。幸运的是,我们的开发者已经为你收集了 &…

    2025年3月11日
    200
  • 聊聊前端怎么获取电池信息

    今日正能量: 当奇怪的需求越做越多的时候,证明你的眼光也正在变得广阔。 产品经理:加个需求,用户电脑设备如果快没电,我要暖心的告诉他该插上电源。 前端攻城狮:。。。他电脑不会自己提醒吗? 产品经理:你做不做? 前端攻城狮:做! 立即学习“前…

    2025年3月11日
    200

发表回复

登录后才能评论