redux工作流程及使用方法

流程图:react组件创建action,通过store.dispatch(action)方法通知store要进行什么操作,因为store本身无法进行改变,需要引入reducer对自身进行管理,reducer进行操作后,返回新的newState给store,store发生改变,组件中数据发生改变。(个人理解,便于复习)

1.创建action并使用dispatch方法

import React, { Component } from 'react';
import store from './store'
import TodoListUI from './store/TodoListUI'
import {changeInputAction, addItemAction, deleteItemAction} from './store/actionCreators'

class TodoList extends Component {
    constructor(props){
        super(props)
        console.log(store.getState(),123)
        this.state=store.getState()
        store.subscribe(this.storeChange.bind(this))
        this.changeInputValue=this.changeInputValue.bind(this)
        this.clickBtn=this.clickBtn.bind(this)
        this.deleteItem=this.deleteItem.bind(this)
    }
    render() { 
        return ( 
            <div>
                <TodoListUI
                    inputValue={this.state.inputValue}
                    changeInputValue={this.changeInputValue}
                    clickBtn={this.clickBtn}
                    list={this.state.list}
                    deleteItem={this.deleteItem}
                />
            </div>
         );
    }
    componentDidMount(){

    }
    storeChange(){
        this.setState(store.getState)
    }
    changeInputValue(e){
        const action = changeInputAction(e.target.value)
        store.dispatch(action)
    }
    clickBtn(){
        const action = addItemAction()
        store.dispatch(action)
    }
    deleteItem(index){
        const action=deleteItemAction(index)
        store.dispatch(action)
    }
}
 
export default TodoList;

TodoListUI组件
import React from 'react';
import 'antd/dist/antd.css'
import { Input, Button, List } from 'antd'

export const TodoListUI =(props)=>{
    return (
        <div style={{ margin: '10px' }}>
            <div>
                <Input
                    placeholder={props.inputValue}
                    style={{ width: '250px', marginRight: '10px' }}
                    onChange={props.changeInputValue}
                    value={props.inputValue}
                >
                </Input>
                <Button type='primary' onClick={props.clickBtn}>
                    增加
                </Button>
            </div>
            <div style={{ margin: '10px', width: '300px' }}>
                <List
                    bordered
                    dataSource={props.list}
                    renderItem={(item, index) => (<List.Item onClick={() => {props.deleteItem(index) }}>{item}</List.Item>)}
                />
            </div>
        </div>

    );
}
export default TodoListUI;

 

2.创建store引入reducer和react dev Tools

import {createStore} from 'redux';
import reducer from './reducer'
const store = createStore(
    reducer,
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() // 创建数据存储仓库,有这个插件则调用这个方法
    );
export default store;

3.reducer对store进行操作

import {CHANGE_INPUT,ADD_ITEM,DELETE_ITEM} from './actionTypes'
const defaultState={
    inputValue:'write something',
    list:[
    'qwewdsfdsfgdg',
    'asdgfasdgfgsg',
    'triyutuettryh',
    ]
}
export default (state = defaultState,action)=>{
    //reducer只能接受state不能改变state
    let newState =JSON.parse(JSON.stringify(state));//深度拷贝
    switch (action.type){
        case CHANGE_INPUT:
            newState.inputValue=action.value;
            return newState
            break;
        case ADD_ITEM:
            newState.list.push(newState.inputValue);
            newState.inputValue='';
            return newState
            break;
        case DELETE_ITEM:
            newState.list.splice(action.index,1);
            return newState
            break;
        
    }
    return state
}

4.actionType 和actionCreatores

 actionType 

export const CHANGE_INPUT ='changeInput';
export const ADD_ITEM ='addItem';
export const DELETE_ITEM ='deleteItem';

actionCreatores

import { CHANGE_INPUT, ADD_ITEM, DELETE_ITEM } from './actionTypes'

export const changeInputAction =(value)=>({
    type:CHANGE_INPUT,
    value
})
export const addItemAction =()=>({
    type:ADD_ITEM,
})
export const deleteItemAction =(index)=>({
    type:DELETE_ITEM,
    index
})

 

posted @ 2020-06-03 10:18  HLLZ  阅读(1060)  评论(0编辑  收藏  举报