一、在store下新建actionCreators.js
import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM } from './actionTypes';
export const getChangeInputValue = (value) => ({
type: CHANGE_INPUT_VALUE,
value
})
export const getAddTodoItem = () => ({
type: ADD_TODO_ITEM,
})
export const getDeleteTodoItem = (index) => ({
type: DELETE_TODO_ITEM,
index
})
TodoList.js中引用actionCreators.js
import { getChangeInputValue, getAddTodoItem, getDeleteTodoItem } from './store/actionCreators';
handleInputChange(e) {
const action = getChangeInputValue(e.target.value);
store.dispatch(action);
}
完整的代码:
import React, { Component } from 'react';
import 'antd/dist/antd.css';
import { Input, Button, List } from 'antd';
import store from './store';
import { getChangeInputValue, getAddTodoItem, getDeleteTodoItem } from './store/actionCreators';
class TodoList extends Component {
constructor (props) {
super(props);
this.state = store.getState();
this.handleInputChange = this.handleInputChange.bind(this);
this.handleStoreChange = this.handleStoreChange.bind(this);
this.handleButtonClick = this.handleButtonClick.bind(this);
store.subscribe(this.handleStoreChange);
}
render () {
return (
<div style={{marginTop:'10px', marginLeft:'10px'}}>
<div>
<Input
value={this.state.inputValue}
placeholder="输入info"
style={{width: '300px', marginRight: '10px'}}
onChange={this.handleInputChange}
/>
<Button type="primary" onClick={this.handleButtonClick}>提交</Button>
</div>
<List
style={{marginTop:'10px', width:'300px'}}
bordered
dataSource={this.state.list}
renderItem={(item, index) => (<List.Item onClick={this.handleItemDelete.bind(this, index)}>{item}</List.Item>)}
/>
</div>
)
}
handleInputChange(e) {
const action = getChangeInputValue(e.target.value);
store.dispatch(action);
}
handleButtonClick() {
const action = getAddTodoItem();
store.dispatch(action);
}
handleStoreChange() {
this.setState(store.getState());
}
handleItemDelete(index) {
const action = getDeleteTodoItem(index);
store.dispatch(action);
}
}
export default TodoList;
actionTypes.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';
reducer.js:
import { CHANGE_INPUT_VALUE, ADD_TODO_ITEM, DELETE_TODO_ITEM } from './actionTypes';
const defaultState = {
inputValue: '',
list: [1,2]
}
//reducer 可以接受state, 但是绝不能修改state
export default (state = defaultState, action) => {
if(action.type === CHANGE_INPUT_VALUE) {
const newState = JSON.parse(JSON.stringify(state));
newState.inputValue = action.value;
return newState;
}
if(action.type === ADD_TODO_ITEM) {
const newState = JSON.parse(JSON.stringify(state));
newState.list.push(newState.inputValue);
newState.inputValue = '';
return newState;
}
if(action.type === DELETE_TODO_ITEM) {
const newState = JSON.parse(JSON.stringify(state));
newState.list.splice(action.index, 1);
return newState;
}
return state;
}