返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React在组件中如何监听redux中state状态的改变
  • 454
分享到

React在组件中如何监听redux中state状态的改变

React组件监听state的改变监听redux中state改变 2022-11-13 14:11:51 454人浏览 独家记忆
摘要

目录在组件中监听redux中state状态的改变解决方式React和redux的状态处理在组件中监听redux中state状态的改变 解决方式 1、在组件中引入store 2、在co

在组件中监听redux中state状态的改变

解决方式

1、在组件中引入store

2、在constructor构造器方法中,重写store.subscribe方法(该方法即是监听state状态改变的放过)

组件完整代码如下: 

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 {
  // 构造器
  constructor(props) {
    super(props)
    console.log('执行了constructor')
    // 监听state状态改变
    store.subscribe(() => {
      console.log('state状态改变了,新状态如下')
      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标签
        </audio>
      </div>
    )
  }
}
export default connect(
  // 这里的state,就是公共容器中的state,而不是当前组件的state。在这里定义了之后,在当前组件中,就可以通过this.props.music拿到该对象
  state => ({ music: state.music }),
)(BgMusic)

React和redux的状态处理

我们知道react中state是组件更新的唯一指标,并且只能通过组件的this.setState方法触发组件的重新渲染。这种形式导致了一个组件A想要触发另一个组件B更新,就必须触发组件B内部的this.setState。一般是通过一开始就在B中设置委托到组件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组件的父组件,换句话说:如果一个组件想要触发另一个组件的更新,需要触发者是被触发者的子组件。 父组件可以将更新的函数预先定好,作为属性传入子组件中,这样子组件中调用这个属性函数就触发了父组件的更新,本质是父组件将自己的一个函数委托给子组件处理。

当组件变得又多又复杂的时候,可能需要跨越好多层父子关系来传递这个闭包,这使得状态的管理非常复杂。

这里写图片描述

例如这种情况下,C想要触发A.setState,那就需要A先封好闭包作为属性传给B,B再传给C,C在合适的时机调用。调用完了,A的setState会引起所有的子组件重新render。

如果C想要触发D的更新,则也需要A作为中介,将D中要更新的部分拿出来,作为props由A来传入,这样还是按照之前的做法,C可以引起A的render,进而导致了所有组件render,也就包括了D。不过其实我们只想要D更新,其他组件并不需要更新。而且我们看到state的存储很乱,有时候我们将state存到本组件中,由自己掌握更新的时机,有时候需要交给父组件来掌握,此时子组件是无状态的,所有数据由父组件通过props传入。

这种方式无论从闭包传递还是过多的组件render上都是不好的,我们思考能不能通过更高效的方式完成这件事。首先是闭包传递,其实本质上是A把更新这件事放到一个函数中,然后把该函数作为属性传递给了子组件。我们可以这样来做,在A中设置一个事件监听器当事件触发的时候就更新状态,而在C中设置一个事件激发当合适的时机(如点击按钮)触发这个事件,这样就完成了直接触发另一个组件的更新。这样每个组件都有自己的state,并且都监听一个自己特定的事件,如果事件触发,就相应的调用setState完成自己的更新。

Redux就是这种思路,核心概念是store,所有组件ABCDE的state都存到了store.state中,这个变量只能通过触发action才能改变,并且专门定义了这种根据action更新store.state值的函数叫reducer。当然了改变了这个变量的值对我们整个react应用没有任何影响,还需要把这个值和每个组件内的state关联起来。每个组件中都有一个store.subcribe(func),即每个组件都可以监听这个store.state的变化,如果变化就触发这个函数,然后可以看变量中是不是和自己相关的例如可以在store中这样存储{a:xxx,b:xx,c:xx,d:xx}这样A只需要检查store.getState().a是不是有变。

如下:

这里写图片描述

上图中,其实ABCD的回调函数都会触发,只不过触发后有个判断,只有D的发生了变化,所以只有D进行后续setState和render操作。

Redux的思想是这样的,首先state全都交到store中来保存,每个组件订阅store的变化,一但发生变化,就把自己的state同步。store的变化由action这种方式唯一触发,管理起来也方便。不过Subscribe写起来太麻烦了,所以ReactRedux模块提供了Provider 和connect,可以很方便的完成自动Subscribe和自动封装无状态组件为有逻辑的组件,这种情况下我们只要写无状态组件,省了很多工作量。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: React在组件中如何监听redux中state状态的改变

本文链接: https://lsjlt.com/news/172060.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React在组件中如何监听redux中state状态的改变
    目录在组件中监听redux中state状态的改变解决方式React和redux的状态处理在组件中监听redux中state状态的改变 解决方式 1、在组件中引入store 2、在co...
    99+
    2022-11-13
    React组件 监听state的改变 监听redux中state改变
  • React事件监听和State状态修改方式
    目录React事件监听和State状态修改React事件监听相关例子React事件监听和State状态修改 on*函数可直接使用,但只能使用在html标签上,自己创建的组件标签不可 ...
    99+
    2022-11-13
    React事件监听 State状态修改 React 监听事件
  • react如何改变组件状态
    这篇文章主要介绍“react如何改变组件状态”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何改变组件状态”文章能帮助大家解决问题。在react中,可以利用setState()来修改组件的...
    99+
    2023-07-04
  • react中如何修改组件状态
    本篇内容介绍了“react中如何修改组件状态”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Android中如何监听网络状态
    这期内容当中小编将会给大家带来有关Android中如何监听网络状态,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一.加入网络权限获取网络信息需要在AndroidManifest.xml文件中加入相应的权限...
    99+
    2023-05-31
    android
  • vuex如何提交state&&实时监听state数据的改变
    这篇文章主要为大家展示了“vuex如何提交state&&实时监听state数据的改变”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vuex如何提...
    99+
    2024-04-02
  • 微信小程序中如何监听网络状态变化
    这篇“微信小程序中如何监听网络状态变化”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“微信小程序中如何监听网络状态变化”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下...
    99+
    2023-06-26
  • 小程序开发中如何监听网络状态变化
    这篇文章主要为大家展示了小程序开发中如何监听网络状态变化,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“小程序开发中如何监听网络状态变化”这篇文章吧。监听网络状态变化。CALLBACK返回参数:参数...
    99+
    2023-06-26
  • jQuery如何监听浏览器在线状态事件?
    这篇文章将为大家详细讲解有关jQuery如何监听浏览器在线状态事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery 监听浏览器在线状态事件 前言 浏览器在线状态事件是当浏览器与互联网之间的连接...
    99+
    2024-04-02
  • vue和react中props变化后如何修改state
    目录vue和react中props变化后修改state改进react改变state必须知道的知识点1.不能直接修改state2.state的更新是异步的3.state的更新是一个合并...
    99+
    2022-11-13
    vue中props react中props props修改state
  • Android 项目中如何监听网络状态
    这篇文章给大家介绍Android 项目中如何监听网络状态,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android 监听网络状态第一: 开启服务。第二:发送广播的形式。建议采用方法二。源代码如下:广播: Broa...
    99+
    2023-05-31
    android 如何监听 roi
  • React组件中的state和setState如何使用
    本篇内容主要讲解“React组件中的state和setState如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React组件中的state和setState如何使用”吧!state的基本...
    99+
    2023-06-29
  • 如何在Android中监听音量的变化
    这篇文章给大家介绍如何在Android中监听音量的变化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机...
    99+
    2023-06-15
  • 关于vue中如何监听数组变化
    目录前言源码部分从哪开始第一步学习呢从图开始看看源码吧前言 前段时间学习了关于vue中响应式数据的原理,(并作了学习笔记vue响应式原理),其实是通过Object.definePro...
    99+
    2024-04-02
  • 在 React 中如何从状态数组中删除一个元素
    目录在 React 中从状态数组中删除一个元素:永远不要在 React 中改变状态数组根据多个条件从状态数组中删除元素使用逻辑与 (&&) 运算符使用逻辑或 (||)...
    99+
    2023-03-24
    React 状态数组删除一个元素 React 数组删除元素
  • 在React中跨组件分发状态的方法有哪些
    小编给大家分享一下在React中跨组件分发状态的方法有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!问题;为了向您展示我的意思,我将使用一个简单的书籍CRUD(译者注:增加(Creat...
    99+
    2024-04-02
  • 在Angular中如何监听某个值的变化
    目录Angular监听某个值的变化使用getterangular使用form表单监听数据引入主要使用方法类 FormGroup,FormBuilder,Validators赋值引入创...
    99+
    2023-03-06
    Angular监听 Angular监听某值 监听某个值的变化
  • 微信小程序如何监听蓝牙适配器状态变化事件
    这篇“微信小程序如何监听蓝牙适配器状态变化事件”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“微信小程序如何监听蓝牙适配器状态变化事件”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇...
    99+
    2023-06-26
  • React中无状态组件与高阶组件的示例分析
    这篇文章主要介绍React中无状态组件与高阶组件的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!无状态组件(Stateless Component) 是 React 0.14...
    99+
    2024-04-02
  • 如何在Android项目中使用selector改变按钮状态
    如何在Android项目中使用selector改变按钮状态?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 使用selector改变按钮状态实例详解在res/dra...
    99+
    2023-05-31
    android selector sel
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作