我正在尝试React中的新Hook功能。考虑到我有以下两个组件(使用React Hooks)-
const HookComponent = () => {
const [username, setUsername] = useState('Abrar');
const [count, setState] = useState();
const handleChange = (e) => {
setUsername(e.target.value);
}
return (
<div>
<input name="userName" value={username} onChange={handleChange}/>
<p>{username}</p>
<p>From HookComponent: {count}</p>
</div>
)
}
const HookComponent2 = () => {
const [count, setCount] = useState(999);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
Hooks声称解决了组件之间共享有状态逻辑的问题,但我发现HookComponent
和HookComponent2
之间的状态是不可共享的。例如,HookComponent2
中的count
的变化不会导致HookComponent
的变化。
是否可以使用useState()
钩子在组件之间共享状态?
9条答案
按热度按时间thigvfpy1#
如果您引用的是组件状态,那么钩子将不会帮助您在组件之间共享它。组件状态是组件的本地状态。如果你的状态存在于上下文中,那么
useContext
钩子会很有帮助。从根本上说,我认为你误解了“在组件之间共享有状态逻辑”这句话。状态逻辑不同于状态。状态逻辑是你修改状态的东西。例如,一个组件订阅
componentDidMount()
中的一个存储并取消订阅componentWillUnmount()
。这种订阅/取消订阅行为可以在钩子中实现,需要这种行为的组件可以只使用钩子。如果你想在组件之间共享状态,有多种方法可以做到这一点,每种方法都有自己的优点:
1.提升状态
将状态提升到两个组件的共同祖先组件。
这种状态共享方法与传统的使用状态的方法没有根本的不同,钩子只是给予了我们一种不同的方法来声明组件状态。
2.上下文
如果子体在组件层次结构中太深,并且您不想将状态传递到太多层,则可以使用API。
有一个
useContext
钩子,您可以在子组件中利用它。3.外部状态管理方案
状态管理库,如Redux或Mobx。然后,你的状态将存在于React之外的商店中,组件可以连接/订阅商店以接收更新。
q8l4jmvw2#
不需要任何外部状态管理库也是可能的。只需使用一个简单的observable实现:
然后创建一个store,并通过在
useEffect
中使用subscribe
将其挂钩以进行React:这应该行得通。无需
React.Context
或提升状态wgmfuz8q3#
这可以使用
useBetween
钩子实现。See in codesandbox
我们将React hooks有状态逻辑从
HookComponent
迁移到useShareableState
。我们在每个组件中使用useBetween
调用useShareableState
。useBetween
是一种调用任何钩子的方法。但是这样状态就不会存储在React组件中。对于同一个钩子,调用的结果将是相同的。因此,我们可以在不同的组件中调用一个钩子,并在一个状态下一起工作。当更新共享状态时,使用它的每个组件也将被更新。use-between
软件包的作者。*y1aodyip4#
doc声明:
我们从React中导入useState Hook。它允许我们在函数组件中保持局部状态。
没有提到状态可以在组件之间共享,
useState
钩子只是给予你一个更快的方法来声明一个状态字段和它对应的setter在一条指令中。c0vxltue5#
我创建了一个hooksy,它允许你这样做-https://github.com/pie6k/hooksy
之后在任何组件中
hm2xizp96#
用钩子是不可能的。我建议你看看react-easy-state。https://github.com/solkimicreb/react-easy-state
我在大型应用程序中使用它,它的工作原理就像一个魅力。
r1wp621o7#
我要下地狱了:
详细解释请访问:https://stackoverflow.com/a/72917627/1246547
是的,这是我能想到的解决特定用例的最肮脏和最简洁的方法。是的,对于一个干净的方式,你可能想学习如何
useContext
,或者看看react-easy-state或useBetween的低占用解决方案,和flux或redux的真实的的解决方案。atmip9wb8#
您仍然需要将状态提升到HookComponent1和HookComponent2的祖先组件。这就是你以前共享状态的方式,最新的钩子API并没有改变它。
scyqe7ek9#
这真的很酷,但我遇到了一个问题,我希望@streletss可能能够帮助解决。下面是一个例子的问题。
用户没有使用foo更新。然后在setLastName中设置存储,并将其设置回user。你知道为什么吗?