React-Redux初步了解

引入

import { createStore } from 'redux';

redux工作流

action: 用来给store描述操作类型的变量,格式如下:

{
  type: 'add',
  // 可以有其他类型,但是type必须存在
}

dispatch:使用dispatch(action)向store传递action,然后store会把action连同state(也就是要更改的公共状态)传入到reducer中作处理。

render:render为一个纯函数,接收旧的 state 和 action,读取action.type明确处理类型,处理完毕后返回新的 state作为新的状态记录到store上。

const render = (state, action) => {
   switch (action.type) {
     case 'add':
       return state + 1
     default:
       return state
   }
}

subscribe:订阅listener,通过subscribe(listener)添加一个变化监听器。每当 dispatch(action) 的时候就会执行,state中的一部分可能已经变化。你可以在回调函数里调用 getState() 来拿到当前 state

store.subscribe(() => console.log(store.getState()))

实例

点击按钮+-数字进行加减

1.渲染页面按钮

// index.jsx文件
import React from 'react';
import { ADD_NUMBER, SUB_NUMBER } from '../store/action/number';
import store from '../store';

const AddButton = () => {
    return (
        <>
          <button onClick={() => store.dispatch(ADD_NUMBER)}>+</button>
          <span>{ store.getState() }</span>
          <button onClick={() => store.dispatch(SUB_NUMBER)}>-</button>
        </>
    )
}
export default AddButton;

2.action文件

export const ADD_NUMBER = {
    type: 'ADD',
}

export const SUB_NUMBER = {
    type: 'SUB',
}

 3.reducer文件

const renderReducer = (state = 0, action) => {
    switch (action.type) {
        case 'ADD':
            return state + 1
        case 'SUB':
            return state - 1
        default:
            return state;
    }
}

export default renderReducer;

 会发现一个问题页面上的数据不会变化但是点击后的state是变化了的

 

这是因为没有触发状态改变,可以使用hooks的userReducer或者useState和subscribe来监听和更改状态

使用useState和subscribe

将index.jsx改为

import React from 'react';
import { ADD_NUMBER, SUB_NUMBER } from '../store/action/number';
import store from '../store';

const AddButton = (props) => {
    // 增加useState和subscribe
    const [count, setCount] = React.useState(0);
    React.useEffect(() => {
        store.subscribe(() => {
            setCount(store.getState());
        })
    }, [])
    return (
        <>
          <button onClick={() => store.dispatch(ADD_NUMBER)}>+</button>
          <span>{ count }</span>
          <button onClick={() => store.dispatch(SUB_NUMBER)}>-</button>
        </>
    )
}
export default AddButton;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值