当前位置: 首页 > news >正文

Redux 数据仓库

Redux 数据仓库

解决React 数据管理(状态管理) ,用于中大型,数据比较庞大,组件之间数据交互多的情况下使用。

作者:如果你不知道是否需要使用Redux,那么你就不需要它!

解决组件的数据通信。

解决书和交互 较多的应用。

关键点:

Store: 数据仓库,保存数据的地方。

State :state 是一个对象,数据仓库里的所有数据都放到1个state里。

Action : 1 个动作, 触发数据改变的方法。

Dispatch : 将动作触发成方法

Reducer :是一个函数,通过获取动作,改变数据,生成一个新state. 从而改变页面。

案例: 点击加减事件,控制仓库的数据变化

第一种 1. 安装 : redux

npm install redux --save

2. 引入

// 引入仓库和 解构创建仓库的方法import Redux , {creatStore, createStore}  from 'redux' 
这个例子只用了这一个 createStore

3. 根据业务逻辑创建函数

// 2. 创建函数  通过动作 用于创建新的state   参数:传入需要修改的数据 和方法 (形参)
const reducer = function(state = { num: 0 }, action ){switch(action.type){case "add_" :state.num++;break;case "decrement_" :state.num--;break;default:break;}return {...state} // 解构,每次生成新的数据 返回
}

4. 创建仓库 把业务函数放入仓库

const store = createStore(reducer) //1. 创建仓库  放置要给函数,专门用于管理状态

5 两个点击事件

function add(){//通过仓库的方法 dispatch 进行修改数据store.dispatch({type:"add_" ,name:'lyx'}) //传递数据到第二步 创建的函数中 ->action中console.log(store.getState());}function decrement(){//通过仓库的方法 dispatch 进行修改数据store.dispatch({type:"decrement_"})console.log(store.getState());
}

6 使用仓库数据的面板 组件

  const Counter  = function(props){return (<div><h1>计数数量:{ store.getState().num }</h1><button onClick = {add}>计数++</button><button onClick = {decrement }>计数--</button></div>)}
  1. 数据修改后,监听 和渲染页面
store.subscribe(()=>{//监听数据变化 重新渲染  react时单向数据流ReactDOM.render( <App></App> ,document.getElementById('root'));
})

完整代码

App.js

import React from 'react';
// import ReactDOM from 'react-dom';// 引入仓库和 解构创建仓库的方法
import Redux , {creatStore, createStore}  from 'redux' // 2. 创建函数  通过动作 用于创建新的state   参数:传入需要修改的数据 和方法 (形参)
const reducer = function(state = { num: 0 }, action ){
console.log(action);switch(action.type){case "add_" :state.num++;break;case "decrement_" :state.num--;break;default:break;}return {...state} // 解构,每次生成新的数据 返回
}const store = createStore(reducer) //1. 创建仓库  放置要给函数,专门用于管理状态function add(){//通过仓库的方法 dispatch 进行修改数据store.dispatch({type:"add_" ,name:'lyx'}) //传递数据到第二步 创建的函数中 ->action中console.log(store.getState());}function decrement(){//通过仓库的方法 dispatch 进行修改数据store.dispatch({type:"decrement_"})console.log(store.getState());
}// 函数式的计数器const Counter  = function(props){return (<div><h1>计数数量:{ store.getState().num }</h1><button onClick = {add}>计数++</button><button onClick = {decrement }>计数--</button></div>)}class App extends React.Component {render(){return(   <div id = 'app'>    我是 app组件<Counter></Counter></div>)
}}export {App ,store
}

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Redux , {creatStore, createStore}  from 'redux' import {App ,store } from './App';ReactDOM.render( <App></App> ,document.getElementById('root'));store.subscribe(()=>{//监听数据变化 重新渲染  react时单向数据流ReactDOM.render( <App></App> ,document.getElementById('root'));
})

第二种 react-redux

概念:

Provider组件: 自动将store里的state和组件进行关联。

MapStatetoProps: 这个函数用于将store的state映射到组件的 props

mapdispatchToProps: 将store中的dispatch 映射到组件的props里,实现了方法的共享。

Connect 方法: 将组件和数据(方法)进行连接。

案例: 和上一个 一样

1 引入包

npm install react-redux --save

2 引入方法

import  {createStore}  from 'redux' import  {Provider, connect }  from 'react-redux' 

关键点把握

createStore

  function reducer(state={num:0},action){switch(action.type){case "add":state.num++;break;default:break}return {...state}}const store = createStore(reducer)

Provider( n. 供应者;养家者) 自动将store里的state和组件进行关联。

   ReactDOM.render(<Provider store= {store}><App></App></Provider>,document.getElementById('root'))

connect 将组件和数据(方法)进行连接。

 const App = connect(mapStateToProps,mapDispatchToProps
)(Counter)

3 数据的获取,数据的修改

要state映射到组件的props中,将修改数据的方法映射到组件的props中。

两个映射函数

//将state映射到props函数
function mapStateToProps(state){return{value:state.num}
}//将修改state数据的方法,映射到props  默认会传入store里的dispath方法
function mapDispatchToProps(dispatch){return{onAddClick:()=>{dispatch(addAction)}}
}

4 形成新的组件

// 将上面2个方法,将数据仓库的state和修改states的方法映射到组件上,形成新的组件。const App = connect(mapStateToProps,mapDispatchToProps
)(Counter)

5 原组件获得方法和属性值

class Counter extends React.Component{render(){//计数,通过stroe的state传给props,直接通过props就可以将state的数据获取const value = this.props.valueconst onAddClick = this.props.onAddClick;// 等同于vuex的 mapMutation mapStatereturn(<div><h1>技术的数量:{value}</h1><button onClick = {onAddClick}> 数字+1</button></div>)}
}

完整代码 index.js

import React from 'react';
import ReactDOM from 'react-dom';import  {createStore}  from 'redux' 
import  {Provider, connect }  from 'react-redux' 
// Provider  渲染标签class Counter extends React.Component{render(){console.log(this);//计数,通过stroe的state传给props,直接通过props就可以将state的数据获取const value = this.props.valueconst onAddClick = this.props.onAddClick;// 等同于vuex的 mapMutation mapStatereturn(<div><h1>技术的数量:{value}</h1><button onClick = {onAddClick}> 数字+1</button></div>)}
}const addAction = {type:"add"}function reducer(state={num:0},action){switch(action.type){case "add":state.num++;break;default:break}return {...state}}const store = createStore(reducer)//将state映射到props函数
function mapStateToProps(state){return{value:state.num}
}//将修改state数据的方法,映射到props  默认会传入store里的dispath方法
function mapDispatchToProps(dispatch){return{onAddClick:()=>{dispatch(addAction)}}
}// 将上面2个方法,将数据仓库的state和修改states的方法映射到组件上,形成新的组件。const App = connect(mapStateToProps,mapDispatchToProps
)(Counter)// ReactDOM.render( <App></App> ,document.getElementById('root'));ReactDOM.render(<Provider store= {store}><App></App></Provider>,document.getElementById('root'))

稍作注释:

import React from 'react';
import ReactDOM from 'react-dom';import  {createStore}  from 'redux' 
import  {Provider, connect }  from 'react-redux' 
// Provider  渲染标签// 第一步: 构建类组件   目的: 可以使用类组件的props
class Counter extends React.Component{render(){console.log(this);//计数,通过stroe的state传给props,直接通过props就可以将state的数据获取const value = this.props.valueconst onAddClick = this.props.onAddClick;// 等同于vuex的 mapMutation mapStatereturn(<div><h1>技术的数量:{value}</h1><button onClick = {onAddClick}> 数字+1</button></div>)}
}// 第二步: 构建业务逻辑  初始化仓库function reducer(state={num:0},action){switch(action.type){case "add":state.num++;break;default:break}return {...state}}const store = createStore(reducer)//将state映射到props函数
function mapStateToProps(state){return{value:state.num}
}const addAction = {type:"add"
}//将修改state数据的方法,映射到props  默认会传入store里的dispath方法
function mapDispatchToProps(dispatch){return{onAddClick:()=>{dispatch(addAction)}}
}// 将上面2个方法,将数据仓库的state和修改states的方法映射到组件上,形成新的组件。const App = connect(mapStateToProps,mapDispatchToProps
)(Counter)// ReactDOM.render( <App></App> ,document.getElementById('root'));// Provider 自动将store里的state和组件进行关联。ReactDOM.render(<Provider store= {store}><App></App></Provider>,document.getElementById('root'))

本节结束

http://www.lryc.cn/news/211219.html

相关文章:

  • [毕设记录]@开题调研:一些产品
  • CSS3中的字体和文本样式
  • LVS集群-DR模式【部署高可用LVS-DR集群】
  • 银河麒麟服务器版v4安装程序缺少依赖包,改为利用手机联网在线安装
  • Maven第一章:Maven安装、验证、使用
  • ios 代码上下文截屏之后导致的图片异常问题
  • 《嵌入式软\硬件开发难点-2023-10-29》
  • 基于5G工业CPE打造智慧煤矿无人巡检监测应用
  • 考点之数据结构
  • 07、SpringCloud -- jmeter 压测
  • 省市区三级联动查询redis(通过python脚本导入数据)
  • Linux命令(108)之dirname
  • SDL事件处理以及线程使用(2)
  • DAY38 动态规划 + 509. 斐波那契数 + 70. 爬楼梯 + 746. 使用最小花费爬楼梯
  • Redis快速上手篇七(集群-一台虚拟机六个节点)
  • 社恐了怎么办?如何改变社交恐惧症?
  • HiQPdf Library for .NET - HTML to PDF Crack
  • ES6中Set集合
  • 论坛介绍 | COSCon'23 开源文化(GL)
  • 【httpd】 Apache http服务器目录显示不全解决
  • 笔记本电脑搜索不到wifi6 无线路由器信号
  • js获取input?
  • STM32 CAN使用
  • 安全和便捷:如何将运营商二要素API应用于实名制管理中
  • leetcode-二叉树
  • 【鸿蒙软件开发】ArkTS基础组件之TextTimer(文本显示计时)、TimePicker(时间选择)
  • pytorch 笔记:KLDivLoss
  • 父子项目打包发布至私仓库
  • 汽车网络安全--ECU的安全更新
  • NLP之搭建RNN神经网络