react-redux

1,在 react 中单纯的使用 redux,react 和 redux 代码耦合度太高,经常需要用到 store 对象,为降低 react 和 redux 的耦合度,可以使用 react-redux 这种 react 插件,

2,下载 :  npm   install  -- save  react-redux

3,入口文件中,使用 react-redux 中的Provider 组件,包装 组件,此时不需要订阅监听来重绘了,

4,react  中使用到 store的组件中,需要将该组件对象 通过 react-redux 中的 connect 方法进行包装,将 react 和 redux 联系起来,

  app.jsx

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import {add,cut} from '../../redux/actions' 

class App extends Component {
    static propTypes={
        count:PropTypes.number.isRequired,
        add:PropTypes.func.isRequired,
        cut:PropTypes.func.isRequired
    }

    add=()=>{
        const num=this.select.value*1; //select中选中的值是字符串,所以乘以1变为number类型
        //使用react-redux后不再是调用store的方法更新状态
        this.props.add(num)
    }
    cut=()=>{
        const num=this.select.value*1
        this.props.cut(num)
    }

    addIfOdd=()=>{
        const num=this.select.value*1;
        const count=this.props.count 
        if(count%2===1){ //state状态是奇数
            this.props.add(num)
        }
    }
    addAsync=()=>{
        const num=this.select.value*1;
        setTimeout(() => {
            this.props.add(num)
        },1000)
    }

    render() {
        const {count}=this.props
        return (
            <div>
                <p>点击了{count}次</p>
                <select ref={select=>this.select=select}>
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                </select> 
                <button onClick={this.add}>add +</button> 
                <button onClick={this.cut}>cut -</button> 
                <button onClick={this.addIfOdd}>addIfOdd</button> 
                <button onClick={this.addAsync}>addAsync</button> 
            </div>
        )
    }
}

export default connect(
    state=>({count:state}),
    {add,cut} //解构赋值,相当于add:add,cut:cut,前一个是redux传给app的属性名,后一个是redux中actions模块中定义的action名字
)(App)

 在组件对象中,依赖 redux 的部分集中到了 export default connect () ( App) 中,实际渲染的组件是经过 connect 后的和 redux 联系上的 Connect App 组件

 

另外,react -redux 一般将所有组件分为 UI 组件 和容器组件,使用 react-redux 中的API的一般放在容器组件一类中,不使用的一般放在 UI 组件一类中,容器组件一般放在 containers 文件夹下,UI 组件一般放在 components 文件夹下,

故我们可以将 App 组件类重新命名为 Counter ,放在 components 文件夹中,而将 Connect App 命名为 App 写入 containers 文件夹,

目录结构为:

app.jsx

import React from 'react'
import Counter from '../components/counter/counter'
import { connect } from 'react-redux'
import { add, cut } from '../redux/actions' 

export default connect(
    state => ({ count: state }),
    { add, cut } //解构赋值,相当于add:add,cut:cut,前一个是redux传给app的属性名,后一个是redux中actions模块中定义的action名字
)(Counter)

counter / counter.jsx

import React, { Component } from 'react'
import PropTypes from 'prop-types'

export default class Counter extends Component {
    static propTypes={
        count:PropTypes.number.isRequired,
        add:PropTypes.func.isRequired,
        cut:PropTypes.func.isRequired
    }

    add=()=>{
        const num=this.select.value*1; //select中选中的值是字符串,所以乘以1变为number类型
        //使用react-redux后不再是调用store的方法更新状态
        this.props.add(num)
    }
    cut=()=>{
        const num=this.select.value*1
        this.props.cut(num)
    }

    addIfOdd=()=>{
        const num=this.select.value*1;
        const count=this.props.count 
        if(count%2===1){ //state状态是奇数
            this.props.add(num)
        }
    }
    addAsync=()=>{
        const num=this.select.value*1;
        setTimeout(() => {
            this.props.add(num)
        },1000)
    }

    render() {
        const {count}=this.props
        return (
            <div>
                <p>点击了{count}次</p>
                <select ref={select=>this.select=select}>
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                </select> 
                <button onClick={this.add}>add +</button> 
                <button onClick={this.cut}>cut -</button> 
                <button onClick={this.addIfOdd}>addIfOdd</button> 
                <button onClick={this.addAsync}>addAsync</button> 
            </div>
        )
    }
}

 

posted @ 2020-04-16 17:17  shanlu  阅读(139)  评论(0编辑  收藏  举报