Redux学习过程

简单的加减需求

——视频学习,来源于尚硅谷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";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值