Redux,如果我想访问数据,是否必须在所有容器中导入存储?

詹姆斯·埃玛农(James emanon):

也许我并没有全神贯注于redux,但是我看到的所有示例并没有在容器之间真正访问过多状态,因此我没有看到store.getState()的大量使用,但是即使您想要调度,您需要访问商店,对不对?

因此,除了从“路径/到/商店/商店”导入导入商店

在每个我想要getState()或“ dispatch”的文件中,如何访问该状态,因为如果不包含它,则存储是未定义的。

安迪·诺尔克(Andy Noelker):

通常,您只希望使顶级容器组件能够访问商店-它们会将所有必要的数据或操作分派作为其子组件的道具传递。这是“智能”组件和“哑”组件之间的区别-“智能”组件了解Redux的存储/状态,而“哑”组件只是将道具传递给它们,而对更大的应用程序状态一无所知。

但是,即使只是将商店传递到容器组件也可能变得乏味。这就是为什么React-Redux开箱即用地提供一个组件来包装整个应用程序的原因。在文档中查看这是Provider组件,当您用它包装整个应用程序时,只需将商店一次传递给组件

import createStore from '../store';

const store = createStore()

class App extends Component {

  render() {
    return (
      <Provider store={store}>
        <MainAppContainer />
      </Provider>
    )
  }
}

正如您在此处看到的那样,我为我的商店提供了一个单独的配置文件,因为您可以做很多修改,而对于任何远程复杂的应用程序,您都会发现自己在做类似的事情,例如使用compose来应用中间件。

然后,您剩下的任何“智能”组件(通常是包装器)都需要收听商店。这是使用connect方法完成的这使您可以将状态片段映射到组件属性以及将操作作为属性进行分配。

import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
import * as actionCreators from './actionCreators';

const mapStateToProps = function(state){
  return {
    something: state.something,
  }
}

const mapDispatchToProps = function (dispatch) {
  return bindActionCreators({
    getSomething: actionCreators.getSomething,
  }, dispatch)
}

class MainAppContainer extends Component {

    componentDidMount() {
      //now has access to data like this.props.something, which is from store
      //now has access to dispatch actions like this.props.getSomething
    }

    render() {
        //will pass down store data and dispatch actions to child components
        return (
               <div>
                   <ChildComponent1 something={this.props.something} />
                   <ChildComponent2 getSomething={this.props.getSomething} />
               </div>
        )
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(MainAppContainer)

由于您总是将调度操作和数据作为属性传递给子组件,因此您只需使用引用该组件上的子组件即可this.props

在上面的示例的基础上,您将看到由于我传递this.props.somethingChildComponent1,因此它可以访问something存储中数据,但不能访问getSomething调度操作。同样,ChildComponent2只能访问getSomething调度操作,而不能访问something数据。这意味着您只能将组件完全暴露给商店所需的组件。

例如,由于ChildComponent2在as中向下传递了dispatch操作getSomething,因此onClick我可以调用this.props.getSomething,它将在不需要对store的任何访问的情况下调用dispatch操作以相同的方式,它可以继续向下传递getSomething到另一个子组件,并且该组件可以调用它和/或向下传递它,并且循环可以无限期地继续。

class ChildComponent2 extends Component {

    render() {
        return (
            <div>
                <div onClick={this.props.getSomething}>Click me</div>
                <NestedComponent getSomething={this.props.getSomething} />
            </div>
        )
    }
}

从评论中编辑

尽管这与问题不直接相关,但在评论中您似乎对动作有些困惑。我实际上并未在getSomething此处定义操作取而代之的是,在Redux应用程序中通常会将所有操作定义放在一个名为的单独文件中actionCreators.js该函数包含的函数的名称与您的操作相同,并返回具有type属性和该操作所需的任何其他方法/数据的对象例如,这是一个非常简单的示例actionCreators.js文件:

export function getSomething() {
    return {
        type: 'GET_SOMETHING',
        payload: {
            something: 'Here is some data'
        }
    }
}

减速器将监听此操作类型,以了解正在触发哪个操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果我的类实现了Serializable,那么是否必须在其子类中实现它?

Python,如果我要从文件中导入所有类/函数,“ import *”是否不好?

我是否必须在python 2.7中实现所有抽象方法?

如果必须在所有线程上保持两个基准之间的不变性,是否会强制在这些基准上进行读/写操作?

/ app1中的Python Bottle应用程序-我是否必须在所有路由前添加“ / app1”?

为什么我们必须在Angle 6中导入FormsModule

如果我想访问文件中的不同信息,是否必须多次浏览?

Xamarin表单NavigationPage.TitleView必须在所有页面上

是否可以为存储帐户中的所有容器获得单个共享访问签名?

在wso2中将BPS DB配置为5.9.0时,我必须在MySQL中导入哪些脚本?

我是否必须在axios配置中声明数据

int main()函数是否必须在所有编译器中返回一个值?

Perl在所有子类中导入一些模块

我是否必须在所有页面上调用phpini_set来设置会话到期时间?

带有Windows Azure存储的Cordova,如果对我的容器的访问是公共的,我是否仍需要身份验证?

在方法之间传递一个对象,该对象必须在所有方法中不断添加数据

我是否必须在新的HDD / SSD上设置BIOS?如果是这样,怎么办?

我必须在第一个eclipse插件中导入哪些外部jar?

我想阻止对所有http的访问

在if语句中,如果我给变量赋值,是否必须在else语句中再次做?

我有两个表,我必须在其中存储数据,但是我不能在第二个表中存储数据

您是否必须在所有文本框实际填充之前显示每个选项卡?

我是否必须在每个查询中指定分区键和所有集群键?

如何将 redux saga yield 导入我的 detox + jest 测试文件。我需要在我的测试设置中访问存储在 redux 存储中的数据

我是否必须在 powershell runbook (azure) 中导入模块?

我是否需要导入 X 库,如果它是在我正在当前文件中导入的 Y 模块中导入的?

我是否必须声明一个常量才能从抓取的文件中导入我的模块数据?

如果不需要,我是否必须在清单中使用任何前台服务类型?

如果我不需要将数据存储在 redux 存储中,是否必须使用 redux saga 从 API 获取?