javascript - 设置方法调用后上下文状态不更新
问题描述
我是一个寻求学习 React Kung-Fu 技术的菜鸟。
我正在努力实现 useContext 来更新来自两个兄弟组件的一组值
MainView.js
export function MainView() {
return(
<Fragment>
<canvas id='paper-canvas' resize='true' />
<ViewProvider>
<Sketch />
<PathControls />
</ViewProvider>
<Header />
</Fragment>
);
}
ViewContext.js
export const ViewContext = createContext([{}, () => {}]);
export const ViewProvider = (props) => {
const [isPathVisibleState, setIsPathVisibleState] = useState(true);
return(
<ViewContext.Provider value={[isPathVisibleState, setIsPathVisibleState]}>
{props.children}
</ViewContext.Provider>
);
}
路径控件.js
export default function PathControls(props) {
const [isPathVisibleState, setIsPathVisibleState] = useContext(ViewContext);
function handlePathVisibleChange() {
console.log(isPathVisibleState);
setIsPathVisibleState(isPathVisibleState => !isPathVisibleState);
}
return(
<div className='path-line-controls container fixed-bottom'>
<img src={pathLineIcon} alt='Show/Hide path line' title='Show/Hide path line' onClick={handlePathVisibleChange} />
</div>
);
}
Sketch.js
export default function Sketch(props) {
const [isPathVisibleState, setIsPathVisibleState] = useContext(ViewContext);
window.onload = function() {
// Paperjs initialization settings
paper.install(window);
paper.setup('paper-canvas');
// Creates a new path line that shows the connected dots
path = new Path();
path.strokeColor = 'black';
path.visible = isPathVisibleState;
view.onMouseDown = function(event) {
addDot(event.point);
console.log("MOUSEDOWN------","PATH:", isPathVisibleState);
}
}
function addDot(point) {
//...
}
return null;
}
我的目标是让PathControls组件按钮切换值isPathVisibleState true/false,以便在Sketch组件可见属性中绘制的路径切换为 true/false
我当前的设置确实从PathControls组件切换isPathVisibleState true/false,但是当我从Sketch组件控制台该状态变量时,它始终保持在 Context 组件中设置的相同初始值。
任何帮助都感激不尽。
解决方案
似乎Sketch
不会重新呈现 altoughtisPathVisibleState
更改,请尝试使用以下命令添加副作用useEffect
:
export default function Sketch(props) {
const [isPathVisibleState, setIsPathVisibleState] = useContext(ViewContext);
useEffect(() => {
window.onload = function() {
// Paperjs initialization settings
paper.install(window);
paper.setup("paper-canvas");
// Creates a new path line that shows the connected dots
path = new Path();
path.strokeColor = "black";
};
}, []);
useEffect(() => {
path.visible = isPathVisibleState;
view.onMouseDown = function(event) {
addDot(event.point);
console.log("MOUSEDOWN------", "PATH:", isPathVisibleState);
};
}, [isPathVisibleState]);
function addDot(point) {
//...
}
return null;
}
请注意,由于您的代码是现在编写的,Sketch
因此 body 将在每次重新渲染时执行,这就是为什么我将它移到componentDidMount
第一个循环中的原因useEffect
。
如果它不起作用,您应该检查为什么Sketch
不重新渲染,添加一个沙箱总是一个很好的步骤。
推荐阅读
- java - Logback 不会在 Spring Boot 的 @ExceptionHandler 中记录 ConstraintViolationException
- jquery - 谁能建议如何缩短此代码以获得更好的性能?
- ios - 如何观察两个 rx 序列并订阅两个闭包参数?
- javascript - 过滤大量数组中的一些对象
- python - 为什么我不断收到 ValueError:解决:输入操作数 1 的核心维度 0 不匹配?
- c++ - centos中如何使用c++上传文件到ftp服务器?
- python - 有没有办法将神经网络层中的每个节点乘以特定值?(凯拉斯)
- c++ - Visual Studio 2019 map::operator[] 中的非合法优化?
- javascript - 更改字段条件的工具提示图标
- python - 从数据帧绘制的两条曲线之间的交点和返回点