最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React生命周期與父子組件間通信知識點詳細講解

 更新時間:2022年11月28日 16:50:58   作者:_聰明勇敢有力氣  
生命周期函數(shù)指在某一時刻組件會自動調用并執(zhí)行的函數(shù)。React每個類組件都包含生命周期方法,以便于在運行過程中特定的階段執(zhí)行這些方法

聲明周期

很多的事物都有從創(chuàng)建到銷毀的整個過程,這個過程稱之為是生命周期;

React組件也有自己的生命周期,了解組件的生命周期可以讓我們在最合適的地方完成自己想要的功能;

生命周期和生命周期函數(shù)的關系:

生命周期是一個抽象的概念,在生命周期的整個過程,分成了很多個階段;

比如裝載階段(Mount),組件第一次在DOM樹中被渲染的過程;

比如更新過程(Update),組件狀態(tài)發(fā)生變化,重新更新渲染的過程;

比如卸載過程(Unmount),組件從DOM樹中被移除的過程;

React內部為了告訴我們當前處于哪些階段,會對我們組件內部實現(xiàn)的某些函數(shù)進行回調,這些函數(shù)就是生命周期函數(shù):

比如實現(xiàn)componentDidMount函數(shù):組件已經(jīng)掛載到DOM上時,就會回調;

比如實現(xiàn)componentDidUpdate函數(shù):組件已經(jīng)發(fā)生了更新時,就會回調;

比如實現(xiàn)componentWillUnmount函數(shù):組件即將被移除時,就會回調;

我們可以在這些回調函數(shù)中編寫自己的邏輯代碼,來完成自己的需求功能;

我們談React生命周期時,主要談的類的生命周期,因為函數(shù)式組件是沒有生命周期函數(shù)的

聲明周期解析

我們先來了解一下最基礎、最常用的生命周期函數(shù):

生命周期函數(shù)

class HelloWorld extends React.Component {
  // 1.構造方法: constructor
  constructor() {
    console.log("HelloWorld constructor")
    super()
    this.state = {
      message: "Hello World"
    }
  }
  changeText() {
    this.setState({ message: "你好啊, 李銀河" })
  }
  // 2.執(zhí)行render函數(shù)
  render() {
    console.log("HelloWorld render")
    const { message } = this.state
    return (
      <div>
        <h2>{message}</h2>
        <p>{message}是程序員的第一個代碼!</p>
        <button onClick={e => this.changeText()}>修改文本</button>
      </div>
    )
  }
  // 3.組件被渲染到DOM: 被掛載到DOM
  componentDidMount() {
    console.log("HelloWorld componentDidMount")
  }
  // 4.組件的DOM被更新完成: DOM發(fā)生更新
  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log("HelloWorld componentDidUpdate:", prevProps, prevState, snapshot)
  }
  // 5.組件從DOM中卸載掉: 從DOM移除掉
  componentWillUnmount() {
    console.log("HelloWorld componentWillUnmount")
  }
  // 不常用的生命周期補充
  shouldComponentUpdate() {
    return true
  }
  getSnapshotBeforeUpdate() {
    console.log("getSnapshotBeforeUpdate")
    return {
      scrollPosition: 1000
    }
  }
}

Constructor

如果不初始化 state 或不進行方法綁定,則不需要為 React 組件實現(xiàn)構造函數(shù)。

constructor中通常只做兩件事情:

通過給 this.state 賦值對象來初始化內部的state;

為事件綁定實例(this);

componentDidMount

componentDidMount() 會在組件掛載后(插入 DOM 樹中)立即調用。

componentDidMount中通常進行哪里操作呢?

依賴于DOM的操作可以在這里進行;

在此處發(fā)送網(wǎng)絡請求就最好的地方;(官方建議)

可以在此處添加一些訂閱(會在componentWillUnmount取消訂閱);

componentDidUpdate

componentDidUpdate() 會在更新后會被立即調用,首次渲染不會執(zhí)行此方法。

當組件更新后,可以在此處對 DOM 進行操作;

如果你對更新前后的 props 進行了比較,也可以選擇在此處進行網(wǎng)絡請求;(例如,當 props 未發(fā)生變化時,則不會執(zhí)行網(wǎng)絡請求)。

componentWillUnmount

componentWillUnmount() 會在組件卸載及銷毀之前直接調用。

在此方法中執(zhí)行必要的清理操作;

例如,清除 timer,取消網(wǎng)絡請求或清除在 componentDidMount() 中創(chuàng)建的訂閱等;

不常用的生命周期函數(shù)

除了上面介紹的生命周期函數(shù)之外,還有一些不常用的生命周期函數(shù):

getDerivedStateFromProps:state 的值在任何時候都依賴于 props時使用;該方法返回一個對象來更新state;

getSnapshotBeforeUpdate:在React更新DOM之前回調的一個函數(shù),可以獲取DOM更新前的一些信息(比如說滾動位置);

shouldComponentUpdate:該生命周期函數(shù)很常用,但是我們等待講性能優(yōu)化時再來詳細講解;

另外,React中還提供了一些過期的生命周期函數(shù),這些函數(shù)已經(jīng)不推薦使用。

認識組件間的通信

在開發(fā)過程中,我們會經(jīng)常遇到需要組件之間相互進行通信:

比如App可能使用了多個Header,每個地方的Header展示的內容不同,那么我們就需要使用者傳遞給Header一些數(shù)據(jù),讓其進行展示;

又比如我們在Main中一次性請求了Banner數(shù)據(jù)和ProductList數(shù)據(jù),那么就需要傳遞給他們來進行展示;

也可能是子組件中發(fā)生了事件,需要由父組件來完成某些操作,那就需要子組件向父組件傳遞事件;

總之,在一個React項目中,組件之間的通信是非常重要的環(huán)節(jié);

父組件在展示子組件,可能會傳遞一些數(shù)據(jù)給子組件:

父組件通過 屬性=值 的形式來傳遞給子組件數(shù)據(jù);

子組件通過 props 參數(shù)獲取父組件傳遞過來的數(shù)據(jù);

參數(shù)propTypes

對于傳遞給子組件的數(shù)據(jù),有時候我們可能希望進行驗證,特別是對于大型項目來說:

當然,如果你項目中默認繼承了Flow或者TypeScript,那么直接就可以進行類型驗證;

但是,即使我們沒有使用Flow或者TypeScript,也可以通過 prop-types 庫來進行參數(shù)驗證;

從 React v15.5 開始,React.PropTypes 已移入另一個包中:prop-types 庫

import PropTypes from 'prop-types';
MyComponent.propTypes = {
  // 你可以將屬性聲明為 JS 原生類型,默認情況下
  // 這些屬性都是可選的。
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,
  // 任何可被渲染的元素(包括數(shù)字、字符串、元素或數(shù)組)
  // (或 Fragment) 也包含這些類型。
  optionalNode: PropTypes.node,
  // 一個 React 元素。
  optionalElement: PropTypes.element,
  // 一個 React 元素類型(即,MyComponent)。
  optionalElementType: PropTypes.elementType,
  // 你也可以聲明 prop 為類的實例,這里使用
  // JS 的 instanceof 操作符。
  optionalMessage: PropTypes.instanceOf(Message),
  // 你可以讓你的 prop 只能是特定的值,指定它為
  // 枚舉類型。
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),
  // 一個對象可以是幾種類型中的任意一個類型
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),
  // 可以指定一個數(shù)組由某一類型的元素組成
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
  // 可以指定一個對象由某一類型的值組成
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),
  // 可以指定一個對象由特定的類型值組成
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),
  // An object with warnings on extra properties
  optionalObjectWithStrictShape: PropTypes.exact({
    name: PropTypes.string,
    quantity: PropTypes.number
  }),
  // 你可以在任何 PropTypes 屬性后面加上 `isRequired` ,確保
  // 這個 prop 沒有被提供時,會打印警告信息。
  requiredFunc: PropTypes.func.isRequired,
  // 任意類型的必需數(shù)據(jù)
  requiredAny: PropTypes.any.isRequired,
  // 你可以指定一個自定義驗證器。它在驗證失敗時應返回一個 Error 對象。
  // 請不要使用 `console.warn` 或拋出異常,因為這在 `oneOfType` 中不會起作用。
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },
  // 你也可以提供一個自定義的 `arrayOf` 或 `objectOf` 驗證器。
  // 它應該在驗證失敗時返回一個 Error 對象。
  // 驗證器將驗證數(shù)組或對象中的每個值。驗證器的前兩個參數(shù)
  // 第一個是數(shù)組或對象本身
  // 第二個是他們當前的鍵。
  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

限制單個元素

你可以通過 PropTypes.element 來確保傳遞給組件的 children 中只包含一個元素。

import PropTypes from 'prop-types';
class MyComponent extends React.Component {
  render() {
    // 這必須只有一個元素,否則控制臺會打印警告。
    const children = this.props.children;
    return (
      <div>
        {children}
      </div>
    );
  }
}
MyComponent.propTypes = {
  children: PropTypes.element.isRequired
};

默認 Prop 值

您可以通過配置特定的 defaultProps 屬性來定義 props 的默認值:

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}
// 指定 props 的默認值:
Greeting.defaultProps = {
  name: 'Stranger'
};
// 渲染出 "Hello, Stranger":
const root = ReactDOM.createRoot(document.getElementById('example')); 
root.render(<Greeting />);

從 ES2022 開始,你也可以在 React 類組件中將 defaultProps 聲明為靜態(tài)屬性。這種現(xiàn)代語法需要添加額外的編譯步驟才能在老版瀏覽器中工作。

class Greeting extends React.Component {
  static defaultProps = {
    name: 'stranger'
  }
  render() {
    return (
      <div>Hello, {this.props.name}</div>
    )
  }
}

defaultProps 用于確保 this.props.name 在父組件沒有指定其值時,有一個默認值。propTypes 類型檢查發(fā)生在 defaultProps 賦值后,所以類型檢查也適用于 defaultProps

對于函數(shù)式組件

如果你在常規(guī)開發(fā)中使用函數(shù)組件,那你可能需要做一些適當?shù)母膭?,以保證 PropsTypes 應用正常。

假設你有如下組件:

export default function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}

如果要添加 PropTypes,你可能需要在導出之前以單獨聲明的一個函數(shù)的形式,聲明該組件,具體代碼如下:

function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}
export default HelloWorldComponent

接著,可以直接在 HelloWorldComponent 上添加 PropTypes:

import PropTypes from 'prop-types'
function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}
HelloWorldComponent.propTypes = {
  name: PropTypes.string
}
export default HelloWorldComponent

子組件傳遞父組件

某些情況,我們也需要子組件向父組件傳遞消息:

在vue中是通過自定義事件來完成的;

在React中同樣是通過props傳遞消息,只是讓父組件給子組件傳遞一個回調函數(shù),在子組件中調用這個函數(shù)即可;

我們這里來完成一個案例:

將計數(shù)器案例進行拆解;

將按鈕封裝到子組件中:CounterButton;

CounterButton發(fā)生點擊事件,將內容傳遞到父組件中,修改counter的值;

app.jsx

import React, { Component } from 'react'
import AddCounter from './AddCounter'
import SubCounter from './SubCounter'
export class App extends Component {
  constructor() {
    super()
    this.state = {
      counter: 100
    }
  }
  changeCounter(count) {
    this.setState({ counter: this.state.counter + count })
  }
  render() {
    const { counter } = this.state
    return (
      <div>
        <h2>當前計數(shù): {counter}</h2>
        <AddCounter addClick={(count) => this.changeCounter(count)}/>
        <SubCounter subClick={(count) => this.changeCounter(count)}/>
      </div>
    )
  }
}
export default App

subCounter.jsx

import React, { Component } from 'react'
export class SubCounter extends Component {
  subCount(count) {
    this.props.subClick(count)
  }
  render() {
    return (
      <div>
        <button onClick={e => this.subCount(-1)}>-1</button>
        <button onClick={e => this.subCount(-5)}>-5</button>
        <button onClick={e => this.subCount(-10)}>-10</button>
      </div>
    )
  }
}
export default SubCounter

addCounter.jsx

import React, { Component } from 'react'
// import PropTypes from "prop-types"
export class AddCounter extends Component {
  addCount(count) {
    this.props.addClick(count)
  }
  render() {
    return (
      <div>
        <button onClick={e => this.addCount(1)}>+1</button>
        <button onClick={e => this.addCount(5)}>+5</button>
        <button onClick={e => this.addCount(10)}>+10</button>
      </div>
    )
  }
}
// AddCounter.propTypes = {
//   addClick: PropTypes.func
// }
export default AddCounter

到此這篇關于React生命周期與父子組件間通信知識點詳細講解的文章就介紹到這了,更多相關React生命周期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React中props驗證不足的問題及解決方案

    React中props驗證不足的問題及解決方案

    在?React?開發(fā)中,props?是組件間通信的重要方式,通過?props,父組件可以向子組件傳遞數(shù)據(jù)和回調函數(shù),然而,如果對?props?的驗證不足,可能會導致類型錯誤、運行時錯誤或難以調試的問題,本文將探討?React?中?props?驗證不足的常見問題,并提供解決方案
    2025-03-03
  • react-router-dom之異步加載路由方式

    react-router-dom之異步加載路由方式

    這篇文章主要介紹了react-router-dom之異步加載路由方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Javascript之提高React性能的技巧

    Javascript之提高React性能的技巧

    一些剛開始學習 React,或者從其他框架轉入 React 的開發(fā)者,一開始可能不會太關注性能。因為需要一些時間來發(fā)現(xiàn)新學習的框架的性能缺點。這篇文章主要介紹提高React性能的技巧,感興趣的同學可以參考閱讀
    2023-04-04
  • React使用context進行跨級組件數(shù)據(jù)傳遞

    React使用context進行跨級組件數(shù)據(jù)傳遞

    這篇文章給大家介紹了React使用context進行跨級組件數(shù)據(jù)傳遞的方法步驟,文中通過代碼示例給大家介紹的非常詳細,對大家學習React context組件數(shù)據(jù)傳遞有一定的幫助,感興趣的小伙伴跟著小編一起來學習吧
    2024-01-01
  • React Native中導航組件react-navigation跨tab路由處理詳解

    React Native中導航組件react-navigation跨tab路由處理詳解

    這篇文章主要給大家介紹了關于React Native中導航組件react-navigation跨tab路由處理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • 使用React實現(xiàn)一個簡單的待辦任務列表

    使用React實現(xiàn)一個簡單的待辦任務列表

    這篇文章主要給大家介紹了使用React和Ant Design庫構建的待辦任務列表應用,它包含了可編輯的表格,用戶可以添加、編輯和完成任務,以及保存任務列表數(shù)據(jù)到本地存儲,文中有相關的代碼示例,需要的朋友可以參考下
    2023-08-08
  • react hook使用useState更新數(shù)組,無法更新問題及解決

    react hook使用useState更新數(shù)組,無法更新問題及解決

    這篇文章主要介紹了react hook使用useState更新數(shù)組,無法更新問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React Native 使用Fetch發(fā)送網(wǎng)絡請求的示例代碼

    React Native 使用Fetch發(fā)送網(wǎng)絡請求的示例代碼

    本篇文章主要介紹了React Native 使用Fetch發(fā)送網(wǎng)絡請求的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • React useState的錯誤用法避坑詳解

    React useState的錯誤用法避坑詳解

    這篇文章主要為大家介紹了React useState的錯誤用法避坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • react native仿微信PopupWindow效果的實例代碼

    react native仿微信PopupWindow效果的實例代碼

    本篇文章主要介紹了react native仿微信PopupWindow效果的實例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08

最新評論

门头沟区| 资讯 | 垦利县| 平南县| 杭州市| 秦皇岛市| 梁河县| 安义县| 马尔康县| 大荔县| 慈利县| 河池市| 杨浦区| 蒙自县| 句容市| 永寿县| 乡宁县| 怀远县| 淮安市| 仪陇县| 天镇县| 鹿泉市| 当阳市| 宽城| 泰来县| 城口县| 高雄县| 东海县| 房山区| 宜川县| 威宁| 霍山县| 桃园市| 五峰| 介休市| 罗甸县| 集贤县| 正安县| 蒙阴县| 安达市| 涟源市|