为什么mapStateToProps仅以这种奇怪的方式更新? (这能做些什么?)

时间:2018-08-19 05:10:48

标签: javascript reactjs react-native redux react-native-android

将redux与react-native结合使用时,发现只有将另一个正在运行的手机应用程序窗口切换到第一个时,mapStateToProps才会更新。

例如,下面的测试代码符合以下步骤:

    显示
  1. 默认 开始 测试文本。
  2. 发送文本操作 按钮

产生:

    显示
  1. 已更新的 已更改 文本,而不显示 开始

相反,有:

  1. 需要切换到另一个正在运行的应用程序窗口(例如:时钟应用程序),然后再切换回开发应用程序。
  2. 显示
  3. 已更新的 已更改 文本,而不显示 开始

除非我们首先在应用程序窗口之间来回切换,否则mapStateToProps函数不会更新组件。

有什么想法吗?


测试代码

减速器

import { combineReducers } from 'redux';


const test = (state = 'Start', action) => {
    switch(action.type){
        case 'ADD':
            return('Changed')
        default:
            return state
    }
}

export default combineReducers({
    test
})

测试操作+容器

import { connect } from 'react-redux'
import TestComp from '../components/TestComp'


const mapStateToProps = (state) => ({
    test: state.test
})

const mapDispatchToProps = (dispatch) => ({
     testDispatch: () => dispatch({type: 'ADD'})
})

export default connect(
   mapStateToProps,
   mapDispatchToProps
)(TestComp)

组件

import React, { Component } from 'react'


class TestComp extends Component{
    constructor(props){
        super(props)

        this.test = props.test
        this.testDispatch = props.testDispatch
    }

    render(){
        return(
            <View>
                <Text>
                     {this.test}
                </Text>

                <Button
                   title='Dispatch Test Action'
                   onPress={() => this.testDispatch()}
                />
            </View>

        )
    }
}


export default TestComp

1 个答案:

答案 0 :(得分:2)

问题是您正在构造器中捕获props.test的值。在对象的生命周期中永远不会再更新this.test,这就是为什么看不到更新的原因。

相反,您应该删除this.test组件内的TestComp并改用this.props.test