学习使用react-redux

有redux了,问什么还要用react-redux

因为reactredux再结合使用时,总是有点问题,所以react-redux就是为了避免出现问题而产生的

使用react-redux的connect

  1. 安装
npm i react-redux
  1. 创建仓库
// src-->store-->index.js
import {createStore,combineReducers} from 'redux';
import data from './reducer';
export default createStore(combineReducers({data}));

// src-->store-->reducer.js
function ding(state={
    name:"QQ",
    age:21
},action){
    // eslint-disable-next-line
    switch(action.type){
        case 'edit_name':
            return {
                ...state,
                name:action.name
            };
    }
    return state;
}

export default ding;
  1. 和视图产生关联
//src-->index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app';
import {Provider} from 'react-redux'
import store from './store';

  ReactDOM.render(
    <Provider store={store}>
      <App />
    </Provider>,
    document.getElementById('root')
  );
  1. 使用connect
import React,{Fragment} from 'react';
import { connect } from 'react-redux';

function Inner(props){

    let {name,age,dispatch} = props

    return (<Fragment>
        <p>name:{name}</p>
        <p>age:{age}</p>
        <button onClick={()=>{
            dispatch({
                type:"edit_name",
                name:"超级QQ"
            })
        }}>超级进化</button>
    </Fragment>)
}
export default connect((state,props)=>{
    return state.data;
})(Inner)

浏览器反馈
在这里插入图片描述
在这里插入图片描述

使用react-redux的hooks

// src->inner.js
import React,{Fragment} from 'react';
import { connect } from 'react-redux';

function Inner(props){
    console.log(props);

    let {name,age,dispatch} = props

    return (<Fragment>
        <p>name:{name}</p>
        <p>age:{age}</p>
        <button onClick={()=>{
            dispatch({
                type:"edit_name",
                name:"超级QQ"
            })
        }}>超级进化</button>
    </Fragment>)
}
export default Inner

将刚才使用connect的代码改为正常的导出
然后我们需要知道hooks的三个属性

  • useSelector(回调函数):通过回调函数的返回值,来获取state
  • useStore():直接获取整个仓库
  • useDispatch:获取仓库中的dispatch()方法

我们在这里实现刚才的功能是就变得简单了许多

import React, { Fragment } from 'react';
import { useSelector, useStore, useDispatch } from 'react-redux'

function Inner() {

    let {name,age} = useSelector((state)=>{
        return state.data
    });

    let dispatch = useDispatch();

    return (<Fragment>
        <p>name: {name} </p>
        <p>age: {age} </p>
        <button onClick={()=>{
            dispatch({
                type:"inner_name",
                name:"暴龙兽"
            })
        }}>进化</button>
    </Fragment>)
}

export default Inner;

浏览器反馈
在这里插入图片描述
在这里插入图片描述

使用中间件thunk

为什么要使用中间件

因为我们的dispatch是同步方法,会立即执行,我们想使用异步方法时,我们就需要函数,但是dispatch内部是不接受函数的,所以这个时候我们就需要使用thunk来让dispatch来可以接受函数了

如何使用

  1. 安装
npm i redux-thunk
  1. 通过redux结构出来applyMiddleware,并且引入redux-thunk
import {createStore,combineReducers,applyMiddleware} from 'redux';
import thunk from 'redux-thunk';
  1. 通过applyMiddlewareredux-thunk传递进来
    因为我们不可以直接使用redux-thunk我们需要先引入一个方法,然后通过参数的形式引入到这个方法内
export default createStore(combineReducers({data}),applyMiddleware(thunk));
  1. 现在我们就可以在dispatch内部使用函数了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值