// 用于变量的定义,防止程序员单词出错
export const INCREMENT = 'increment'
export const DECREMRNT = 'decrement'
npm i redux
// 引入createStore,专门用于创建redux中最为核心的store对象
import {createStore} from 'redux'
// 引入仓库接入store.js
import countReducer from './count_reducer'
// 暴露并且创建仓库
export default createStore(countReducer)
// 引入常量库
import { INCREMENT,DECREMRNT } from "./constant";
// 初始化变量(原始菜品)
const initState = 0
export default function countReducer(preState=initState,action){
// 分解服务员传送过来的做菜方法,和数据(食材要求)
const {type,data} = action
// 匹配方法
switch(type){
case INCREMENT:
// 返回新的菜品
return preState + data
case DECREMRNT:
// 返回新的菜品
return preState - data
default:
return preState
}
}
// 引入常量库
import { INCREMENT,DECREMRNT } from "./constant";
// 暴露两个方法
// type用于匹配count_reducer的处理方法 ,data是react组件携带的数据
export const incrementAction =(data)=>({type:INCREMENT,data})
export const decrementAction =(data)=>({type:DECREMRNT,data})
import React, { Component } from 'react'
// 引入redux
import store from '../../redux/store'
import {incrementAction,decrementAction} from '../../redux/count_action'
import '../Count/count.css'
export default class Count extends Component {
// componentDidMount(){
// // 这个api检测redux的数据有变化就就重新渲染页面,这样太麻烦可以直接在app.jsx中写
// store.subscribe(()=>{
// this.setState({})
// })
// }
increment= () =>{
// 函数体
const {value} = this.selectNum
store.dispatch(incrementAction(value*1))
}
decremrnt= () =>{
// 函数体
const {value} = this.selectNum
store.dispatch(decrementAction(value*1))
}
incrementIfOdd= () =>{
// 函数体
const {value} = this.selectNum
const count = store.getState()
if(count%2 !== 0){
store.dispatch({type:'increment',data:value*1})
}
}
render() {
return (
<div>
<h1 className='test'>当前求和为 {store.getState()}</h1>
<select ref={c => this.selectNum = c}>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
</select>
<button onClick={this.increment}>+</button>
<button onClick={this.decremrnt}>-</button>
<button onClick={this.incrementIfOdd}>当前求和为奇数再加</button>
</div>
)
}
}
import React from "react";
import ReactDOM from "react-dom";
import store from '../src/redux/store'
import App from './App'
ReactDOM.render(<App />,document.getElementById('root'))
store.subscribe(()=>{
ReactDOM.render(<App />,document.getElementById('root'))
})
如果说要对计算器进行异步的算法,action方法中返回的就不是对象,是一个函数,但是action中不支持action返回函数,这个时候就需要中间件redux-thunk来调节,就相当于服务员告诉厨师要晚点做菜,但是被拒绝了,需要一个恨厨师关系好的人来调节一下
// 引入常量库
import { INCREMENT,DECREMRNT } from "./constant";
// 暴露两个方法(同步action就是action的值为obj类型的一般对象)
// type用于匹配count_reducer的处理方法 ,data是react组件携带的数据
export const incrementAction =(data)=>({type:INCREMENT,data})
export const decrementAction =(data)=>({type:DECREMRNT,data})
// 异步action,就是值action的值为函数
export const incrementAsyncAction =(data,time)=>{
return (dispatch)=>{
setTimeout(()=>{
dispatch('incrementAction',data)
},time)
}
}
多引入一个action
import {incrementAction,decrementAction,incrementAsyncAction} from '../../redux/count_action'
加一个按钮异步加
<button onClick={this.incrementAsync}>异步加</button>
加一个点击事件
incrementAsync= () =>{
// 函数体
const {value} = this.selectNum
store.dispatch(incrementAsyncAction(value,500))
}
npm i redux-thunk
// 引入createStore,专门用于创建redux中最为核心的store对象
import {createStore,applyMiddleware} from 'redux'
// 引入仓库接入store.js
import countReducer from './count_reducer'
// 引入redux-thunk用于异步action
import thunk from 'redux-thunk'
// 暴露并且创建仓库
export default createStore(countReducer,applyMiddleware(thunk))