React 学习记录3 - react的状态管理(redux) 小白都能看得懂你进来学还是不学?

1.安装

npm install --save redux

Redux Dev Tools  // 调试工具 谷歌扩展插件 科学上网

2.创建一个store文件夹在文件夹下创建一个index.js文件

import { createStore } from 'redux'  // 引入createStore方法

const store = createStore()          // 创建数据存储仓库

export default store                 //暴露出去

3.在store文件夹下,新建一个文件reducer.js

const defaultState = {

    inputValue: '默认',

    List: [

        '数据1',

    ]

}  //默认数据

 //就是一个方法函数

export default (state = defaultState,action)=>{    

 return state

}

4. reducer引入到store中

import { createStore } from 'redux'  //  引入createStore方法

import reducer from './reducer'  

const store = createStore(reducer) // 创建数据存储仓库

export default store   //暴露出去

5.获得stroe中的数据

import store from './store/index'//引入store

constructor(props){   //初始化赋值使用

    super(props)

    this.state=store.getState();

    console.log(this.state)

}

</div>{this.state.inputValue} <div> //得到 ‘默认’

6. 修改Redux里State的值

1.创建Action;type:事件类型 value:参数

inputChange(e){

    const action ={

        type:'change_input_value',

        value:e.target.value

}

store.dispatch(action)

}

// 通过dispatch()方法传递给store

2. Reducer处理数据

export default (state = defaultState,action)=>{

if(action.type === 'changeInput'){ //判断类型

        let newState = JSON.parse(JSON.stringify(state))//深度拷贝state

        newState.inputValue = action.value

        return newState

}

if (action.type === 'changeList') {//添加数组一项

    if (state.inputValue !== '') {

         let newState = JSON.parse(JSON.stringify(state))

         newState.List.push(newState.inputValue)

         newState.inputValue = ''

         return newState

     }

}

    return state

}

3订阅更新

//回到页面订阅Redux的状态

constructor(props){

    super(props)

store.subscribe(this.storeChange) //订阅Redux的状态

}

 storeChange(){

     this.setState(store.getState())

 }

7. 优雅的管理action.type

1. src/store文件夹下面,新建立一个actionTypes.js文件

2. 提取type统一管理

const ActionsType = {

    CHANGE_INPUT: 'changeInput',  //文本框改变

    CHANGE_LIST: 'changeList', //数组改变

    DEL_LIST: 'delList', //删除数组

}
export default ActionsType

3. 页面引入actionTypes使用

import ActionsType from './store/actionTypes'

const action = {

            type: ActionsType.CHANGE_INPUT,

            value: e.target.value

        }

4.引入actionType.js文件

if (action.type === ActionsType.CHANGE_INPUT) {

       let newState = JSON.parse(JSON.stringify(state))

       newState.inputValue = action.value

       return newState

   }

   if (action.type === ActionsType.CHANGE_LIST) {

       if (state.inputValue !== '') {

           let newState = JSON.parse(JSON.stringify(state))

           newState.List.push(newState.inputValue)

           newState.inputValue = ''

           return newState

       }

   }

8.优雅的管理Action

1. 在/src/store文件夹下面,建立一个新的文件actionCreates.js

2. 提取action

import ActionsType from './actionTypes'
//输入框改变

export const changeInputAction = (value) => ({

    type: ActionsType.CHANGE_INPUT,

    value: value

})

//数组添加

export const changeListAction = () => ({

    type: ActionsType.CHANGE_LIST,

})

//数组删除

export const delListAction = (value) => ({

    type: ActionsType.DEL_LIST,

    value: value

})

3.引入actionCreates.js使用

import { changeInputAction, changeListAction, delListAction } from './store/actionCreates'

//使用changeInputAction

const action = changeInputAction(e.target.value)

store.dispatch(action)

//使用changeListAction

const action = changeListAction()

store.dispatch(action)

//使用delListAction

const action = delListAction(index)

store.dispatch(action)

9.无状态组件

// 无状态组件

const TodoListUi = (props) => {

    return (

        <div>

            <Input

                placeholder={props.inputValue}

                value={props.inputValue}

                style={{ width: '200px' }}

                onChange={props.changeInputValue}

            />

            <Button  onClick={props.chlickBtn}   >  添加 </Button>

            <div style={{ width: '200px' }}>

                <List

                    bordered

                    dataSource={props.List}

                    renderItem={(item, index) => (

                        <List.Item  onClick={() => { props.chlickBtnList(index) }}  >

                            {item}

                        </List.Item>

                    )

                    }

                />

            </div>

        </div>

    )

}

export default TodoListUi;

// 使用

 <TodoListUi

           inputValue={this.state.inputValue}

           List={this.state.List}

           changeInputValue={this.changeInputValue}

           chlickBtn={this.chlickBtn}

           chlickBtnList={this.chlickBtnList}

         />

10. Redux-thunk中间件

1.安装

npm install --save redux-thunk

2.在 store下的index.js文件里添加thunk

写法1:
import { createStore, applyMiddleware, compose } from 'redux'

import reducer from './reducer'

import thunk from 'redux-thunk'

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?

    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose//写法1

const enhancer = composeEnhancers(applyMiddleware(thunk))//写法1

const store = createStore(

        reducer,

      enhancer//写法1

);

export default store
写法2
import { createStore, applyMiddleware, compose } from 'redux'

import reducer from './reducer'

import thunk from 'redux-thunk'

// 用于chrome redux的扩展项 //写法2

const reduxExtension = window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__();

const store = createStore(

    reducer,

    compose(applyMiddleware(thunk), reduxExtension) //写法2

);
export default store

3使用 thunk

以前actionCreators.js都是定义好的action,根本没办法写业务逻辑,有了Redux-thunk之后,可以把TodoList.js中的componentDidMount业务逻辑放到这里来编写。也就是把向后台请求数据的代码放到actionCreators.js文件里。那我们需要引入axios,并写一个新的函数方法。(以前的action是对象,现在的action可以是函数了,这就是redux-thunk带来的好处)

示例:

1.actionTypes.js中 添加新类型

const ActionsType = {

    CHANGE_INPUT: 'changeInput',  //文本框改变

    CHANGE_LIST: 'changeList', //数组改变

    DEL_LIST: 'delList', //删除数组

  +  GET_LIST: 'getList',//获取数据

}

2.reducer.js中添加修改数据方法

if (action.type === ActionsType.GET_LIST) {

        let newState = JSON.parse(JSON.stringify(state))

        newState.List = action.value

        return newState

    }

3.actionCreators.js添加下面方法

//数据渲染

export const getListAction = (value) => ({

    type: ActionsType.GET_LIST,

    value: value

})

//异步数据添加

export const getToList = () => {

    return (dispatch) => { //支持传递一个dispatch

        setTimeout(function () {

            console.log('123');

            const data = ['延时2秒', 'res.data', '获取数据']

            const action = getListAction(data) //直接调用上面声明的方法

            dispatch(action);

        }, 2000); //这里2000代表两秒   

    }

} 

4.TodoList.js中的componentDidMount使用

import {changeInputAction, changeListAction, delListAction, getToList } from './store/actionCreates'

.....

componentDidMount() {

        const action = getToList()

        store.dispatch(action);

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容