javascript - 根据 React-Redux 状态的动态页面不更新渲染数据
问题描述
我想构建一个单页登录系统,根据我在 React-Redux 商店中设置的状态呈现不同的页面。当商店的状态更新时,该render() {}
功能不会更新。
App.js
import React from 'react'
import store from './redux/store'
import { Provider } from 'react-redux'
// Route to Renderer.js below
import Renderer from './Renderer'
class App extends React.Component {
render() {
return (
<Provider store={ store }>
<Renderer page={store.getState().page} />
</Provider>
)
}
}
export default App;
Renderer.js
import React, { Component } from 'react'
// Routes to my pages I plan to render
import Login from './routes/Login'
import About from './routes/About'
import Register from './routes/Register'
class Renderer extends Component {
render() {
let page = this.props.page
let returned
switch (page) {
case 'About':
returned = <About />
break
case 'Login':
returned = <Login />
break
case 'Register':
returned = <Register />
break
default:
returned = <About />
}
return returned
}
}
export default Renderer
我有一个链接到 Redux Action 的组件,它改变了page
字段的状态。为简单起见,未显示此内容。状态的变化得到确认,因为 Redux 开发工具告诉我,当我调度操作以更改page
Redux 状态时,状态发生了变化。当我更改page
字段的 Redux 状态时,呈现的页面不会更新并停留在默认页面。
解决方案
不要page
作为隐式 prop 传递给Renderer
,而是使用react-redux
connect 以便使用mapStateToProps
函数将此 prop 传递给组件:
Renderer.js
import React, { Component } from 'react'
import {connect} from 'react-redux'
// Routes to my pages I plan to render
import Login from './routes/Login'
import About from './routes/About'
import Register from './routes/Register'
class Renderer extends Component {
render() {
let page = this.props.page
let returned
switch (page) {
case 'About':
returned = <About />
break
case 'Login':
returned = <Login />
break
case 'Register':
returned = <Register />
break
default:
returned = <About />
}
return returned
}
}
const mapStateToProps = (state)=>({
page: state.page
})
export default connect(mapStateToProps)(Renderer)
App.js
import React from 'react'
import store from './redux/store'
import { Provider } from 'react-redux'
// Route to Renderer.js below
import Renderer from './Renderer'
class App extends React.Component {
render() {
return (
<Provider store={ store }>
// remove the page prop here
<Renderer />
</Provider>
)
}
}
export default App;
通过像这样传递 page prop:
page={store.getState().page}
您的Renderer
组件实际上并不订阅存储更改,因此它将始终返回初始page
值。
包装器负责对商店的react-redux
connect
订阅 - 因此您的组件将从Provider
每次商店更新时获取更新的页面值。
推荐阅读
- python - 如何并排绘制两个不同的 FacetGrid
- sql-server - 如果我尝试查询的行不存在,我可以返回 NULL 吗?
- javascript - 如何将多页数据提取到数组中?
- flutter - Flutter 将 Image.network 放入 Dart 隔离
- linux - 使用 Powercli 在脚本 PS 中运行 Bash 命令
- macos - Eclipse RCP 无法在 MAC Big Sur 中启动产品
- matlab - uiaxes中缺少轴 - matlab
- html - 为什么我不能使用 mx-auto 水平居中子元素?
- javascript - 如何等待从 useEffect 设置值?
- typescript - 提取内部通用类型的联合返回未知