javascript - Redux 消费者没有将更新的 props 传递给 React 组件
问题描述
redux@6.0.0
我正在努力将 redux 添加到服务器端呈现的 React 应用程序中。该应用程序的架构是一个黑匣子,但我已经按照文档中的这个示例成功设置了 redux。
我可以从 redux 存储中读取数据并将其呈现在屏幕上。我可以调度更新商店的操作。这些变化会逐渐渗透到Context.Consumer
(并且可以在 React DevTools 中验证),但会止步于此。尽管进行了更改,但在初始挂载后,该值永远不会传递给组件。
我在这里读到“99.9% 的时间”这是由于 mutating state 造成的。所以我添加了另一个带有样板值和操作的商店来更新它:
const ACTIONS = {
SET_RANDOM_TEST_VALUE: 'SET_RANDOM_TEST_VALUE',
}
const initialState = {
testValue: 'intial test value', // I now see this typo, but the screenshots are final ♂️
}
export const setRandomTestValue = () => ({
type: ACTIONS.SET_RANDOM_TEST_VALUE,
})
export const reducer = (state = initialState, action) => {
switch (action.type) {
case ACTIONS.SET_RANDOM_TEST_VALUE: {
return {
...state,
testValue: String(Math.random()).slice(-5),
}
}
default: {
return state
}
}
}
我的测试减速器被添加到rootReducer
:
import { reducer as testReducer } from './TestStore.redux'
const rootReducer = combineReducers({
// ...
__test__: testReducer,
})
然后将值映射到组件:
/* Import assets */
const Test = props => {
console.count('Render count')
return (
<div>
<button onClick={props.setRandomTestValue}>Update value</button>
<code>{props.testValue}</code>
</div>
)
}
export default connect(
state => ({ testValue: state.__test__.testValue }),
{ setRandomTestValue }
)(Test)
有了这个设置,一切似乎都正常。控制台日志Render count: 1
,组件显示initial test value
——一切如预期:
当您单击按钮时,操作会触发并且存储会更新(如 redux 记录器中所示):
但是,不会再次调用该组件,并且内容不会更改:
在 React DevTools 中跟踪它,你可以看到Context.Consumer
确实有更新的值(随机数字字符串):
^^^ 不同的价值,因为截图很难。
因此,价值使消费者受益,但仅此而已。当你检查Test
组件的 props 时,它仍然具有初始值:
:sad-trombone:
tl;博士
在这个项目的某个地方,redux store 消费者和期望更新 props 的组件之间存在故障。组件可以从存储中读取初始值,但无法接收更新。
由于这个项目的复杂性,我本身并不是在寻找答案。我只需要知道看什么方向。任何提示将不胜感激。
解决方案
推荐阅读
- php - 如何从值列表中获取具有最高值的行
- webpack - 升级 dotenv-webpack 失败
- ibm-cloud - 在 IBM Cloud Object Storage 中编辑对象数据或在读取数据时跳过前几行
- python - 无法使用正则表达式、漂亮的汤和 python 在列表中抓取和排列卡片的详细信息
- snowflake-cloud-data-platform - 雪花中的#有什么用
- postgresql - 使用 Hibernate 对 PostgreSQL 数据库中的 JSON 对象进行版本控制
- python - 如何读取 csv 文件并更改所需文件夹的目录
- server - 赛普拉斯断言在 OpenShift pod 上失败,但在本地机器上传递
- javascript - 在 Highcharts 更新到 9 后,在图像工作中使用“:data”引用制作 SVG
- mysql - nvarchar 长度从一个表更新到另一个表