溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

react如何改變組件狀態(tài)

發(fā)布時間:2022-12-16 09:35:03 來源:億速云 閱讀:130 作者:iii 欄目:web開發(fā)

這篇文章主要介紹“react如何改變組件狀態(tài)”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“react如何改變組件狀態(tài)”文章能幫助大家解決問題。

在react中,可以利用setState()來修改組件的狀態(tài)。setState()是用于更新組件狀態(tài)state的方法,該方法可以對組件state的更改排入隊列,也可獲取最新的狀態(tài),語法為“this.setState( { 要修改的部分?jǐn)?shù)據(jù) } )”。

一、有狀態(tài)組件和無狀態(tài)組件

1.先理解一下什么是狀態(tài):

定義:

是用來描述事物在某一時刻的形態(tài)數(shù)據(jù) ,  一般稱為state。(可以簡單理解為狀態(tài)就是數(shù)據(jù))
例如:9月23號時書的庫存數(shù)量; 18歲時人的身高. vue中也有相關(guān)的概念

特點:

能被改變,改變了之后視圖會有對應(yīng)的變化 (雙向數(shù)據(jù)綁定)

2.有狀態(tài)組件和無狀態(tài)組件

有狀態(tài)組件:能定義state的組件。類組件就是有狀態(tài)組件。

無狀態(tài)組件:不能定義state的組件。函數(shù)組件又叫做無狀態(tài)組件

注意:

2019年02月06日,React 16.8版本中引入了 React Hooks,從而函數(shù)式組件也能定義自己的狀態(tài)了。【相關(guān)推薦:Redis視頻教程、編程教學(xué)】

本文主要講解類組件的狀態(tài)

3.類組件的狀態(tài)

1)定義狀態(tài)

使用 state = { } 來做初始化

import React from "react";

export default class Hello extends React.Component {

  // 這里的state就是狀態(tài)
  state = {
    list:  [{ id: 1, name: "給我一個div" }],
    isLoading : true
  };
}

2)在視圖中使用

 render() {
    return (
      <>
            <h2>姓名-{this.state.name}</h2>
            <ul>
            {this.state.list.map((item) => (
            <li key={item.id}>{item.name}</li>
             ))}
            </ul>
        <div>{this.state.isLoading ? "正在加載" : "加載完成"}</div>
      </>
    );
  }

二、事件綁定

1.格式

<元素 事件名1={ 事件處理函數(shù)1 }  事件名2={ 事件處理函數(shù)2 }  ></元素>\

注意

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

2.示例

import React from 'react'
import ReactDOM from 'react-dom'

const title = <h2>react中的事件</h2>


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') )

注意事項

  • 事件名是小駝峰命名格式

  • 在類中補(bǔ)充方法

  • this . fn不要加括號:

    • onClick={ this.fn( ) } 此時會先調(diào)用fn(),然后將fn的執(zhí)行結(jié)果當(dāng)做click事件的處理函數(shù)

別忘記了寫this

三、事件處理-this指向問題

1.問題代碼:

class App extends React.Component {
        // 組件狀態(tài)
      state = {
        msg: 'hello react'
      }
      
      // 事件處理函數(shù)
      handleClick() {
            console.log(this) // 這里的this是 undefined
      }
      
      render() {
            console.log(this) // 這里的this是當(dāng)前的組件實例 App
        
          return (
              <div>
                    <button onClick={this.handleClick}>點我</button>
              </div>
        )
      }
}

結(jié)果是這樣:

  • render方法中的this指向的是當(dāng)前react組件。

  • 事件處理程序中的this指向的是undefined

2.原因:

class類和模塊的內(nèi)部,默認(rèn)就是嚴(yán)格模式,所以不需要使用use strict指定運行模式。只要你的代碼寫在類或模塊之中,就只有嚴(yán)格模式可用,所以類中的函數(shù)this指向了undefined

3.解決事件函數(shù)this指向:

方式1:

在事件處理程序外套一層箭頭函數(shù)

缺點:需要在處理函數(shù)外額外包裹一個箭頭函數(shù), 結(jié)構(gòu)不美觀

優(yōu)點:

前面講過在 {this.handleClick ( )}這里面調(diào)用處理函數(shù)的時候不要加小括號,不然里面的程序會立即執(zhí)行掉,現(xiàn)在在外面包裹一層箭頭函數(shù)之后,不僅可以加上小括號,還能實現(xiàn)傳參,后面會用到

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()方法改變函數(shù)this指向并不執(zhí)行該函數(shù)的特性解決

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中聲明事件處理函數(shù)的時候直接使用箭頭函數(shù)

class App extends React.Component {
  state = {
    msg: 'hello react'
  }

  handleClick = () => {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>點我</button>
      </div>
    )
  }
}

優(yōu)點:

代碼簡潔,直觀,使用最多的一種方式

四、修改組件的狀態(tài)

注意:

不能通過直接修改state中的值來讓視圖變化 ! ! !
通過this.setState()方法修改

在react中,setstate是用于更新組件狀態(tài)state的方法;setState()將對組件state的更改排入隊列,并通知React需要使用更新后的state重新渲染此組件及其子組件。

1.語法:

語法:this.setState( { 要修改的部分?jǐn)?shù)據(jù) } )
這是繼承自React.Component的修改類組件狀態(tài)的方法

state = {
    count: 0,
    list: [1, 2, 3],
    person: {
      name: 'jack',
      age: 18
    }
  }
  
  // 【不推薦】直接修改當(dāng)前值的操作:
  this.state.count++
  ++this.state.count
  this.state.count += 1
  this.state.count = 1
  this.state.list.push(4)
  this.state.person.name = 'rose'
  
  // 【推薦】不是直接修改當(dāng)前值,而是創(chuàng)建新值的操作:
  this.setState({
    count: this.state.count + 1,
    list: [...this.state.list, 4],
    person: {
      ...this.state.person,
    	// 要修改的屬性,會覆蓋原來的屬性,這樣,就可以達(dá)到修改對象中屬性的目的了  
      name: 'rose'
    }
  })

五、表單處理-受控組件

  • HTML中表單元素是可輸入的,即表單維護(hù)著自己的可變狀態(tài)(value)。

  • 但是在react中,可變狀態(tài)通常是保存在state中的,并且要求狀態(tài)只能通過setState進(jìn)行修改。

  • React中將state中的數(shù)據(jù)與表單元素的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 (
      <div>
        <input type="text" value={this.state.msg} onChange={this.handleChange}/>
      </div>
    )
  }
}

注意事項

使用受控組件的方式處理表單元素后,狀態(tài)的值就是表單元素的值。即:想要操作表單元素的值,只需要通過this.setState( { 要修改的部分?jǐn)?shù)據(jù) } )操作對應(yīng)的狀態(tài)即可

六、表單處理-非受控組件-ref

  • 受控組件是通過 React 組件的狀態(tài)來控制表單元素的值

  • 非受控組件是通過手動操作 DOM 的方式來控制

  • ref:用來在 React 中獲取 DOM 元素

示例代碼:

import { createRef } from 'react'

class Hello extends Component {
  txtRef = createRef()

  handleClick = () => {
    // 文本框?qū)?yīng)的 DOM 元素
    // console.log(this.txtRef.current)

    // 文本框的值:
    console.log(this.txtRef.current.value)
  }

  render() {
    return (
      <div>
        <input ref={this.txtRef} />
        <button onClick={handleClick}>獲取文本框的值</button>
      </div>
    )
  }
}

關(guān)于“react如何改變組件狀態(tài)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI