【发布时间】:2019-10-27 10:17:16
【问题描述】:
当我在我的 Gatsby 项目中实现 Redux 时,我看到当组件的状态发生变化时我的组件不会重新渲染(是的,我将状态视为不可变的)。
所以我使用了 Redux 的 Conuter example,并将其代码复制到我的 Gatsby 项目中。 并且问题再次发生,当状态更改时组件无法重新渲染(使用 Redux 的示例之一!)。
只有使用this.forceUpdate(),我才能让组件在状态更改时重新渲染,当我删除此行时,它停止在状态更改时重新渲染。
这是我创建的 Gatsby 页面和我复制到的 Redux 代码:
import React, { Component } from 'react'
import { createStore } from 'redux'
class Counter extends Component {
constructor(props) {
super(props);
}
render() {
console.log("render - start",JSON.stringify(store.getState(),null,2))
const { value, onIncrement, onDecrement } = this.props
return (
<p>
Clicked: {value} times
{' '}
<button onClick={onIncrement}>
+
</button>
{' '}
<button onClick={onDecrement}>
-
</button>
</p>
)
}
}
const counter = (state = 0, action) => {
console.log("reducer - start: ",state, JSON.stringify(action,null,2))
switch (action.type) {
case 'INCREMENT':
return state + 1
case 'DECREMENT':
return state - 1
default:
return state
}
}
const store = createStore(counter)
class TestPage extends React.Component {
render(){
return (
<Counter
value={store.getState()}
onIncrement={() => {
store.dispatch({ type: 'INCREMENT' })
// this.forceUpdate()
}}
onDecrement={() => store.dispatch({ type: 'DECREMENT' })}
/>)
}
}
export default TestPage
【问题讨论】:
-
我也试过 store.subscribe(),但结果更奇怪(只调用了 TestPage 的 render 方法,而不是它的子 Counter 组件的 render 方法)。 constructor(p) { super(p) this.counter = (state = 0, action) => { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 default:返回状态 } } this.store = createStore(this.counter) this.store.subscribe(this.render.bind(this)) }
-
我已验证调用了 TestPage 的渲染方法,而不是其子 Counter 组件的渲染方法 - 通过将 console.log() 调用作为它们的第一行插入。在页面加载时 - 两者都被调用,但是如上所述,当状态改变时,只有父级报告记录......
标签: javascript reactjs redux state gatsby