当前位置: 首页 > 面试题库 >

是否可以使用React中的useState()钩子在组件之间共享状态?

越望
2023-03-14
问题内容

我正在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不可共享。例如,countin
的更改HookComponent2不会导致in的更改HookComponent

使用useState()挂钩可以在组件之间共享状态吗?


问题答案:

如果您指的是组件状态,则挂钩将无法帮助您在组件之间共享它。组件状态是组件本地的。如果您的州生活在上下文中,那么useContext钩子会有所帮助。

从根本上讲,我认为您误解了“在组件之间共享有状态逻辑”这一行。有状态逻辑不同于状态。有状态逻辑是您用来修改状态的东西。例如,某个组件在中componentDidMount()订阅商店,而在中取消订阅componentWillUnmount()。可以在一个挂钩中实现这种订阅/取消订阅行为,需要这种行为的组件可以只使用该挂钩。

如果要在组件之间共享状态,可以使用多种方法,每种方法各有优点:

1.提升状态

提升状态直到两个组件的共同祖先组件。

function Ancestor() {
    const [count, setCount] = useState(999);
    return <>
      <DescendantA count={count} />
      <DescendantB count={count} />
    </>;
  }

这种状态共享方法与使用状态的传统方法从根本上没有什么不同,钩子只是为我们提供了一种声明组件状态的不同方法。

2.上下文

如果后代在组件层次结构中过于深入,并且您不想将状态传递到太多层次,则可以使用Context
API

有一个useContext你可以在子组件中利用挂机。

3.外部状态管理解决方案

状态管理库,例如Redux或Mobx。然后,您的状态将位于React外部的商店中,组件可以连接/订阅该商店以接收更新。



 类似资料:
  • 问题内容: 我正在开发使用Meteor和React作为视图引擎的应用程序 考虑下图: 从另一个示例反应隐藏组件 当触发C4按钮单击事件时,我需要更改C2组件状态。由于他们没有直接关系,因此我无法直接从C4进入C2状态。 另一个示例是从Component提交表单并获取在另一个Component中声明的数据(输入字段的值)。 我知道可以通过一些技巧来解决此问题(例如,流星会话,通过每个组件传递数据,基

  • 假设我有一个依赖于其他状态的状态(例如,当A改变时,我希望B改变)。 在useEffect钩子中创建一个观察a并设置B的钩子是否合适? 效果是否会层叠,当我单击按钮时,第一个效果会激发,导致b发生变化,导致第二个效果激发,然后再进行下一次渲染?这样构造代码有没有性能方面的缺点?

  • 我想用React useState钩子设置多个状态值,这样我就可以用useEffect钩子分别更新它们。我有以下代码: 但是当我用React DevTools检查应用程序时,我会看到钩子的多个“状态”值,而不是“订单”、“支付”、“提交”等。

  • 问题内容: 我有2个需要共享状态的React组件,react- router显示了组件A,该组件接受一些输入并将其添加到其状态,在状态成功更新后,我想重定向到组件B,用户在其中添加在我向我的api提交发布请求以保存来自组件A和B的数据之前,使用一些更多的输入并更新与组件A相同的状态以使用来自A和B的输入来构建对象。如何做到这一点,使用react- router的方式,还是我必须在组件之间设置父/子

  • 问题内容: 我在一个具有不同进程的应用程序上工作,并被要求包含那些进程以实现更多隔离。 问题在于,进程与单个“管理程序”进程共享内存以便交换数据(它们使用经典的共享缓冲区)。该解决方案是为满足性能要求而实施的,因为它在用户空间中运行,因此在用户空间和内核空间之间没有内容切换。 如果我没看错,则不可能在单个IPC名称空间内运行多个docker容器,但是我不知道单个docker容器是否可能属于不同的I

  • 问题内容: 我在同一页面上有两个不同的应用程序。 我可以通过服务(或其他方式)在这两个应用之间共享数据吗? 还是不可能? (我怀疑这是不可能通过常规的角度机构实现的)-但我认为仍然值得提出… 可以使用window变量完成此操作-但我要避免这样做。 谢谢! 问题答案: 我最终以以下方式解决了该问题: 我必须承认这一解决方案并不理想,但这是我找到的最干净的解决方案。