前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React结合Redux实现Todolist

React结合Redux实现Todolist

作者头像
憧憬博客
发布2020-07-20 17:01:45
4800
发布2020-07-20 17:01:45
举报
文章被收录于专栏:憧憬博客分享憧憬博客分享
  • redux工作流程
  • store.js

建立redux状态仓库

代码语言:javascript
复制
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 需要返回的一个新的对象 否则内存地址指向的都是同一处

代码语言:javascript
复制
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 组件实现
代码语言:javascript
复制
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
代码语言:javascript
复制
createStore(Reducers)    利用Reducers创建一个Store  第二个参数是默认的初始化参数 利

合并多个Reducers。 会将所有reducers执行一遍获取初始状态 如果没有可以利用createStore 第二个参数设置默认参数

只要是dispatch的action 就会触发所有的reducers
const todoApp = combineReducers({
    // visibilityFilter,
    name1:todos,
})

用getState() 获取的键是导出时候的对应值 即name1 需要注意
  • 执行Action
代码语言:javascript
复制
利用创建好的store
Store.dispatch({
  type: '',							// 即会将这个类型传入reducers的第二个参数 action type为必传
  value: ''						  // 参数随意 一般作用于参数传递
})
  • Reducers处理
代码语言:javascript
复制
reducers作为纯函数
function r (prevState, action) {
   // 第一个参数是上一次的状态。action是dispatch过来的值
   
   // 返回新的状态给store进行更新
   return {
     ... newState
   }
}

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档