• 技术文章 >web前端 >前端问答

    react怎么改变组件状态

    青灯夜游青灯夜游2022-12-15 19:19:24原创62

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

    大前端成长进阶课程:进入学习

    本教程操作环境: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 (
          <>
                <h1>姓名-{this.state.name}</h1>
                <ul>
                {this.state.list.map((item) => (
                <li key={item.id}>{item.name}</li>
                 ))}
                </ul>
            <div>{this.state.isLoading ? "正在加载" : "加载完成"}</div>
          </>
        );
      }

    二、事件绑定


    1.格式

    <元素 事件名1={ 事件处理函数1 } 事件名2={ 事件处理函数2 } ></元素>\

    注意

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

    2.示例

    import React from 'react'
    import ReactDOM from 'react-dom'
    
    const title = <h1>react中的事件</h1>
    
    
    export default class Hello extends React.Component {
      fn() {
        console.log('mouseEnter事件')
      }
      render() {
        return (
          <div
                onClick = { () => console.log('click事件') }
                onMouseEnte r = { this.fn }
          </div>
        )
      }
    }
    
    const content = (
      <div>
        {title}
        {<Hello />}
      </div>
    )
    
    ReactDOM.render ( content , document.getElementById ('root') )

    注意事项

    别忘记了写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 (
                  <div>
                        <button onClick={this.handleClick}>点我</button>
                  </div>
            )
          }
    }

    结果是这样:

    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 (
          <div>
            <button onClick={ () => { this.handleClick ( ) }}>点我</button>
          </div>
        )
      }
    }

    方式2:使用bind

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

    class App extends React.Component {
      state = {
        msg: 'hello react'
      }
    
      handleClick () {
        console.log(this.state.msg)
      }
    
      render () {
        return (
          <div>
            <button onClick={ this.handleClick.bind (this) }>点我</button>
          </div>
        )
      }
    }

    方式3:

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

    class App extends React.Component {
      state = {
        msg: 'hello react'
      }
    
      handleClick = () => {
        console.log(this.state.msg)
      }
      render() {
        return (
          <div>
            <button onClick={this.handleClick}>点我</button>
          </div>
        )
      }
    }

    优点:

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

    四、修改组件的状态


    注意:

    不能通过直接修改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'
        }
      })

    五、表单处理-受控组件


    示例代码:

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

    注意事项

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

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


    示例代码:

    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 (
          <div>
            <input ref={this.txtRef} />
            <button onClick={handleClick}>获取文本框的值</button>
          </div>
        )
      }
    }

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

    以上就是react怎么改变组件状态的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:vue3.0支持服务端渲染吗 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 7 个很棒且实用的React 组件库(压箱底分享)• ie无法识别react怎么办• react更新state方法有哪些• react axios请求拦截怎么实现• 浅析React Hook中useEffecfa函数的使用
    1/1

    PHP中文网