IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 【前端学习】认识redux -> 正文阅读

[JavaScript知识库]【前端学习】认识redux

1. redux是用来干什么的?

redux是一个状态管理工具,类似于vue中的vuex,专门用来解决组件之间数据传递的问题。

2. redux的安装与创建

项目终端里输入:npm install redux --save
在这里插入图片描述
新建一个redux文件夹,里面分别创建reducer.js和store.js文件。
在这里插入图片描述

3. 示例1

初始数据是原始数据类型。
reducer.js

const initState = 0;
export default function myReducer(prevState=initState,action){
    const {type,payload} = action;
    if(type=="add"){
        return prevState + payload
    }else if(type=="minus"){
        return prevState - payload
    }else{
        return prevState
    }
}

store.js

import {createStore} from "redux";
import myReducer from "./reducer";

// createStore需要将reducer作为参数传入
const store = createStore(myReducer)
export default store

App.js

import React, { Component } from 'react'
import store from "./redux/store"

export default class App extends Component {

  componentDidMount(){
    // 重新渲染视图
    store.subscribe(()=>{
      this.setState({})
    })
  }

  add=()=>{
    store.dispatch({
      type:"add",
      payload:1
    })
  }

  minus=()=>{
    store.dispatch({
      type:"minus",
      payload:2
    })
  }

  render() {
    return (
        <div>
          <h1>{store.getState()}</h1>
          <button onClick={this.add}>增加1</button>
          <button onClick={this.minus}>减少2</button>
        </div>

    )
  }
}

效果
点击增加1按钮,数字增加1;点击减少2按钮,数字减少2。
在这里插入图片描述

4. 示例2

初始数据是对象的形式。
reducer.js

const initState = {name:"小明", age:18, gender:"boy"}

export default function myReducer(prevState=initState,action){
    const {type,payload}=action;
    if(type=="changeName"){
        return {...prevState,name:payload.name}
    }else if(type=="changeAge"){
        return {...prevState,age:payload.age}
    }else if(type=="changeGender"){
        return {...prevState,gender:payload.gender}
    }else{
        return prevState
    }
}

store.js

import {createStore} from "redux";
import myReducer from "./reducer";

// createStore需要将reducer作为参数传入
const store = createStore(myReducer)
export default store

App.js

import React, { Component } from 'react'
import store from "./redux/store"

export default class App extends Component {

  changeName=()=>{
    store.dispatch({
      type:"changeName",
      payload:{name:"韩梅梅"}
    })
  }

  changeAge=()=>{
    store.dispatch({
      type:"changeAge",
      payload:{age:"20"}
    })
  }

  changeGender=()=>{
    store.dispatch({
      type:"changeGender",
      payload:{gender:"girl"}
    })
  }

  render() {
    console.log(store.getState())
    return (
        <div>
          <h1>名字是{store.getState().name},年龄是{store.getState().age},性别是{store.getState().gender}</h1>
          <button onClick={this.changeName}>改名字</button>
          <button onClick={this.changeAge}>改年龄</button>
          <button onClick={this.changeGender}>改性别</button>
        </div>
    )
  }
}

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from "./redux/store"


ReactDOM.render(
        <App/>,
        document.getElementById('root')
);

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

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

效果
点击按钮,可以修改原始对象中对应的数据
在这里插入图片描述

5. actionCreator

创建creators.js文件
在这里插入图片描述
在App.js中引入actionCreator
在这里插入图片描述

6. 异步action

creator.js文件
在这里插入图片描述
异步action需要使用同步action函数作为返回值,处理函数形式的action需要引入第三方插件,中间件redux-thunk。
安装:npm install redux-thunk
需要在store.js文件中,调用中间件
在这里插入图片描述
在这里插入图片描述
效果
点击“改年龄”按钮,触发异步action,3秒后,年龄由18改为100。
在这里插入图片描述

7. react-redux

在react-redux中,把所有组件分为两大类,一类是UI组件,另一类是容器组件。UI组件由用户提供,容器组件由react-redux生成。

UI组件

  • 只负责渲染页面,不处理逻辑
  • 没有状态
  • 所有的动态数据都由属性提供
  • 不使用任何redux的api

容器组件

  • 专门负责管理数据和业务逻辑,不负责UI界面
  • 有状态(属性)
  • 使用redux的api

react-redux安装:npm install react-redux

示例
creator.js
在这里插入图片描述
reducer.js
在这里插入图片描述
store.js
在这里插入图片描述
App.js
在这里插入图片描述
index.js
在这里插入图片描述
效果
在这里插入图片描述

8. 多组件数据共享

效果
页面中的按钮,都存在于About组件中。点击“更改”按钮,能够更改About组件中的数据;点击“更改Home数据”按钮,能够更改Home组件中的数据。
在这里插入图片描述
About组件:components/about/index.jsx

import React, { Component } from 'react'
import {connect} from 'react-redux'
import {aboutAction} from "../../redux/actions/about"
import {homeAction} from "../../redux/actions/home"

class Index extends Component {

  change=()=>{
    this.props.aboutAction("about数据改了")
  }

  changeHome=()=>{
    this.props.homeAction("home数据改了")
  }

  render() {
    const {aboutRes:{aboutReducer:{name,msg}}} = this.props
    return (
      <div>
        <h1>我是About组件--名字是{name}--{msg}</h1>
        <button onClick={this.change}>更改</button>
        <button onClick={this.changeHome}>更改Home数据</button>
      </div>
    )
  }
}

export default connect(
    state=>({aboutRes:state}),
    {
        aboutAction,
        homeAction
    }
)(Index)

Home组件:components/home/index.jsx

import React, { Component } from 'react'
import {connect} from 'react-redux'
import {homeAction} from "../../redux/actions/home"

class Index extends Component {
  render() {
    const {homeRes:{homeReducer:{name,msg}}} = this.props
    return (
      <div>
        <h1>我是Home组件--名字是{name}--{msg}</h1>
      </div>
    )
  }
}

export default connect(
    state=>({homeRes:state}),
    {
        homeAction
    }
)(Index)

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:34:49  更:2022-08-06 10:37:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 12:38:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码