在Redux中,我可以使用

store.subscribe(() => my handler goes here)

但是,如果我的store 里满是不同的对象,而在我应用程序的某个特定位置,我只想订阅store 中某个特定对象所做的更改,该怎么办?

推荐答案

当直接使用subscribe时,无法订阅部分应用store ,但正如Redux的创建者自己所说的那样——don't use subscribe directly!为了让Redux应用程序的数据流真正起作用,你需要一个组件来包装整个应用程序.此组件将订阅您的应用store .其余的组件将是这个包装器组件的子组件,并且只获得它们需要的部分状态.

如果你在React中使用Redux,那么有一个好消息——官方的react-redux包会帮你解决这个问题!它提供了名为<Provider />的包装器组件.然后,您将拥有至少一个"智能组件",用于侦听Provider从store 传递的状态更改.您可以指定它应该监听的状态部分,这些状态部分将作为props 传递给该组件(当然,它可以将它们传递给自己的子组件).您可以通过在"智能"组件上使用connect()函数并将mapStateToProps函数用作第一个参数来指定.总结一下:

Provider个订阅以存储更改的组件包装根组件

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)

现在,任何<App />岁的子元素如果用connect()包裹,都将成为"智能"组件.你可以通过mapStateToProps来 Select 该州的某些部分,并将其作为props .

const mapStateToProps = (state) => {
    return {
        somethingFromStore: state.somethingFromStore
    }
}

class ChildOfApp extends Component {
    render() {
        return <div>{this.props.somethingFromStore}</div>
    }
}

//wrap App in connect and pass in mapStateToProps
export default connect(mapStateToProps)(ChildOfApp)

显然,<App />可以有很多子元素,你可以 Select mapStateToProps应该 for each 子元素听哪个州的音乐.我建议阅读usage with React页上的文档,以便更好地理解这个流程.

React-native相关问答推荐

复制__自持props

React Native在同一页面上使用多个不同的导航器

无法解析 com.google.gms:google-services:4.3.15

为什么将字符串写入文件然后将相同的文件作为字符串读取会导致不同的字符串?

我应该什么时候调用 realm.close()?

如何判断 Detox 正在运行测试?

变量 window在react-native 中代表什么?

React Native TextInput 没有获得焦点

使用 react-native 设置 Select 器的高度

如何清除react-native webview cookie?

在使用 redux-persist 重新水化存储之前加载初始状态的默认值

Xcode 12 问题:Build input file cannot be found

我可以在 react-native 中使用 reactJS 库吗?

React Navigation TabNavigator:在选项卡更改时重置上一个选项卡

如何在 React Native 中获取电话号码?

React Native STUCK 启动打包器

如何在 Expo 和 React Native 中使用绝对路径导入?

无法识别的 WebSocket 连接选项 `agent`、`perMessageDeflate`、`pfx`、`key`、`passphrase`... 你的意思是把这些放在 `headers` 下吗?

React Native如何将this.setState更改传递给父级

移动应用程序不需要 CORS?