简单的加减需求
——视频学习,来源于尚硅谷https://www.bilibili.com/video/BV1wy4y1D7JT?p=100&spm_id_from=pageDriver
1、纯react
import React, { Component } from 'react'
export default class index extends Component {
state = {count:0}
//加法
increment = ()=>{
const {count} = this.state;
const {value} = this.selectValue;
this.setState({
count:count+value*1
})
}
//减法
decrement = ()=>{
const {count} = this.state;
const {value} = this.selectValue;
this.setState({
count:count-value*1
})
}
//当前值为奇数是加
incrementIfOdd = ()=>{
const {count} = this.state;
const {value} = this.selectValue;
if(count %2 !== 0){
this.setState({
count:count+value*1
})
}
}
//延时加
incrementAsyns = ()=>{
const {count} = this.state;
const {value} = this.selectValue;
setTimeout(() => {
this.setState({
count:count+value*1
})
},500)
}
render() {
return (
<div>
<h1>当前值为{this.state.count}</h1>
<select ref={cN => this.selectValue = cN}>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button onClick = {this.increment}>increment</button>
<button onClick = {this.decrement}>decrement</button>
<button onClick = {this.incrementIfOdd}>奇数加</button>
<button onClick = {this.incrementAsyns}>延时加</button>
</div>
)
}
}
2、简洁的redux(不包含action,action其实就是一个object的一般对象,可以手动写,下边第三个在写成文件形式)
//入口文件
import ReactDom from 'react-dom'
import App from './App'
import store from "./redux/store"
ReactDom.render(<App />,document.getElementById("root"))
// 监听store变化
store.subscribe(()=>{
ReactDom.render(<App />,document.getElementById("root"))
})
//组件Count文件
import React, { Component } from 'react'
//引入store
import store from "../../redux/store";
export default class index extends Component {
componentDidMount() {
// 监听store状态变化,通过setState让render重新渲染实现新状态展示,为防治多个(成百上千)组件都要监听,在入口文件(index.js)监听即可
// store.subscribe(()=>{
// this.setState({})
// })
}
//increment
increment = ()=>{
//获取option的value
const {value} = this.selectValue;
//通知redux加value
store.dispatch({
type: "increment",
data: value * 1,
})
}
//decrement
decrement = ()=>{
//获取option的value
const {value} = this.selectValue;
//通知redux加value
store.dispatch({
type: "decrement",
data: value * 1,
})
}
//incrementIfOdd
incrementIfOdd = ()=>{
const {value} = this.selectValue;
if(store.getState() %2 !== 0){
store.dispatch({
type: "increment",
data: value * 1,
})
}
}
//incrementAsyns
incrementAsyns = ()=>{
const {value} = this.selectValue;
setTimeout(() => {
store.dispatch({
type: "increment",
data: value * 1,
})
},500)
}
render() {
return (
<div>
<h1>当前值为{store.getState()}</h1>
<select ref={cN => this.selectValue = cN}>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button onClick = {this.increment}>increment</button>
<button onClick = {this.decrement}>decrement</button>
<button onClick = {this.incrementIfOdd}>奇数加</button>
<button onClick = {this.incrementAsyns}>延时加</button>
</div>
)
}
}
//store文件
/*
store
该文件只有一个,用于暴露一个store对象
*/
//引入createStore,专门用于创建store对象
import {createStore} from "redux";
//引入为Count组件服务的reducer
import countReducer from "./count_reducer"
export default createStore(countReducer)
//count组件的reducer文件
/*
这是组件Count的reducer
该文件是用于创建一个专门为Count组件服务的reducer,reducer的本质是一个函数
reducer函数会接收两个参数,分别是 之前的状态preState,动作对象action
*/
//初始化的状态值
const initState = 0;
export default function countReducer (preState = initState,action) {
// console.log(preState,action);
//获取action对象的type及data
const {type, data} = action;
//判断类型,进行不同的操作(加减)
switch (type) {
case 'increment':
return preState + data;
case 'decrement':
return preState - data;
default:
return preState;
}
}
3、完整的redux
//入口文件
import ReactDom from 'react-dom'
import App from './App'
import store from "./redux/store"
ReactDom.render(<App />,document.getElementById("root"))
// 监听store变化
store.subscribe(()=>{
ReactDom.render(<App />,document.getElementById("root"))
})
//组件count文件
import React, { Component } from 'react'
//引入store
import store from "../../redux/store";
//引入action
import {createIncrementAction,createDecrementAction} from "../../redux/count_action"
export default class index extends Component {
componentDidMount() {
// 监听store状态变化,通过setState让render重新渲染实现新状态展示,为防治多个(成百上千)组件都要监听,在入口文件(index.js)监听即可
// store.subscribe(()=>{
// this.setState({})
// })
}
//increment
increment = ()=>{
//获取option的value
const {value} = this.selectValue;
//通知redux加value
store.dispatch(createIncrementAction(value * 1))
}
//decrement
decrement = ()=>{
//获取option的value
const {value} = this.selectValue;
//通知redux加value
store.dispatch(createDecrementAction(value * 1))
}
//incrementIfOdd
incrementIfOdd = ()=>{
const {value} = this.selectValue;
if(store.getState() %2 !== 0){
store.dispatch(createIncrementAction(value * 1))
}
}
//incrementAsyns
incrementAsyns = ()=>{
const {value} = this.selectValue;
setTimeout(() => {
store.dispatch({
type: "increment",
data: value * 1,
})
},500)
}
render() {
return (
<div>
<h1>当前值为{store.getState()}</h1>
<select ref={cN => this.selectValue = cN}>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button onClick = {this.increment}>increment</button>
<button onClick = {this.decrement}>decrement</button>
<button onClick = {this.incrementIfOdd}>奇数加</button>
<button onClick = {this.incrementAsyns}>延时加</button>
</div>
)
}
}
//store文件
/*
store
该文件只有一个,用于暴露一个store对象
*/
//引入createStore,专门用于创建store对象
import {createStore} from "redux";
//引入为Count组件服务的reducer
import countReducer from "./count_reducer"
export default createStore(countReducer)
//count组件的reducer文件
/*
这是组件Count的reducer
该文件是用于创建一个专门为Count组件服务的reducer,reducer的本质是一个函数
reducer函数会接收两个参数,分别是 之前的状态preState,动作对象action
*/
// 引入type类型的常量
import {INCREMENT,DECREMENT} from "./constant"
//初始化的状态值
const initState = 0;
export default function countReducer (preState = initState,action) {
// console.log(preState,action);
//获取action对象的type及data
const {type, data} = action;
//判断类型,进行不同的操作(加减)
switch (type) {
case INCREMENT:
return preState + data;
case DECREMENT:
return preState - data;
default:
return preState;
}
}
//count组件的action文件
/*
该文件专门为Count组件生成Action对象
*/
// 引入type类型的常量
import {INCREMENT,DECREMENT} from "./constant"
export const createIncrementAction = data => ({type:INCREMENT,data})
export const createDecrementAction = data => ({type:DECREMENT,data})
//action的type类型的常量文件
/*
该模块是用于定义action对象中type类型的常量值
*/
export const INCREMENT = "increment";
export const DECREMENT = "decrement";