React结合Redux实现Todolist

简介: React结合Redux实现Todolist
  • redux工作流程

  • store.js
建立redux状态仓库
import { createStore, combineReducers } from 'redux';
import {add, deleter} from './Reducers/TodoList';
/**
 * 第一个参数是reducers  第二个参数是默认状态
 * 所以还得建立reducers  reducers主要是负责将新的状态返回到store里面  store负责更新
 */
export default createStore(combineReducers({
    add,
    deleter
}));
  • todolist.js    todolist的reducer
注意  reducers不要直接返回修改的state 需要返回的一个新的对象 否则内存地址指向的都是同一处
const states = {
    list: [
        {id: 1, name: '张三', age: 18},
        {id: 2, name: '王五', age: 19},
        {id: 3, name: '李四', age: 20},
    ],
    test: 1
};
export const add = (state = states, action) => {
    const {list} = state;
    switch (action.type) {
        case 'addTodoList':
            list.push(action.payload);
            return {
                ...state,
                list
            };
        case 'deleteTodoList':
            return {
                ...state,
                list: list.filter((item, index) => {
                    return index !== action.payload
                })
            };
    }
    // 返回新的状态
    return state;
};
const statesB = {
    name: '张三'
};
export const deleter = (state = statesB, action) => {
    console.log('deleter reducers')
    switch (action.type) {
        case 'change':
            return {
                ...state,
                name: action.payload
            };
    }
    // 返回新的状态
    return state;
};
  • Todolist.js 组件实现
import React from 'react';
import store from '../store';
/**
 * 如果单独使用redux的话 直接安装redux的包 进行简单状态管理
 * 使用store提供subscribe订阅状态更新 状态更新后使用更新组件
 */
class TodoList extends React.Component {
    constructor(props){
        super(props);
        this.state = store.getState();
        store.subscribe(this.changeState);
    }
    changeState = () => {
        console.log(11)
        this.setState(store.getState())
    };
    deleter = (index) => {
        store.dispatch({
            type: 'deleteTodoList',
            payload: index
        })
    };
    add = () => {
        store.dispatch({
            type: 'addTodoList',
            payload: {
                id: 4,
                name: '赵六',
                age: 1
            }
        })
    };
    change = (e) => {
        store.dispatch({
            type: 'change',
            payload: '王五'
        })
    };
    render() {
        const {
            list
        } = this.state.add;
        const {
            name
        } = this.state.deleter;
        console.log(this.state)
        return (
            <div>
                <h1>{name}</h1>
                <button onClick={this.add}>增加</button>
                <button onClick={this.change}>change</button>
                {
                    list.map((item, index) => {
                        return <div key={item.id} style={{display: 'flex', justifyContent: "center"}}>
                            <div>{item.name}</div>
                            <div>{item.age}</div>
                            <button onClick={this.deleter.bind(this, index)}>删除</button>
                        </div>
                    })
                }
            </div>
        );
    }
}
export default TodoList

实现效果:

使用了redux进行状态管理 删除一个用户首先dispatch了一个deleteTodoListaction  然后在reducer中返回删除后的数据 store更新数据 组件订阅了store的更新后 更新了内部状态 页面更新成功

代码解析:

  • 创建Store
createStore(Reducers)    利用Reducers创建一个Store  第二个参数是默认的初始化参数 利
合并多个Reducers。 会将所有reducers执行一遍获取初始状态 如果没有可以利用createStore 第二个参数设置默认参数
只要是dispatch的action 就会触发所有的reducers
const todoApp = combineReducers({
    // visibilityFilter,
    name1:todos,
})
用getState() 获取的键是导出时候的对应值 即name1 需要注意
  • 执行Action
利用创建好的store
Store.dispatch({
  type: '',             // 即会将这个类型传入reducers的第二个参数 action type为必传
  value: ''             // 参数随意 一般作用于参数传递
})
  • Reducers处理
reducers作为纯函数
function r (prevState, action) {
   // 第一个参数是上一次的状态。action是dispatch过来的值
   // 返回新的状态给store进行更新
   return {
     ... newState
   }
}

注意: action和reducer之间并不存在一对一的关系。一个action是可以被多个模块的reducer处理的,尤其是当模块之间存在关联关系时,这种场景更为常见

本文为作者原创,手码不易,允许转载,转载后请以链接形式说明文章出处。

目录
相关文章
|
1月前
|
前端开发 JavaScript 测试技术
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
从零开始搭建react+typescript+antd+redux+less+vw自适应项目
49 0
|
1月前
|
开发框架 前端开发 JavaScript
使用React、Redux和Bootstrap构建社交媒体应用
使用React、Redux和Bootstrap构建社交媒体应用
15 0
|
6月前
|
前端开发 JavaScript 容器
React的魅力: React-Router-集中式管理和Redux-核心概念
React的魅力: React-Router-集中式管理和Redux-核心概念
43 1
|
7月前
|
JavaScript 前端开发 中间件
React(六) —— redux
React(六) —— redux
|
7月前
|
JavaScript 前端开发 算法
|
7月前
|
Web App开发 JavaScript 前端开发
React | Redux的使用详解(二)
React | Redux的使用详解(二)
|
7月前
|
存储 缓存 JavaScript
React | Redux的使用详解(一)
React | Redux的使用详解(一)
|
7月前
|
JavaScript 前端开发 API
【React】React——redux
【React】React——redux
【React】React——redux
|
7月前
|
JavaScript 前端开发 中间件
【React全家桶】Flux与Redux
【React全家桶】Flux与Redux
51 0
|
JavaScript 前端开发 API
React开发实践之(4)redux入门
React开发实践之(4)redux入门
119 0