也许我并没有把注意力集中在redux上,但是我所看到的所有示例都没有太多地访问容器之间的状态,所以我没有看到store.getState()的太多用法,但是即使您想要分派,您也需要访问存储,对吗?
通常,您只想让顶级容器组件能够访问存储--它们将把任何必要的数据或动作分派作为道具传递给它们的子组件。这就是“智能”组件和“哑”组件之间的区别--“智能”组件知道Redux存储/状态,而“哑”组件只是获得传递给它们的道具,而不知道更大的应用程序状态。
然而,即使只是将存储区传递给容器组件也会变得乏味。这就是为什么React-Redux提供了一个包装整个应用程序的开箱即用组件。在文件里查一下。这是provider
组件,当您用它包装整个应用程序时,只需将存储区传递给组件一次:
import createStore from '../store';
const store = createStore()
class App extends Component {
render() {
return (
<Provider store={store}>
<MainAppContainer />
</Provider>
)
}
}
正如您在这里看到的,我有一个单独的配置文件,只是为了我的商店,因为有很多修改可以做,对于任何远程复杂的应用程序,您会发现自己在使用compose应用中间件等方面也做了同样的事情。
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.something
传递给childcomponent1
,因此它可以访问存储中的something
数据,但不能访问getsomething
分派操作。同样,ChildComponent2
只能访问GetSomething
分派操作,而不能访问Something
数据。这意味着您只将组件公开给它们从存储区中所需的组件。
例如,因为childcomponent2
将分派操作传递为getsomething
,所以在我的onclick
中,我可以调用this.props.getsomething
,它将调用分派操作,而不需要对存储区进行任何访问。以同样的方式,它可以继续向下传递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'
}
}
}
此操作类型是您的减速机将侦听的,以知道哪个操作正在被激发。
问题内容: 也许我并没有全神贯注于redux,但是我所看到的所有示例并没有在容器之间真正访问过多的状态,因此我并没有看到store.getState()的大量使用,但是即使您想要派遣,您需要进入商店,对不对? 因此,除了从“路径/到/商店/商店”导入导入商店 在每个我想要getState()或“ dispatch”的文件中,我如何访问该状态,因为如果不包含它,则存储是未定义的。 问题答案: 通常,
@覆盖受保护的无效成功身份验证(HttpServletRequest请求、HttpServlet响应、FilterChain链、身份验证身份验证)抛出IOException、ServletException{ //响应。setHeader(“accessToken”,accessToken);//回答setHeader(“refreshToken”,refreshToken); 成功身份验证正在创
我在一个在线订餐应用程序中使用Redux和React。 当用户从购物篮中删除一个商品时,我需要向服务器发出一个XHR请求,以计算购物篮的新总价。当这个XHR完成时,我更新redux存储并呈现新的价格。我使用Redux thunk来管理这个异步操作。 有一个问题是,用户连续快速地从购物篮中取出两件物品。用户删除第一项,我启动XHR以获得新价格。然后,用户单击一个按钮以删除第二个项目,并启动第二个XH
我正在使用React SPA、Express、Express-session、Passport和JWT。我对存储令牌的一些不同的客户端存储选项感到困惑:cookie、Session和JWT/passport。 是否必须将令牌存储在cookie中,即使我可以将它们存储在中? 我真的可以通过使用sessionID(没有cookie或localstorage)来存储与会话相关的所有内容吗? 只有做一次f
问题内容: 该赛普拉斯文档说可以 公开数据存储区(例如Redux中的数据存储区),以便您可以通过编程方式直接从测试代码中更改应用程序的状态。 我还观看了Kent C. Dodds先生的测试课程,他提到可以使用Cypress中的现有数据来初始化redux存储(在测试之前或之中,不确定) 我浏览了几乎所有的文档并进行了谷歌搜索,除了在介绍页面上将其作为关键区别之一外,我只是找不到任何实际执行此操作的参
问题内容: 我只是做一个简单的应用程序来学习与redux异步。我已经使所有工作正常进行,现在我只想在网页上显示实际状态。现在,我实际上如何在render方法中访问商店的状态? 这是我的代码(所有内容都在一页中,因为我只是在学习): 因此,在状态的render方法中,我想列出商店中的所有内容。 谢谢 问题答案: 您应该创建单独的组件,该组件将侦听状态更改并在每次状态更改时进行更新:
我只是做了一个简单的应用程序学习异步与Redux。我已经使所有的工作,现在我只想显示的实际状态到网页上。现在,我如何在render方法中实际访问存储的状态? 这里是我的代码(所有内容都在一个页面中,因为我只是在学习): 谢谢
我有一个依赖于redux存储的组件。我的redux商店看起来像这样 所以基本上,当我刷新页面时,存储区消失了,需要一些时间来获取数据并将其设置为存储区,如上所述 我有一个组件,它需要company_id来获取有关该公司的数据 使用react-redux我得到了company_id 此组件,componentDidMount在存储区接收公司id数据之前被激发。所以我想要的是在这个组件从redux商店