javascript - React 不会在自定义挂钩中的状态更新时重新渲染所有组件
问题描述
我创建了 2 个组件C1
和C2
一个custom hook
useCounter。
C1
显示"count"
的属性useCounter hook
。
C2
显示"count"
属性并在按钮单击时增加或减少它。
Current behavior:
更改时"count"
,更新后的值仅显示在中C2
而不显示在中C1
。
Expected behavior:
两个组件都应该re-render
更新"count"
。
如果我遗漏了什么,请告诉我。
PS:
我已经使用Context API
and完成了此操作redux
。只是想知道是否可以使用custom hooks
:)来实现相同的行为
Codesandbox link:
自定义挂钩演示
import { useState } from "react";
function useCounter() {
const [count, setCount] = useState(0);
const updateCounter = newVal => {
setCount(newVal);
};
//return [count, useCallback( (newVal) => setCount(newVal))];
return [count, updateCounter];
}
export default useCounter;
解决方案
您可能希望使用 Context API 来共享同一个实例,因为自定义挂钩useCounter
将分配一个新的count
on mount 实例:
export const CounterContext = React.createContext();
function App() {
const counterController = useCounter();
return (
<CounterContext.Provider value={counterController}>
<div className="App">
<h1>App Component</h1>
<hr />
<C1 />
<hr />
<C2 />
</div>
</CounterContext.Provider>
);
}
// Use context
function C1() {
const [count] = useContext(CounterContext);
return (
<div>
Component 1 <br />
Count: {count}
</div>
);
}
此外,您可以使用如下库reusable
:
const useCounter = createStore(() => {
const [counter, setCounter] = useState(0);
return {
counter,
increment: () => setCounter(prev => prev + 1)
}
});
const Comp1 = () => {
const something = useCounter();
}
const Comp2 = () => {
const something = useCounter(); // same something
}
推荐阅读
- django - Django,从我的 QuerySet 中的连接中添加字段
- mysql - 尝试将数据从 R 写入 MySQL 时出现编码问题
- hive - PySpark - 从架构中删除非法 Hive 字符
- javascript - 获取 javascript 文件中存在的令牌
- swift - 将文档引用传递给第二个视图控制器
- amazon-s3 - S3 Select 中的聚合函数
- laravel - Braintree 和 Stripe 的 Laravel 收银员
- sql - 字段列表中的“id”列不明确 - 推荐系统
- macos - Osx Python 2.7 在此平台上不受支持
- c# - 仅在来自某些页面时才加载页面?