简单实现redux+react

安装:

npm install --save redux

redux是所有语言都可以使用的,并不是只有react可以使用
有专门的react-redux
与react的绑定库和开发者工具

npm install --save react-redux
npm install --save-dev redux-devtools

redux的三大原则

一、单一数据源,整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
二、State 是只读的,唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
三、为了描述 action 如何改变 state tree ,你需要编写 reducers。
在这里插入图片描述

使用场景

关于redux :如果你的UI层非常简单,没有很多互动, Redux就是不必要的,用了反而增加复杂性,下面描述了需要redux的情景
●用户的使用方式复杂
●不同身份的用户有不同的使用方式(比如普通用户和管理员)
●多个用户之间可以协作
●与服务器大量交互 ,或者使用了WebSocket
●View要从多 个来源获取数据
在这里插入图片描述

如何简单创建并使用redux

文件目录

  • |–src
    • |–action
      • |–Action.js //ActionCreater 触发事件
      • |–ActionType.js //触发名称
    • |–reducers
      • |–reducers.js
    • |–其他组件

介绍action的使用:
先明白Action的概念
State 的变化,会导致 View 的变化。但是,用户接触不到 State,只能接触到 View。所以,State 的变化必须是 View 导致的。Action 就是 View 发出的通知,表示 State 应该要发生变化了。
Action是一个对象,其中type是触发名称,是必须的属性,其他属性可以自由设置。

const action={
    type:'ADD',
    payload:'添加信息'
}

其中Action 的名称是ADD,它携带的信息是字符串’添加信息’。
1.ActionType.js
将触发名称封装在变量中,这样可以防止在后期调用时单词写错

export const  INCREASE='INCREASE_MESSAGE'//添加留言
export const  INITMESSAGE='INIT_MESSAGE'//初始化

export const ADD='ADD_RETURN';//添加回复
export const  INITRETURN='INIT_RETURN'//初始化

2.Action.js可以为一个action创造器
View 要发送多少种消息,就会有多少种 Action。如果都手写,会很麻烦。可以定义一个函数来生成 Action,这个函数就叫 Action Creator。

const ActionType=require('./ActionType');
//Action触发的名称

module.exports={
    Increase(data){
        return {
            type:ActionType.INCREASE,
            //触发名称为INCREASE
            payload:data
            //传输的数据
        }
    }
}

3.reducers.js
Store 收到 Action 以后,必须给出一个新的 State,这样 View 才会发生变化。这种 State 的计算过程就叫做 Reducer。
Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State。

import {INCREASE , ADD , INITMESSAGE , INITRETURN} from "../action/ActionType";
//定义初始状态
const initState={
    comment:[],
    returns:[],
}

const changeValue=(state=initState,action)=>{
    //state=initState将初始状态赋值给state
switch(action.type){
    //当action.type的触发名称为INCREASE会将action.data的值和原有的数据进行合并
    case INCREASE:
        return {...state,comment:[...state.comment,action.data]};
        //返回新的state
    case ADD:
        return {...state,returns:[...state.returns,action.data]};
    case INITRETURN:
        return {...state.returns,returns:action.data};
    case INITMESSAGE:
        return {...state.comment,comment:action.data};
    default:return state;
}
}

export default changeValue;

4.在组件中调用方法实现redux state状态的更改:
在页面中我们可以使用store.dispatch来进行触发reducer的自执行,所以在页面中,我们的store需要知道reducer函数,所以需要将Reducer传入createStore

//导入Action名称
import {ADD, INITRETURN} from "../action/ActionType";
//导入reducers
import changeValue from "../reducers/reducers";
import {createStore} from 'redux'
//导入ActionCreater
import {Increase} from './action/Action'
//将reducer函数传入createStore
var store = createStore(changeValue)

//当我们有ActionCreater时,我们可以直接引用
//在Action里面对输数据进行处理变为
//{type:ActionType.INCREASE, payload:data }返回给reducer     
store.dispatch(Increase(obj))

//没有ActionCreater时,把对象传到reducer中,让他自动判断
store.dispatch({type: ADD, data: obj})

5.结合state状态机使用

constructor() {
    //状态机,管理当前组件的数据
    super();
    this.state = {
        commentList: store.getState().comment,
    };
}

addComment(obj) {
    store.dispatch({type: INCREASE, data: obj})
    this.setState({
        commentList: store.getState().comment
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值