如果对redux的概念和用法掌握的已经不错了 那么现在react-redux会让你的操作更加的得心印手

忘记subscribe,记住reducer,action和dispatch即可
    React-redux提供Provider和connect两个接口来链接

这里我们还是用一个计数器来讲解

  • 第一步安装
 $  npm install react-redux --save
  • React-redux具体使用
    Provider组件在应用最外层,传入store即可,只用一次
    index.js


import React from 'react';
import ReactDom from 'react-dom';
import App from './App'
//导入reducer 和actionCreator
import {counter} from './index.redux.js'
//导入createStore 的方法从redux当中 并且从redux当中导入处理中间件的方法applyMiddleware
import { createStore,applyMiddleware,compose} from 'redux';
//这里导入处理redux的中间件专门处理redux的异步问题 因为本身redux是同步的
//导入react-redux中的provider
import { Provider } from 'react-redux'
import thunk from 'redux-thunk'
/**使用createStor(reducer)方法生成store
* 添加applyMiddleware(thunk)方法来处理thunk中间件来达到处理异步的效果
* compose是用来组合createStore当中的多个方法
*/
const store= createStore(counter,compose(
applyMiddleware(thunk),
window.devToolsExtension?window.devToolsExtension():f =>f
)) ReactDom.render(
( //这里store 只需要在Provider上传入一次即可
<Provider store={store} >
<App />
</Provider>
),
document.getElementById('root'))

Connect负责从外部获取组件需要的参数
App.js



import React from 'react';
import { connect } from 'react-redux'
import {add_A,rem_R,addAsync} from './index.redux.js'
class App extends React.Component{
constructor(props){
super()
}
render(){
return (
<div>
<h1>现在是数字几{this.props.num}</h1>
{/*使用了connect之后这里不需要在手动的dispatch了直接调用即可*/}
<button onClick={this.props.add_A}>加</button>
<button onClick={this.props.rem_R}>减</button>
{/*这里点击完成之后就会触发异步方法 在两秒之后更新*/}
<button onClick={this.props.addAsync}>等两秒再加</button>
</div>
)
}
}
//接收store赋值给组件内部的props
const mapStatetoProps = (state) =>{
return {num:state}
}
//将store当中的所有的actionCreator放入actionCreators
const actionCreators = {add_A,rem_R,addAsync}
//将App传入connect当中 将所有的函数和参数都给到App 生成一个新的App 组件内部通过this.props即可获取 传入的参数和方法
App = connect(mapStatetoProps,actionCreators)(App)
export default App

这份代码是actionCreator和reducer 主要改变的代码都在
index.reduer.js



//创建常量
const ADD_N = "加"
const REM_N = "减" //创建reducer 根据老的state和action 生成新的state
export const counter=(state=0,action)=>{
switch (action.type) {
case ADD_N:
return state+1
case REM_N:
return state-1
default:
return 10
}
} //action creator
export const add_A=()=>{
return {type:ADD_N}
}
export const rem_R=()=>{
return {type:REM_N}
}
export const addAsync=()=>{
//这里返回的是一个箭头函数 因为只有dispatch一个参数所以省略括号
return dispatch=>{
//这里的方法回两秒之后执行
setTimeout(() => {
//两秒之后执行dispatch发布add_A这个actionCreator
dispatch(add_A())
}, 2000);
}
}

如果上面的基础用法你已经学会了那么再看看下面@connect注解的方法吧

使用装饰器优化connect代码

1、弹出个性化配置(因为很多的配置被react的脚手架隐藏了起来 这一步就是了展开,这个操作是不可逆的)

 $ Npm run eject

2、安装依赖的插件

$ npm install babel-plugin-transform-decorators-legacy插件

3、完成上一步操作在Package.json里babel加上plugins配置 "plugins":["transform-decorators-legacy"]

  "babel": {
"presets": [
"react-app"
],
"plugins":["transform-decorators-legacy"]
},

上面的步骤都完成了话就可以用@connect注解的方法来优化我们的App.js啦
App.js

import React from 'react';
import { connect } from 'react-redux'
import {add_A,rem_R,addAsync} from './index.redux.js' /**没使用@conncet注解方式之前的实现
* 接收store赋值给组件内部的props
* const mapStatetoProps = (state) =>{
* return {num:state}
*}
*将store当中的所有的actionCreator放入actionCreators
*const actionCreators = {add_A,rem_R,addAsync}
*将App传入connect当中 将所有的函数和参数都给到App 生成一个新的App 组件内部通过this.props即可获取 传入的参数和方法
*App = connect(mapStatetoProps,actionCreators)(App)
*/ //使用注解的方式修改state和组件之间的传值
@connect(
//你需要state当中的什么参数 取出来就会放到props相对的参数当中
state=>({num:state}),
//你需要state当中的什么方法就可以写到下面的大括号中就能被放到props当中 并且会自动dispatch
{add_A,rem_R,addAsync}
)
class App extends React.Component{
constructor(props){
super()
}
render(){
return (
<div>
<h1>现在是数字几{this.props.num}</h1>
{/*使用了connect之后这里不需要在手动的dispatch了直接调用即可*/}
<button onClick={this.props.add_A}>加</button>
<button onClick={this.props.rem_R}>减</button>
{/*这里点击完成之后就会触发异步方法 在两秒之后更新*/}
<button onClick={this.props.addAsync}>等两秒再加</button>
</div>
)
}
} export default App
 
 

14人点赞

 
 

作者:吴佳浩
链接:https://www.jianshu.com/p/269473787332
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

十二、react-reudx之@connect 摆脱redux的繁琐操作的更多相关文章

  1. react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)

    第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性) #课程目标 理解路由的原理及应运 理解react-router-dom以及内置的一些组件 合理应用内置组 ...

  2. react第二十单元(react+react-router-dom+redux综合案例2)

    第二十单元(react+react-router-dom+redux综合案例2) #课程目标 #知识点 #授课思路 #案例和作业

  3. TNFE-Weekly[第七十二周已更新]

    前端行业发展飞速,新技术如雨后春笋般快速出现,尤其是各种小程序陆续推出,相关的信息.文章也铺天盖地的遍布在各处,我们有时候会困惑,不知道哪些信息对于自己是有价值的,那么TNFE-腾讯新闻前端团队启动了 ...

  4. 【译】值得推荐的十大React Hook 库

    十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文作者:Juraj Pavlo ...

  5. 【腾讯Bugly干货分享】腾讯验证码的十二年

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581301b146dfb1456904df8d Dev Club 是一个交流移动 ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

  7. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  8. 【Dev Club 分享】腾讯验证码的十二年

    源:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578147&idx=3&sn=94a8f8f8b4a23 ...

  9. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

随机推荐

  1. Java体系

    Java之父:詹姆斯·高斯林 java之前叫做“Oak”,后改名为Java.//Oak来源于橡树,java 来源爪哇岛的一种咖啡 Java语言平台 J2SE(Java 2 Platform Stand ...

  2. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  3. SpringCloud学习成长之十二 断路器监控

    在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard. 一.Hystrix Dashboard简 ...

  4. selenium chromedriver与chrome版本对应表

    chromedriver版本   支持的Chrome版本 v2.41               v67-69 v2.40               v66-68 v2.39             ...

  5. laravel容器类make方法解释

    容器类调用make方法时,如果没有已注册的key,那么会自动通过反射类实例化具体类 make /** * Resolve the given type from the container. * * ...

  6. iOS面试-assign与retain

    assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等.        此标记说明设置器直接进行赋值,这也是默认值.在 ...

  7. NGUI 9宫格输入的一个巨坑

    UILabel 中的maxlines = 0,输入没有问题.如果maxlines=1,输入出错

  8. 【c# 学习笔记】类与结构体的区别

    由于类与结构体在语法和使用上都非常类似,导致我们这些初学者容易混淆.为更好理解,特做以下区分记录: ① 语法上的区别在于,定义类要使用关键词class,而定义结构体则使用关键词struct. ② 结构 ...

  9. 最新 珍岛java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.珍岛等10家互联网公司的校招Offer,因为某些自身原因最终选择了珍岛.6.7月主要是做系统复习.项目复盘.LeetCode ...

  10. linux下使用Vsftpd服务传输文件

    FTP协议占用两个端口号: 21端口:命令控制,用于接收客户端执行的FTP命令. 20端口:数据传输,用于上传,下载文件数据. 过程: 首先安装vsftpd服务程序使用命令 yum install v ...