一、index.js
import React from 'react'import ReactDOM from 'react-dom'import TodoList from './TodoList'import { Provider } from 'react-redux'import store from './store'// Provider(生产者)把store提供给内部所有组件const App = () => { <Provider store={store}> <TodoList /> </Provider>}ReactDOM.render(App, document.getElementById('root'))
二、TodoList.js
import React, {Component} from 'react'import { connect } from 'react-redux' import { getInputChangeAction, getButClickAction, getDeleteItem, getTodoList, getInitList } from './store/actionCreators';// 此时TodoList只是一个UI组件,同时也是一个无状态组件,只负责页面的渲染,有效提升代码性能const TodoList = (props) => { render(){ const { inputValue, changeInputValue, hendleClick, handleDelete, } = props return( <div> <div> <input value={inputValue} onChange={changeInputValue} /> <button onClick={hendleClick}>提交</button> </div> <ul> { this.props.list.map((item,index)=>{ <li key={index} onClick={handleDelete(index)} > {item} </li> }) } </ul> </div> ) }}// 让ToDoList和store进行连接// 第一个参数意思:把store里面的数据映射给组件的propsconst mapStateToProps = (state) => { return { inputValue:state.inputValue, list:state.list }}// 第二个参数意思: 把store中的dispatch方法挂载到props上const mapDispatchProps= (dispatch) => { return { changeInputValue(e){ const action = getInputChangeAction(e.target.value) dispatch(action) }, hendleClick(){ const action = getButClickAction() dispatch(action) }, handleDelete(){ const action = getDeleteItem(index) dispatch(action) } }}//数据变页面就会跟着变,不用再做订阅export default connect(mapStateToProps, mapDispatchProps)(ToDoList);
三、store/index.js
import { createStore } from 'redux';import reducer from './reducer';//创建一个公共存储仓库const store = createStore(reducer), export default store;
四、store/reducer.js
import { CHANGE_INPUT_VALUE, CHANGE_LIST_VALUE, DELETE_LIST_ITEM, INIT_LIST_ACTION } from './actionTypes';const defaultState = { inputValue: '', list: []}//默认数据export default (state = defaultState, action) => { //state是整个仓库存储的数据,action是store传递来的一个对象 if (action.type === CHANGE_INPUT_VALUE) { return [...state, inputValue:action.value] } if (action.type === CHANGE_LIST_VALUE) { const newState = JSON.parse(JSON.stringify(state)) newState.list.push(newState.inputValue) newState.inputValue = '' return newState } if (action.type === DELETE_LIST_ITEM) { const newState = JSON.parse(JSON.stringify(state)) newState.list.splice(action.index, 1) return newState } return state}//reducer可以接受state,但是绝对不能改变state//reducer.js返回一个数据和方法
五、store/actionCreators.js
import { CHANGE_INPUT_VALUE, CHANGE_LIST_VALUE, DELETE_LIST_ITEM, } from './actionTypes';import axios from 'axios'export const getInputChangeAction = (value) =>({ type:CHANGE_INPUT_VALUE, value:value})export const getButClickAction = ()=>({ type:CHANGE_LIST_VALUE,})export const getDeleteItem = (index) =>({ type:DELETE_LIST_ITEM, index})
六、store/actionTypes.js
export const CHANGE_INPUT_VALUE = 'change_input_value';export const CHANGE_LIST_VALUE = 'change_list_value';export const DELETE_LIST_ITEM = 'delete_list_item'