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

React在組件中如何監(jiān)聽redux中state狀態(tài)的改變

 更新時間:2022年08月08日 10:42:34   作者:承蒙時光不棄1769203735  
這篇文章主要介紹了React在組件中如何監(jiān)聽redux中state狀態(tài)的改變,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在組件中監(jiān)聽redux中state狀態(tài)的改變

解決方式

1、在組件中引入store

2、在constructor構(gòu)造器方法中,重寫store.subscribe方法(該方法即是監(jiān)聽state狀態(tài)改變的放過)

組件完整代碼如下: 

import React, { Component } from 'react'
import CSSModules from 'react-css-modules'?
import { connect } from 'react-redux'
import store from '../../redux/store'?
import styles from './BgMusic.css'
?
@CSSModules(styles)
class BgMusic extends Component {
? // 構(gòu)造器
? constructor(props) {
? ? super(props)
? ? console.log('執(zhí)行了constructor')
? ? // 監(jiān)聽state狀態(tài)改變
? ? store.subscribe(() => {
? ? ? console.log('state狀態(tài)改變了,新狀態(tài)如下')
? ? ? console.log(store.getState())
? ? ? const state = store.getState()
? ? ? if (state.music.play) {
? ? ? ? // 播放背景音樂
? ? ? ? this.audio1.play()
? ? ? }
? ? ? else {
? ? ? ? // 暫停背景音樂
? ? ? ? this.audio1.pause()
? ? ? }
? ? })
? }
? render() {
? ? return (
? ? ? <div className={styles.container}>
? ? ? ? <audio ref={audio1 => { this.audio1 = audio1 }} className={styles.hidden} autoPlay="autoplay" controls="controls" loop="loop" preload="auto" src="./music/music.mp3">
? ? ? ? ? ? 你的瀏覽器版本太低,不支持audio標(biāo)簽
? ? ? ? </audio>
? ? ? </div>
? ? )
? }
}
export default connect(
? // 這里的state,就是公共容器中的state,而不是當(dāng)前組件的state。在這里定義了之后,在當(dāng)前組件中,就可以通過this.props.music拿到該對象
? state => ({ music: state.music }),
)(BgMusic)

React和redux的狀態(tài)處理

我們知道react中state是組件更新的唯一指標(biāo),并且只能通過組件的this.setState方法觸發(fā)組件的重新渲染。這種形式導(dǎo)致了一個組件A想要觸發(fā)另一個組件B更新,就必須觸發(fā)組件B內(nèi)部的this.setState。一般是通過一開始就在B中設(shè)置委托到組件A中。

例如: 

class B extends React.Component{
    state={key:"value"}
    handle(){
        this.setState({key:"newvalue"})
    }
    render(){
        return <div> 
                <A onOk=>{this.handle.bind(this)}/>
                <span>{this.state.key}</span>
            </div>
    }
}
class A extends React.Component{
    render(){return <button onClick={this.props.onOk}>click</button>}
}

這樣也就隱形的要求B組件必須是A組件的父組件,換句話說:如果一個組件想要觸發(fā)另一個組件的更新,需要觸發(fā)者是被觸發(fā)者的子組件。 父組件可以將更新的函數(shù)預(yù)先定好,作為屬性傳入子組件中,這樣子組件中調(diào)用這個屬性函數(shù)就觸發(fā)了父組件的更新,本質(zhì)是父組件將自己的一個函數(shù)委托給子組件處理。

當(dāng)組件變得又多又復(fù)雜的時候,可能需要跨越好多層父子關(guān)系來傳遞這個閉包,這使得狀態(tài)的管理非常復(fù)雜。

這里寫圖片描述

例如這種情況下,C想要觸發(fā)A.setState,那就需要A先封好閉包作為屬性傳給B,B再傳給C,C在合適的時機(jī)調(diào)用。調(diào)用完了,A的setState會引起所有的子組件重新render。

如果C想要觸發(fā)D的更新,則也需要A作為中介,將D中要更新的部分拿出來,作為props由A來傳入,這樣還是按照之前的做法,C可以引起A的render,進(jìn)而導(dǎo)致了所有組件render,也就包括了D。不過其實我們只想要D更新,其他組件并不需要更新。而且我們看到state的存儲很亂,有時候我們將state存到本組件中,由自己掌握更新的時機(jī),有時候需要交給父組件來掌握,此時子組件是無狀態(tài)的,所有數(shù)據(jù)由父組件通過props傳入。

這種方式無論從閉包傳遞還是過多的組件render上都是不好的,我們思考能不能通過更高效的方式完成這件事。首先是閉包傳遞,其實本質(zhì)上是A把更新這件事放到一個函數(shù)中,然后把該函數(shù)作為屬性傳遞給了子組件。我們可以這樣來做,在A中設(shè)置一個事件監(jiān)聽器當(dāng)事件觸發(fā)的時候就更新狀態(tài),而在C中設(shè)置一個事件激發(fā)當(dāng)合適的時機(jī)(如點擊按鈕)觸發(fā)這個事件,這樣就完成了直接觸發(fā)另一個組件的更新。這樣每個組件都有自己的state,并且都監(jiān)聽一個自己特定的事件,如果事件觸發(fā),就相應(yīng)的調(diào)用setState完成自己的更新。

Redux就是這種思路,核心概念是store,所有組件ABCDE的state都存到了store.state中,這個變量只能通過觸發(fā)action才能改變,并且專門定義了這種根據(jù)action更新store.state值的函數(shù)叫reducer。當(dāng)然了改變了這個變量的值對我們整個react應(yīng)用沒有任何影響,還需要把這個值和每個組件內(nèi)的state關(guān)聯(lián)起來。每個組件中都有一個store.subcribe(func),即每個組件都可以監(jiān)聽這個store.state的變化,如果變化就觸發(fā)這個函數(shù),然后可以看變量中是不是和自己相關(guān)的例如可以在store中這樣存儲{a:xxx,b:xx,c:xx,d:xx}這樣A只需要檢查store.getState().a是不是有變。

如下:

這里寫圖片描述

上圖中,其實ABCD的回調(diào)函數(shù)都會觸發(fā),只不過觸發(fā)后有個判斷,只有D的發(fā)生了變化,所以只有D進(jìn)行后續(xù)setState和render操作。

Redux的思想是這樣的,首先state全都交到store中來保存,每個組件訂閱store的變化,一但發(fā)生變化,就把自己的state同步。store的變化由action這種方式唯一觸發(fā),管理起來也方便。不過Subscribe寫起來太麻煩了,所以ReactRedux模塊提供了Provider 和connect,可以很方便的完成自動Subscribe和自動封裝無狀態(tài)組件為有邏輯的組件,這種情況下我們只要寫無狀態(tài)組件,省了很多工作量。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • react中useEffect函數(shù)的詳細(xì)用法(最新推薦)

    react中useEffect函數(shù)的詳細(xì)用法(最新推薦)

    useEffect是React中的一個Hook,用于在函數(shù)組件中處理副作用(如數(shù)據(jù)獲取、訂閱、手動更改 DOM 等),useEffect屬于組件的生命周期方法,下面通過本文給大家分享react中useEffect函數(shù)的詳細(xì)用法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • React Fiber樹的構(gòu)建和替換過程講解

    React Fiber樹的構(gòu)建和替換過程講解

    React Fiber樹的創(chuàng)建和替換過程運(yùn)用了雙緩存技術(shù),直接將舊的 fiber 樹替換成新的 fiber 樹,這樣做的好處是省去了直接在頁面上渲染時的計算時間,避免計算量大導(dǎo)致的白屏、卡頓,現(xiàn)在你一定還不太理解,下面進(jìn)行詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • React之echarts-for-react源碼解讀

    React之echarts-for-react源碼解讀

    這篇文章主要介紹了React之echarts-for-react源碼解讀,echarts-for-react的源碼非常精簡,本文將針對主要邏輯分析介紹,需要的朋友可以參考下
    2022-10-10
  • 使用useEffect模擬組件生命周期

    使用useEffect模擬組件生命周期

    這篇文章主要介紹了使用useEffect模擬組件生命周期,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 基于React.js實現(xiàn)簡單的文字跑馬燈效果

    基于React.js實現(xiàn)簡單的文字跑馬燈效果

    剛好手上有一個要實現(xiàn)文字跑馬燈的react項目,然后ant-design上面沒有這個組件,于是只能自己手?jǐn)]一個,文中的實現(xiàn)方法講解詳細(xì),希望對大家有所幫助
    2023-01-01
  • React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制

    React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制

    這篇文章主要為大家介紹了React使用highlight.js Clipboard.js實現(xiàn)代碼高亮復(fù)制功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 老生常談js-react組件生命周期

    老生常談js-react組件生命周期

    下面小編就為大家?guī)硪黄仙U刯s-react組件生命周期。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • React?程序設(shè)計簡單的輕量級自動完成搜索框應(yīng)用

    React?程序設(shè)計簡單的輕量級自動完成搜索框應(yīng)用

    這篇文章主要為大家介紹了React?程序設(shè)計簡單的輕量級自動完成搜索框應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 淺談React的React.FC與React.Component的使用

    淺談React的React.FC與React.Component的使用

    本文主要介紹了React的React.FC與React.Component的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • React開啟代理的2種實用方式

    React開啟代理的2種實用方式

    最近有不少伙伴詢問react的代理配置,自己也去試驗了一下發(fā)現(xiàn)不少的問題,在這就將所遇到的心得分享出來,這篇文章主要給大家介紹了關(guān)于React開啟代理的2種實用方式的相關(guān)資料,需要的朋友可以參考下
    2021-07-07

最新評論

壤塘县| 老河口市| 措勤县| 新巴尔虎右旗| 洛扎县| 信阳市| 双鸭山市| 惠水县| 玉环县| 晋中市| 六枝特区| 读书| 射洪县| 高尔夫| 曲阜市| 南投县| 和林格尔县| 永顺县| 玉门市| 邳州市| 胶南市| 洪雅县| 惠来县| 容城县| 黄骅市| 清苑县| 丰原市| 平山县| 通化县| 浦江县| 上虞市| 延边| 河北区| 承德市| 施秉县| 辰溪县| 东莞市| 汨罗市| 运城市| 洱源县| 新田县|