国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React之組件的分類、使用,事件對象,this指向問題,修改狀態(tài)以及受控組件與非受控組件

這篇具有很好參考價值的文章主要介紹了React之組件的分類、使用,事件對象,this指向問題,修改狀態(tài)以及受控組件與非受控組件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、組件基本介紹

  • 組件是 React 開發(fā)(現(xiàn)代前端開發(fā))中最重要的內(nèi)容
  • 組件允許你將 UI 拆分為獨立、可復用的部分,每個部分都可以獨立的思考
  • 組合多個組件(組裝樂高積木)實現(xiàn)完整的頁面功能
  • 特點:獨立、可復用、可組合
  • 組件包含三部分:HTML/CSS/JS
  • 展示頁面中的可復用部分

二、組件創(chuàng)建

2.1 函數(shù)組件

  • 函數(shù)組件:使用JS的函數(shù)或者箭頭函數(shù)創(chuàng)建的組件
    • 使用 JS 的函數(shù)(或箭頭函數(shù))創(chuàng)建的組件,叫做函數(shù)組件
    • 約定1:函數(shù)名稱必須以大寫字母開頭,React 據(jù)此區(qū)分組件和普通的 HTML標簽
    • 約定2:函數(shù)組件必須有返回值,表示該組件的 UI 結(jié)構(gòu);如果不需要渲染任何內(nèi)容,則返回 null
  • 使用函數(shù)創(chuàng)建組件
// 使用普通函數(shù)創(chuàng)建組件:
function Hello() {
  return <div>這是我的第一個函數(shù)組件!</div>
}
function Button() {
  return <button>按鈕</button>
}

// 使用箭頭函數(shù)創(chuàng)建組件:
const Hello = () => <div>這是我的第一個函數(shù)組件!</div>
  • 使用組件
    • 組件就像 HTML 標簽一樣可以被渲染到頁面中。組件表示的是一段結(jié)構(gòu)內(nèi)容,對于函數(shù)組件來說,渲染的內(nèi)容是函數(shù)返回值對應的內(nèi)容
    • 使用函數(shù)名稱作為組件標簽名稱
// 使用 雙標簽 渲染組件:
<Hello></Hello>
ReactDOM.render(<Hello></Hello>, root)

// 使用 單標簽 渲染組件:
<Hello />
ReactDOM.createRoot(document.querySelector('#root')).render(<Hello></Hello>)

小結(jié)

  1. 在react中可以使用函數(shù)或者箭頭函數(shù)創(chuàng)建組件
  2. 組件的首字母必須大寫

2.2 類組件

內(nèi)容

  • 使用 ES6 的 class 創(chuàng)建的組件,叫做類(class)組件
  • 約定1:類名稱也必須以大寫字母開頭
  • 約定2:類組件應該繼承 React.Component 父類,從而使用父類中提供的方法或?qū)傩?/li>
  • 約定3:類組件必須提供 render 方法
  • 約定4:render 方法必須有返回值,表示該組件的 UI 結(jié)構(gòu)

定義組件

// 導入 React
import React from 'react'
class Hello extends React.Component {
  render() {
    return <div>Hello Class Component!</div> 
  }
}
ReactDOM.render(<Hello />, root)

// 只導入 Component
import { Component } from 'react'
class Hello extends Component {
  render() {
    return <div>Hello Class Component!</div> 
  }
}

使用組件

ReactDOM.createRoot(document.querySelector('#root')).render(<Hello></Hello>)

總結(jié)

  1. 使用class語法創(chuàng)建組件比函數(shù)創(chuàng)建稍微麻煩一些,但是類組件的功能會比函數(shù)組件的功能更加強大(hooks 之前

三、將組件提取到單獨的js文件中

實現(xiàn)方式

  1. 創(chuàng)建 Hello.js
  2. 創(chuàng)建組件(函數(shù) 或 類)
  3. 在 Hello.js 中導出該組件
  4. 在 index.js 中導入 Hello 組件
  5. 渲染組件

核心代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-604878.html

// index.js
//直接導入
import Hello from './Hello'

//按需導入
// import {Hello} from './Hello'

// 渲染導入的Hello組件
ReactDOM.createRoot(document.querySelector('#root')).render(<Hello></Hello>)


// Hello.js
import { Component } from 'react'
class Hello extends Component {
  render() {
    return <div>Hello Class Component!</div>
  }
}
// 導出Hello組件(默認導出)
export default Hello

//按需導出
// export {
//	Hello
// }

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

內(nèi)容

  • 函數(shù)組件又叫做無狀態(tài)組件 函數(shù)組件是不能自己提供數(shù)據(jù)【前提:不考慮 hooks 的情況下】
  • 類組件又叫做有狀態(tài)組件 類組件可以自己提供數(shù)據(jù)
  • 狀態(tài)state是組件的私有數(shù)據(jù),當組件的狀態(tài)發(fā)生了改變,頁面結(jié)構(gòu)也就發(fā)生了改變(數(shù)據(jù)驅(qū)動視圖
  • 函數(shù)組件是沒有狀態(tài)的,只負責頁面的展示態(tài),不會發(fā)生變化),性能比較高
  • 類組件有自己的狀態(tài),負責更新UI,只要類組件的數(shù)據(jù)發(fā)生了改變,UI 就會發(fā)生更新態(tài))
  • 在項目中,一般都是由函數(shù)組件和類組件共同配合來完成的

比如計數(shù)器案例,點擊按鈕讓數(shù)值+1, 0和1就是不同時刻的狀態(tài),當狀態(tài)從0變成1之后,UI也要跟著發(fā)生變化。React想要實現(xiàn)這種功能,就需要使用有狀態(tài)組件來完成。

  • 函數(shù)組件和類組件的區(qū)別:有沒有狀態(tài)【前提:不考慮 hooks 的情況下】

五、類組件的狀態(tài)

內(nèi)容

  • 狀態(tài)state,即數(shù)據(jù),是組件內(nèi)部的私有數(shù)據(jù),只能在組件內(nèi)部使用
  • 狀態(tài) state 的值是對象,表示一個組件中可以有多個數(shù)據(jù)
  • 通過 this.state.xxx 來獲取狀態(tài)

核心代碼

  • 創(chuàng)建 state
class Hello extends Component {
  // 為組件提供狀態(tài)
  state = {
    count: 0,
    list: [],
    isLoading: true
  }

  render() {
    return (
      <div>計數(shù)器</div>
    )
  }
}
  • 讀取狀態(tài):通過 this.state 來獲取狀態(tài)
class Hello extends Component {
  // ...
  render() {
    // 通過 this.state 來訪問類組件的狀態(tài)
    return (
      <div>計數(shù)器:{this.state.count}</div>
    )
  }
}

六、事件處理

6.1 注冊事件

內(nèi)容

  • React注冊事件與DOM的事件語法非常像

  • 語法on+事件名 ={事件處理程序} 比如onClick={this.handleClick}

  • 注意:React事件采用駝峰命名法,比如onMouseEnter, onClick

核心代碼

class App extends React.Component {
  handleClick() {
    console.log('點擊事件觸發(fā)')
  }
  
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>點我</button>
      </div>
    )
  }
}

6.2 事件對象

核心代碼

  • 可以通過事件處理程序的參數(shù)獲取到事件對象
  • 注意:React 中的事件對象是 React 內(nèi)部處理后的事件對象,一般稱為:SyntheticBaseEvent 合成事件對象。用法與 DOM 原生的事件對象用法基本一致
function handleClick(e) {
  e.preventDefault()
  console.log('事件對象', e)
}

<a onClick={this.handleClick}>點我,不會跳轉(zhuǎn)頁面</a>

6.3 this指向問題

內(nèi)容:

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

  • render方法中的this指向的是當前react組件。只有事件處理程序中的this有問題

  • 原因

    • 事件處理程序的函數(shù)式函數(shù)調(diào)用模式,在嚴格模式下,this指向undefined
    • render函數(shù)是被組件實例調(diào)用的,因此render函數(shù)中的this指向當前組件
class App extends React.Component {
  state = {
    msg: 'hello react'
  }
  handleClick() {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>點我</button>
      </div>
    )
  }
}

總結(jié)

  1. 在react的事件處理函數(shù)中,this指向undefined

6.4 this指向解決方案

內(nèi)容

  • 解決事件處理程序中this指向問題主要有三種方式

  • 方式1:箭頭函數(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>
    )
  }
}
  • 方式2:bind
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:箭頭函數(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>
    )
  }
}

總結(jié)

  1. 推薦使用方式3,箭頭函數(shù)形式的實例方法
  • 解釋為什么方式3可以解決 this 指向問題:
// ES6
class Person1 {
  // 類的 構(gòu)造函數(shù)
  constructor() {
    // 構(gòu)造函數(shù)中的 this 就是實例對象
    console.log(this)
    this.name = 'jack'
    this.fn = () => {
      console.log(this)
    }
  }

  // 上述寫法簡化語法:
  // name = 'jack'
  // fn = () => {}

  // 這個形式的方法會被添加到原型中
  sayHi() {}
}

說明:

fn = () => {}  這種形式的語法是簡化語法(語法糖),書寫會更簡單。實際上,完整的寫法是:

constructor() {
  this.fn = () => {}
}

即:在構(gòu)造函數(shù)中,給 this 添加了一個方法 fn

為什么可以解決 this 指向問題呢?
因為 constructor 中創(chuàng)建的箭頭函數(shù),內(nèi)部的 this 會指向 constructor 中的 this
而 constructor 中的 this 就是實例對象(也就是我們需要的 this

七、setState 修改狀態(tài)

內(nèi)容

  • 語法:this.setState({ 要修改的部分數(shù)據(jù) })
  • setState() 作用:1 修改 state 2 更新 UI
  • 思想:數(shù)據(jù)驅(qū)動視圖,也就是只需要修改數(shù)據(jù)(狀態(tài))那么頁面(視圖)就會自動刷新
    • 核心:數(shù)據(jù)?。。?/li>
    • 從現(xiàn)在開始,我們關(guān)心的是如何修改數(shù)據(jù),而不再是關(guān)心如何修改DOM
    • 并且,注意:盡量避免直接手動 DOM(通過 document.querySelector() 獲取到到DOM對象然后再操作) 操作?。?!
  • 注意:不要直接修改 state 中的值,這是無效的!

核心代碼

class Hello extends Component {
  state = {
    count: 0
  }

	handleClick = () => {
    this.setState({
      count: 10
    })
  }  

  render() {
    return (
      <div>
        <h1>計數(shù)器:{this.state.count}</h1>
        <button onClick={this.handleClick}>+1</button>
      </div>
    )
  }
}

// 在 count 當前值的基礎上加 1
this.setState({
  count: this.state.count + 10
})

總結(jié)

  1. 能直接修改 state 的值嗎?不能
  2. 如何修改 React 組件中的狀態(tài)?setState()
  3. setState 是哪來的?從 Component 父類繼承過來的

八、react核心理念(狀態(tài)不可變)

內(nèi)容:

  • 狀態(tài)不可變指的是:不要直接修改狀態(tài)的值,而是基于當前狀態(tài)創(chuàng)建新的狀態(tài)值

核心代碼

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

// 只要是數(shù)組中直接修改當前數(shù)組的方法都不能用!
this.state.list.push(123)

this.state.person.name = 'rose'

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

九、表單處理

9.1 受控組件

內(nèi)容

  • HTML中表單元素是可輸入的,即表單元素維護著自己的可變狀態(tài)(value)
  • 但是在react中,可變狀態(tài)通常是保存在state中的,并且要求狀態(tài)只能通過setState進行修改
  • React中將state中的數(shù)據(jù)與表單元素的value值綁定到了一起,由state的值來控制表單元素的值
  • 受控組件:value值受到了react狀態(tài)控制的表單元素

核心代碼:

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

  handleChange = (e) => {
    this.setState({
      msg: e.target.value
    })
  }

  render() {
    return (
      <div>
        <input type="text" value={this.state.msg} onChange={this.handleChange}/>
      </div>
    )
  }
}

總結(jié)

  1. 使用受控組件的方式處理表單元素后,狀態(tài)的值就是表單元素的值。即:想要操作表單元素的值,只需要操作對應的狀態(tài)即可*

9.2 非受控組件-ref

非受控組件借助于ref,使用原生DOM的方式來獲取表單元素的值
內(nèi)容

  • 受控組件是通過 React 組件的狀態(tài)來控制表單元素的值
  • 非受控組件是通過手動操作 DOM 的方式來控制
  • 此時,需要用到一個新的概念:ref
  • ref:用來在 React 中獲取 DOM 元素

核心代碼

// 1 導入 createRef 函數(shù)( 用來創(chuàng)建 ref 對象 )
import { createRef } from 'react'

class Hello extends Component {
  // 2 調(diào)用 createRef 函數(shù)來創(chuàng)建一個 ref 對象
  //   ref 對象的名稱(txtRef)可以是任意值
  //   命名要規(guī)范: txt(DOM 元素的自己標識) + Ref
  txtRef = createRef()

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

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

  render() {
    return (
      <div>
        {/*
        	3 將創(chuàng)建好的 ref 對象,設置為 input 標簽的 ref 屬性值
        		作用:將 ref 和 input DOM 綁定到一起,將來在通過 this.txtRef 拿到的就是當前 DOM 對象
        */}
        <input ref={this.txtRef} />
        <button onClick={this.handleClick}>獲取文本框的值</button>
      </div>
    )
  }
}

到了這里,關(guān)于React之組件的分類、使用,事件對象,this指向問題,修改狀態(tài)以及受控組件與非受控組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關(guān)文章

  • this指向性問題

    this指向性問題

    this的查找規(guī)則會逐層往上查找,最終位全局window 優(yōu)先級問題:顯式綁定(顯式綁定與new綁定沒有可比性)new綁定隱式綁定默認綁定 在編程中,this 是一個,代表當前對象或者函數(shù)的執(zhí)行環(huán)境。this 的指向性問題是指在不同的情況下,this 指向的對象不同,從而影響代碼的

    2024年02月11日
    瀏覽(22)
  • 前端面試——關(guān)于this指向問題?

    想要知道關(guān)于this的指向問題,首先要了解this的綁定規(guī)則。那么this到底是什么樣的綁定規(guī)則呢?一起來研究一下吧! 綁定一:默認綁定 綁定二:飲食綁定 綁定三:顯示綁定 綁定四:隱式綁定 什么情況下使用默認綁定呢?獨立函數(shù)調(diào)用。獨立的函數(shù)調(diào)用我們可以理解成函數(shù)

    2024年01月25日
    瀏覽(22)
  • web前端開發(fā)this指向問題

    ? 函數(shù)內(nèi)部中的 this 指向誰,不是在函數(shù)定義時決定的,而是在函數(shù)第一次調(diào)用并執(zhí)行的時候決定的 1. call 方法 語法:函數(shù)名.call(調(diào)用者, 參數(shù)1, …) 作用:函數(shù)被借用時,會立即執(zhí)行,并且函數(shù)體內(nèi)的this會指向借用者或調(diào)用者 function fn(name, age) { ? ? this.name = name; ? ? thi

    2024年02月21日
    瀏覽(16)
  • 【面試必考點】這一次帶你徹底學會this的指向問題

    【面試必考點】這一次帶你徹底學會this的指向問題

    相信很多朋友和我一樣,總是搞不清this的指向關(guān)系,由于沒有硬性要求,所以又總是不想學習,經(jīng)過兩次面試后,筆者發(fā)現(xiàn)這個考點真是 面試官常考的點 , 大家靜下心來一起學習這篇this的指向吧! 文章主體內(nèi)容分為兩塊:this的指向以及如何改變this的指向 全局的this指向

    2024年02月13日
    瀏覽(19)
  • react自定義組件間的傳值,if..else..判斷,for循環(huán)(嵌套map使用),點擊事件(Onclick),頁面上事件實事傳遞參數(shù)(基礎版)

    9.自定義組件間的傳值 10.if..else..判斷 11.for循環(huán)(嵌套map使用) 12.點擊事件(Onclick) 13.頁面上事件實事傳遞參數(shù) 14.關(guān)于export default function App()與export function App()的區(qū)別 ? ?export default不需要{} ? ? ?import ?Gallery from \\\'./Gallery.js\\\'; ? ?export function需要{} ? ? ? import {Gallery} from \\\'./Galler

    2024年01月17日
    瀏覽(29)
  • vue3中父組件與組件之間參數(shù)傳遞,使用(defineProps/defineEmits),涉及屬性傳遞,對象傳遞,數(shù)組傳遞,以及事件傳遞

    傳遞屬性 父組件: 子組件: 傳遞對象或者數(shù)組 父組件: 子組件: 父組件: 子組件:

    2024年02月13日
    瀏覽(21)
  • react hooks 中使用 addEventListener 監(jiān)聽事件無法訪問到最新的 state 的問題

    如上述代碼所示,props.asyncData 變化之后 hasAsyncData 設置為 true,然后滾動頁面,handleMove 中的 hasAsyncData 仍然為初始值 false。 所以這時要在 hasAsyncData 變化后 ,重新綁定 addEventListener 事件 useEffect(() = { ? }, [hasAsyncData]) 在useEffect中將他監(jiān)聽起來,從新綁定

    2024年01月21日
    瀏覽(20)
  • JS中this的指向

    JS中this的指向

    this永遠指向一個對象 this的指向完全取決于函數(shù)調(diào)用的位置 JavaScript支持運行環(huán)境動態(tài)切換,this的指向是動態(tài)的 全局上下文(Global Context) 在全局執(zhí)行環(huán)境中(在任何函數(shù)體外部),this都是指向全局對象,在瀏覽器中,window對象即是全局對象。 函數(shù)上下文(Function Context)

    2024年02月07日
    瀏覽(26)
  • JavaScript全解析——this指向

    本系列內(nèi)容為JS全解析,為千鋒教育資深前端老師獨家創(chuàng)作 致力于為大家講解清晰JavaScript相關(guān)知識點,含有豐富的代碼案例及講解。如果感覺對大家有幫助的話,可以【點個關(guān)注】持續(xù)追更~ this 是一個,是一個使用在作用域內(nèi)的 作用域分為 全局作用域和局部作

    2024年02月03日
    瀏覽(20)
  • 箭頭函數(shù)的 this 指向哪里?

    箭頭函數(shù)不同于傳統(tǒng) JS 中的函數(shù),箭頭函數(shù)并沒有屬于自己的 this,他所謂的 this 是捕獲其所在上下文的 this 值,作為自己的 this 值,并且由于沒有屬于自己的 this,所以是不會被 new 調(diào)用的,這個所謂的 this 也不會被改變??梢杂?Babel 理解一下箭頭函數(shù):

    2023年04月26日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包