redux

在这里插入图片描述

redux(npm install --save redux)

javascript提供的一个可预测性的状态容器,在vue中可以使用,但是在react中会比较多,可以集中管理多个组件的状态。

需求场景
1. 多个组件的状态需要共享的时候
2. 一个组件需要改变另一个组建的状态的时候
3. 组建的状态需要在任何时候都可以拿到

三个原则
1. 单一数据源,整个react中的状态都会被统一管理到store
2. state是只读的,不能直接改变state,而是通过出发redux中的特定方法来进行修改
3. 使用纯函数来执行修改操作:action来改变redux中的state

app.js

import React from 'react'
import Home from "./components/Home"
function App(props){
    return (
        <div className="App">
            <div>
                hello    
                <Home> 
            </div>
        </div>
    )
}
export default App;

src -> redux -> reducer.js

var obj = {
    {name:'xixi',age:18}
}
export function data(state=obj[0].age,action){
    switch(action.type) {
        default:
            return state;
            break
    }

}

src -> redux -> store.js

import {creatStore} from 'redux'
import {data} from './reducer.js'
export var store = createStore(data)

src -> components -> Home.js


import React {Componet} from 'react'
import { store } from "../redux/store"
export default class Home extends Component {
    constructor(props) {
        super(props)
        this.state = {
            num:store.getState()
        }
    }
    return (
        <div>
            home --- {this.state.num}    
        </div>
    )
}

基本使用

修改数据
a、当组件修改数据的时候需要调用store.dispatch传递一个action给store
b、store自动调用reducers,并且传入两个参数,当前state和接收到的action
c、reducers接收到这个action后做业务逻辑,并返回一个新的newState给store
d、store这个时候就拥有了state,下一次数据再次发生改变的时候就不会使用defaultState而是store里面的state,需要注意的是reducers里面必须返回一个纯函数,另外reducers里面的state只允许读不允许修改
e、组件通过store.subscribe()监听来实现view的重新渲染

src -> redux -> action.js

// 增加
export const add=(num)=>{
    return {
        type:"ADD",
        data: num
    }
}

// 减少
export const del=(num)=>{
    return {
        type:"DEL",
        data: num
    }
}

src -> redux -> reducer.js

var obj = {
    {name:'xixi',age:18}
}
export function data(state=obj[0].age,action){
    switch(action.type) {
        // action.js中定义
        case "ADD":
            return state + action.data
            break;
        case "DEL":
            return state - action.data
            break;
        default:
            return state;
            break
    }
}

src -> components -> Home.js

import React {Componet} from 'react'
import { store } from "../redux/store"
import * as action from "../redux/action"
export default class Home extends Component {
    constructor(props) {
        super(props)
        this.state = {
            num:store.getState()
        }
    }
    componentDidMount(){
        // 生成新的state 用subscribe监听每次修改情况
        store.subscribe(()=>{
            this.setState({
                num: store.getState()
            })
        })
    }
    return (
        <div>
            home --- {this.state.num}    
            <button onClick={()=>{store.dispatch(action.add(1))}}>点我加1</button>
            <button onClick={()=>{store.dispatch(action.del(1))}}>点我减1</button>
        </div>
    )
}

修改数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值