从零开始react--02(redux)

本文详细讲解了如何在Redux中创建actionType文件以提升action命名规范,并介绍了actionCreator的使用,以增强代码组织和测试。重点讨论了如何确保action对象的正确构造,以及纯函数reducer的正确应用。

redux的继续完善

actionType文件的创建

  • 在函数中的action的type:"字符串"如果写错,并不会报错且不易察觉
  • actionType旨在使action的名字分离出来
  1. store中创建actionType.js文件
export const CHANGE_INPUT_VALUE = "change_input_value";
export const ADD_TODO_ITEM = "add_todo_item";
export const DELETE_TODO_ITEM = "delete_todo_item";
  1. 在todolist组件中引入并使用
import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM } from "./store/actionType"
handleInputChange(e) {
        const action = {
            type: CHANGE_INPUT_VALUE,
            value: e.target.value
        }
        store.dispatch(action);
    }
  1. 在reducer.js中引入并使用
import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM } from "./actionType"
const defaultState = {
    inputValue: "",
    list:[]
};
export default (state = defaultState, action) => {/* 局 部 代 码 */
    if (action.type == CHANGE_INPUT_VALUE) {
        //reducer可以接受state,但不能修改state
        //必须对state做一个深复制(互不相干扰),避免对原state干扰
        let newState = { ...state };
        newState.inputValue = action.value;
        return newState;
    }

整合所有action,使用actionCreator管理所有action

好处是方便管理,另一个是便于前端自动化测试。

  1. 创建actionCreator
import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM } from "./actionType"
export const getInputValue = (value) => ({
    type: CHANGE_INPUT_VALUE,
    value
})/*({}),不加这个()会报错 */
/*//加括号的函数体返回对象字面量表达式 */
export const buttounAdd = () => ({
    type: ADD_TODO_ITEM
})
export const getDeleteValue = (index) => ({
    type: DELETE_TODO_ITEM,
    index
})
/*这里的对象表达式必须与reducer内的对象属性一致,不能改属性名,否则会有隐形的错误不易察觉 */
/*export const getDeleteValue = (i) => ({
    type: DELETE_TODO_ITEM,
    i
})*/     这里就是个错的例子,不会报错,但功能异常了。原来叫index,这里就必须还叫index
/*这里的对象表达式必须与reducer内的对象属性一致,不能改属性名,否则会有隐形的错误不易察觉 */

这里有个我的盲点,箭头函数返回体如果用()包围,则返回对象字面量表达式
//加括号的函数体返回对象字面量表达式:params => ({foo: bar})

  • Todolist中引入并使用
import { getInputValue, buttounAdd, getDeleteValue } from "./store/
。。。
   handleInputChange(e) {
        const action = getInputValue(e.target.value);//这里调用了该函数
        store.dispatch(action);
        // this.setState(store.getState());
    }

redux总结

  • store唯一
  • 只有store能够修改自己的state,reducer需要创建一个副本去修改
  • reducer中必须是纯函数:给定输入,输出是一定的(不会变)
  • 比如newState=new Date()这样即使preState,action一样,newState也不会一样,这就不是纯函数

核心API

  • createStore(reducer, 调试语句(参数2))
  • store.getState()
  • store.dispatch( action )
  • store.subscribe( 函数 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值