【发布时间】:2020-01-09 04:44:03
【问题描述】:
我正在尝试使用 toString 将一个类临时输出到 DOM。
我有一些行为,我不明白覆盖的toString() 将始终输出初始状态。但是,如果使用外部函数(即 stateToString)甚至JSON.stringify,则更新后的状态会按我的预期输出。
以下是我尝试最小化重现这种行为的尝试。
重申一下,我的预期行为是让他们所有人最初输出:["initial"],他们会这样做。但是,当单击按钮时,toString() 输出不会更新,但其他两个会更新。
这似乎特别奇怪,因为stateToString 和State.toString 似乎本质上是相同的函数,除了一个将状态作为接收器,另一个将状态作为参数。
如果有人能解释为什么会发生这种行为,我将不胜感激。
import React, { useReducer } from 'react';
class State {
constructor(xs) { this.xs = xs }
toString = () => `[${this.xs}]`
}
const stateToString = state => `[${state.xs}]`;
const reducer = (state, action) => ({
...state,
xs: [...state.xs, action.x]
});
const App = () => {
const [state, dispatch] = useReducer(reducer, new State(["initial"]));
return (
<div>
<button onClick={() => dispatch({ x: Math.random() })}>click</button><br />
toString: {state.toString()}<br />
print: {stateToString(state)}<br />
stringify: {JSON.stringify(state)}
</div>
);
};
export default App;
【问题讨论】:
标签: javascript reactjs use-reducer