如何在 React 中使用 Redux 的 Provider
How to use Redux's Provider with React
我一直在关注 ReduxJS 文档:Usage with React
文档末尾提到了 provider 对象的用法,我已经将我的 App 组件包装在 provider 中,如下所示:
import React from 'react'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import RootReducer from './app/reducers'
import App from './app/app'
const store = createStore(RootReducer)
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
但是,文档到此结束。如何在组件中取货商提供的商店?
通过组件访问商店的最佳方式是使用 connect()
函数,as described in the documentation。这允许您将状态和动作创建者映射到您的组件,并让它们在您的商店更新时自动传递。此外,默认情况下它会将 dispatch
作为 this.props.dispatch
传递。这是文档中的示例:
import { connect } from 'react-redux'
import { setVisibilityFilter } from '../actions'
import Link from '../components/Link'
const mapStateToProps = (state, ownProps) => {
return {
active: ownProps.filter === state.visibilityFilter
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onClick: () => {
dispatch(setVisibilityFilter(ownProps.filter))
}
}
}
const FilterLink = connect(
mapStateToProps,
mapDispatchToProps
)(Link)
export default FilterLink
请注意,connect
实际上会创建一个新组件来包裹您现有的组件!这种模式称为 Higher-Order Components,通常是在 React 中扩展组件功能的首选方式(优于继承或混合等)。
由于它有很多性能优化并且通常不太可能导致错误,Redux 开发人员几乎总是建议使用 connect
而不是直接访问商店 - 但是,如果你有 非常 需要较低级别访问权限的充分理由,Provider
组件使其所有子项都可以通过 this.context
:
访问商店
class MyComponent {
someMethod() {
doSomethingWith(this.context.store);
}
}
感谢您的回答,但它缺少一个关键位,实际上在文档中。
If contextTypes is not defined, then context will be an empty object.
所以我必须添加以下内容才能为我工作:
static contextTypes = {
store: PropTypes.object.isRequired
}
我一直在关注 ReduxJS 文档:Usage with React
文档末尾提到了 provider 对象的用法,我已经将我的 App 组件包装在 provider 中,如下所示:
import React from 'react'
import ReactDOM from 'react-dom'
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import RootReducer from './app/reducers'
import App from './app/app'
const store = createStore(RootReducer)
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
但是,文档到此结束。如何在组件中取货商提供的商店?
通过组件访问商店的最佳方式是使用 connect()
函数,as described in the documentation。这允许您将状态和动作创建者映射到您的组件,并让它们在您的商店更新时自动传递。此外,默认情况下它会将 dispatch
作为 this.props.dispatch
传递。这是文档中的示例:
import { connect } from 'react-redux'
import { setVisibilityFilter } from '../actions'
import Link from '../components/Link'
const mapStateToProps = (state, ownProps) => {
return {
active: ownProps.filter === state.visibilityFilter
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onClick: () => {
dispatch(setVisibilityFilter(ownProps.filter))
}
}
}
const FilterLink = connect(
mapStateToProps,
mapDispatchToProps
)(Link)
export default FilterLink
请注意,connect
实际上会创建一个新组件来包裹您现有的组件!这种模式称为 Higher-Order Components,通常是在 React 中扩展组件功能的首选方式(优于继承或混合等)。
由于它有很多性能优化并且通常不太可能导致错误,Redux 开发人员几乎总是建议使用 connect
而不是直接访问商店 - 但是,如果你有 非常 需要较低级别访问权限的充分理由,Provider
组件使其所有子项都可以通过 this.context
:
class MyComponent {
someMethod() {
doSomethingWith(this.context.store);
}
}
感谢您的回答,但它缺少一个关键位,实际上在文档中。
If contextTypes is not defined, then context will be an empty object.
所以我必须添加以下内容才能为我工作:
static contextTypes = {
store: PropTypes.object.isRequired
}