我正在尝试使用 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;