react-redux

说到底,redux和react只是一个工具而已,想要真正用好的话,理解到思想就可以了

这篇文章并不严谨,纯粹是个人的看法,写的时候也仅凭印象写的,所以参考请谨慎

react和redux

实际上react与redux没有太大的关系,怎么说都好,react只是属于mvc中的v,说到底也只是属于视图层,即便他拥有state和props等的数据流,也不代表他的主要职责就是处理数据,而相应的redux则是一种思想,实际上只需要纯js就可以轻松完成redux的流程控制

那么也就是说,react完全可以依赖于其他框架或者是balabala什么玩意的都没有问题,只是redux对于react而言是一个非常不错的数据管理方式,而且由于react-redux封装了许多有用的方法使得react对自己组件的数据流更加简便,所以还是可以推荐使用的

不过redux在某种程度上会加深react本身的复杂性,所以如果不是一些需要复杂数据流的大型应用的话,使用redux是完全没有必要的,而且就算是构建大型应用也有许多不错的框架可以使用,所以使用redux请谨慎

<script src="https://unpkg.com/redux@latest/dist/redux.min.js"></script>
...
<script>
var initialState ={
        color: 'red'
    }

    function color(state, action){
        if(typeof state === 'undefined') {
            return initialState
        }

        switch (action.type){
            case 'RED' :
                return { color: 'red' }
            case 'GREEN' :
                return { color: 'green'}
            case 'TOGGLE' :
                return state.color === 'red'?{color:'green'}:{color:'red'}
            default :
                return state
        }
    }

    var store = Redux.createStore(color)
    var colorEl = document.getElementById('colorEl')

    function renderValue() {
        colorEl.style.color = store.getState().color
    }

    renderValue()

    store.subscribe(renderValue)

    document.getElementById('red').addEventListener('click', function(){
        store.dispatch({
            type: 'RED'
        })
        console.log(store.getState())
    })
    document.getElementById('green').addEventListener('click', function(){
        store.dispatch({
            type: 'GREEN'
        })
        console.log(store.getState())
    })
    document.getElementById('toggle').addEventListener('click', function(){
        store.dispatch({
            type: 'TOGGLE'
        })
        console.log(store.getState())
    })
</script>

react-redux

虽然react和redux不是必须相互依赖的,但是两者结合起来却可以完成一些挺不错的工作,redux讲究的是通过用户操作然后redux就调用(dispatch)action,而reducer则通过接收到的action和旧的state返回一个新的state,这当中的一系列的操作都是由顶层的store管理的,这store有着不少state,而这react-redux之所以可以走在一起,和这个机制也有着很大关联

如果说每个组件就是一个state,然后只需要一个store来管理就可以了,哪个组件需要哪个state的话,那就直接让它来store拿就好了,相应的,如果哪个组件需要改变state状态的话,那就让它去dispatch便好了
而react-redux这个库,便是封装了这些方法,让我们可以很简单的利用这些api来管理我们的项目

在这里,redux实际上是做了一个数据流管理,从用户操作dispatch action,reducer接受到action以后就更新当前状态,这时候应用中所有state都会得到更新,换句话说,redux解决了数据流向和更新问题

所有的state都来源于store,如果想要更新自己的从store中获取的state的话就必须经过action,至于组件自身的state则是来自组件自身或者是用户输入的,所以这里的state也可以通过aciton传递给store再由store来传递回自己或是传递给其他组件

简单的流程
store=>component state&this.props state =>store

怎么让react和redux联系起来?

很简单,最重要的函数有三个

  • mapStateToProps,这个是让组件从store获取state的函数
function mapStateToProps(state) { 
    return {  
        user: state.user /*从store中拿来todo这个对象*/
    }
}
  • mapDispatchToProps,这个是让组件拿到action的函数
function mapDispatchToProps(dispatch){
    return bindActionCreators({
        handleSign: addUserAction
    }, dispatch)
}
  • 最后一个则是将这两个函数跟组件一起送到redux流程中的函数,connect
let Register = connect(
    mapStateToProps,
    mapDispatchToProps
)(rootRegister)

那么store从哪里来?又该怎么管理?

这里也很简单,react-redux提供了很好的方法让我们管理这个Store,只需要两步轻松完成

  1. 创建store
  2. 用react-redux提供的Provider标签把你的app包起来
var initState = { /*先初始化state*/
    user: {
        list: []
    }
}

const logger = createLogger()/*由redux-logger提供的一个日志管理中间件*/
const createStoreWithMiddleware = applyMiddleware(/*这里是通过中间件创建store*/
    thunk,
    logger
)(createStore)/*这里的createStore是由redux提供的一个方法,用来创建store*/
/*需要注意的是applyMiddleware是由redux提供的一个中间件,这里面包含许多有趣的知识,有兴趣的可以去查阅下资料*/

let store = createStoreWithMiddleware(reducer, initState)/*传入我们的reducer和初始state就可以了*/

对了,上边还有一点,react组件要怎么使用来自redux的state,又该怎么交回给redux?

这里是一个react组件的代码,伴有注释,应该很容易理解

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import { addUserAction } from '../actions/action.js'

class rootRegister extends Component {
    constructor(props) {
        super(props)
        var defaultState = {
            user: {
                username: "",
                password: "",
                passwordagain: ""
            }
        }
        this.state = defaultState /*每个组件都该有自己的state,要么是从mapStateToProps上边拿到,要么就是自己初始化*/
    }

    componentWillMount(){

    }

    onTextChange(key) { /*监听组件并且反馈回state*/
        return e => {
            var user = this.state.user
            user[key] = e.target.value 
            this.setState({ user })
            //console.log(user)
        }
    }

    handleClick(user) {
        console.log(user)
        const { handleSign } = this.props /*这里就是由mapDispatchToProps中提供的action方法*/
        if(user.password!=user.passwordagain){
            console.log('not same password')
            return false
        }else{
            handleSign(user)
        }
    }
    render(){
        var user = this.state.user
        return (
            <div>
                <p>Register T_T</p>
                <input value={user.username} type="text" onChange={this.onTextChange('username').bind(this)} placeholder="Username" /><br/> 
                <input value={user.password} type="password" onChange={this.onTextChange('password').bind(this)} placeholder="password" /><br/>
                <input value={user.passwordagain} type="password" onChange={this.onTextChange('passwordagain').bind(this)} placeholder="passwordagain" /><br/>
                <span onClick={this.handleClick.bind(this, user)}>signin</span>
            </div>
        )
    }
}

function mapStateToProps(state) {
    return {}
}

function mapDispatchToProps(dispatch){
    return bindActionCreators({
        handleSign: addUserAction
    }, dispatch)
}

let Register = connect(
    mapStateToProps,
    mapDispatchToProps
)(rootRegister)

export default Register

至此,react和redux便是真正的联系起来了

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

推荐阅读更多精彩内容