一、首先,来看下redux的官方图解![在这里插入图片描述](https://img-blog.csdnimg.cn/20210509134913232.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTg2ODU1Mg==,size_16,color_FFFFFF,t_70#pic_center)
二、根据这张图的步骤,我们来一步一步实现ToDoList(记得下载redux和react-redux第三方依赖)
1、我们需要对入口文件进行更改
import React from 'react'
import ReactDOM from 'react-dom'
import {Provider} from 'react-redux'
import Todolist from './todolistRedux/Todolist'
import store from './todolistRedux/redux/store'
ReactDOM.render(
<Provider store={store}>
<Todolist/>
</Provider>
,document.getElementById('root')
)
2、创建一个新的文件夹store.js,作为仓库
import {createStore,applyMiddleware} from 'redux'
import thunk from 'redux-thunk'
import {composeWithDevTools} from 'redux-devtools-extension'
import reducers from './reducers'
export default createStore(reducers,composeWithDevTools(applyMiddleware(thunk)))
3、创建功能组件Todolist.js(在创建中我们要想好,我们将来需要啥state,以及action)
import React, { Component } from 'react'
import { connect } from 'react-redux'
class Todolist extends Component {
render() {
return (
<div>
<input/>
<button>增加</button>
<ul>
<li></li>
</ul>
</div>
)
}
}
export default connect()(Todolist)
4、创建reducers.js文件,将之前我们想到的state属性加入其中
const defaultState = {
inputValue:'我大物',
list:['wwed']
}
function reducer(state=defaultState,action) {
switch (action.type){
default:
return state
}
}
export default reducer
5、对Todolist.js组件进行更改,将store中默认的state引入到组件中
import React, { Component } from 'react'
import { connect } from 'react-redux'
class Todolist extends Component {
render() {
let {inputValue,list} = this.props
return (
<div>
<input
value={inputValue}
/>
<button>增加</button>
<ul>
{
list.map((item,index) => {
return(
<li key={index}>{item}</li>
)
})
}
</ul>
</div>
)
}
}
const mapState = (state) => {
return {
inputValue:state.inputValue,
list:state.list
}
}
export default connect(mapState)(Todolist)
6、创建文件夹actions.js,用于创建多个action
export const inputChange = (e) => ({type:'',value:e})
export const addItem = () => ({type:''})
export const deleteItem = (e) => ({type:'',value:e})
7、创建文件夹action-types.js,用于规定action中的type值
export const CHANGE_INPUT = 'change_input'
export const ADD_ITEM = 'add_item'
export const DELETE_ITEM = 'delete_item'
8、将文件action-types.js,引入actions.js文件中
import {
CHANGE_INPUT,
ADD_ITEM,
DELETE_ITEM
} from './action-types'
export const inputChange = (e) => ({type:CHANGE_INPUT,value:e})
export const addItem = () => ({type:ADD_ITEM})
export const deleteItem = (e) => ({type:DELETE_ITEM,value:e})
9、将action引入到TodoList组件中去,然后可以传参
import React, { Component } from 'react'
import { connect } from 'react-redux'
import {
inputChange,
addItem,
deleteItem
} from './redux/actions'
class Todolist extends Component {
render() {
let {inputValue,list} = this.props
return (
<div>
<input
value={inputValue}
onChange={e => this.props.inputChange(e.target.value)}
/>
<button onClick={() => this.props.addItem()}>增加</button>
<ul>
{
list.map((item,index) => {
return(
<li key={index} onClick={() => this.props.deleteItem(index)}>{item}</li>
)
})
}
</ul>
</div>
)
}
}
const mapState = (state) => {
return {
inputValue:state.inputValue,
list:state.list
}
}
export default connect(mapState,{inputChange,addItem,deleteItem})(Todolist)
10、开始编写reducer函数,引入action-types.js
import {
CHANGE_INPUT,
ADD_ITEM,
DELETE_ITEM
} from './action-types'
const defaultState = {
inputValue:'qw',
list:[]
}
function reducer(state=defaultState,action) {
switch (action.type){
case CHANGE_INPUT: {
let newState = JSON.parse(JSON.stringify(state))
newState.inputValue = action.value
return newState
}
case ADD_ITEM: {
let newState = JSON.parse(JSON.stringify(state))
newState.list.push(newState.inputValue)
return newState
}
case DELETE_ITEM: {
let newState = JSON.parse(JSON.stringify(state))
newState.list.splice(action.value,1)
return newState
}
default:
return state
}
}
export default reducer
11、再次修改Todolist组件
import React, { Component } from 'react'
import { connect } from 'react-redux'
import {
inputChange,
addItem,
deleteItem
} from './redux/actions'
class Todolist extends Component {
render() {
let {inputValue,list} = this.props
return (
<div>
<input
value={inputValue}
onChange={e => this.props.inputChange(e.target.value)}
/>
<button onClick={() => this.props.addItem()}>增加</button>
<ul>
{
list.map((item,index) => {
return(
<li key={index} onClick={() => this.props.deleteItem(index)}>{item}</li>
)
})
}
</ul>
</div>
)
}
}
const mapState = (state) => {
return {
inputValue:state.inputValue,
list:state.list
}
}
export default connect(mapState,{inputChange,addItem,deleteItem})(Todolist)