【问题标题】:How can we share a state variables between two React components on the same page?我们如何在同一页面上的两个 React 组件之间共享状态变量?
【发布时间】:2020-09-22 05:13:28
【问题描述】:

我在 App.js 中有两个组件。主要的App 组件(包含一个基本表单)和一个自定义的TextInput 组件。我理解理想情况下,最好有单独的文件。不过,我会尽量保持简短和简单。

无论如何,我在第一个组件中用const [success, setSuccess] = useState(false); 声明了一个状态变量,并希望在第二个组件中使用它。我尝试在两个组件之外声明变量以启用共享,但这不起作用。我该怎么做呢?我的意思是通常情况下,我只会导出和导入,但在这里,两个组件都在同一页面上。

【问题讨论】:

  • 在 App.js 中定义 state 并通过 props 在组件之间共享
  • 它需要在同时使用它们的父组件中,换句话说,状态需要在树中更高。
  • @HareshMakwana 我将在互联网上搜索,但你有什么简短而有趣的例子吗?特别是对于同一页面上的组件?
  • 请注意,如果这个解决方案对于共享单个状态更简单,对于跨多个组件共享多个状态,最好使用存储模式。请参阅reduxmobx,或简单地响应上下文共享:en.reactjs.org/docs/hooks-reference.html#usecontext
  • @StéphaneVeyret 啊,好吧。我会调查的,谢谢。

标签: reactjs jsx react-component


【解决方案1】:

在这种情况下,如果您为文本输入指定了一个帕斯卡大小写命名,例如 function TextInput(){...} ,那么即使在同一个文件中定义,react 也会将其视为一个单独的组件。这就是为什么App组件的状态变量不在TextInput范围内的原因

您可以通过以下任一方法来缓解这种情况,

  • 使文本输入成为返回 JSX 的普通函数
function textInput(){
 // the state variable 'success' and 'setSuccess' will be normally accessible here
 return(
   <div>
      <input type="text" />
   <div>
 )
}

//return for the 'App' component

return(
   <>
     {textInput()}
   </>
)

  • 将状态作为props 传递给TextInput 组件

    如果您遵循这种方法,那么您也可以将 TextInput 组件放在单独的文件中

//parent 'App' component

function App(){
  const [success, setSuccess] = useState(false);

  return(
    <>
       <TextInput success={success} setSuccess={setSuccess}></TextInput>
    </>
  )
}

function TextInput(props){
   const {success, setSuccess} = props;
   
   // In here you can refer success and setSuccess normally as you would even if this is in a separate file
}

【讨论】:

  • 哇。非常感谢您的详细说明。但是,除了使用 props 之外……难道没有更简单的方法可以在同一页面上的组件之间进行共享吗?
  • 因为在我的情况下,我没有TextInput 的一个实例,而是App 中的许多TextInput 实例...所以,我是否必须对每个实例都“重新发送”成功文本输入?这似乎是一件多余的事情,因为变量success 衡量的不是单个实例的成功,而是所有实例的组合成功。通过每个 TextInput 实例发送相同的值似乎很奇怪!
  • 我没有清楚地了解你的设置,所以如果你能分享你的实际代码可能会有所帮助。如果有多个组件,那么我相信共享状态的唯一方法是将其绑定到props。如果它是您正在构建的动态且复杂的应用程序,那么您还可以查看 react context api 或 redux 以获得一个全局且统一的状态树,该状态树可以在所有组件之间共享,无论层次结构如何
【解决方案2】:

要共享状态,您需要在父组件(在您的情况下为 App)中声明状态并将其发送到子组件(TextInput)

例如

function App() {
  const [success, setSuccess] = useState(false);

  ...

  return (
    <TextInput success={success} setSuccess={setSuccess} />
  );
}
function TextInput({success, setSuccess}) {
  // use success/setSuccess from props
}

【讨论】:

  • 感谢您花时间回答这个问题。
【解决方案3】:

您必须从父(应用程序组件)传递道具,例如:

function App() {
  const [success, setSuccess] = useState(false);

  return (
    <TextInput success={success}  />
  );
}

并在 TextInput 组件中访问它

function TextInput(props) {
//Access it using props.success
}

【讨论】:

  • 感谢您花时间回答这个问题。谢谢。
【解决方案4】:

不知道是不是我理解错了,但是……

//App.js

function App() {
  const [success, setSuccess] = useState(false);

  return (
    <TextInput success={success}  />
    <FormComponent success={success} /> 
  );
}

【讨论】:

  • 然后我假设你的意思是让我从TextInputFormComponent 中使用props... 正确?
  • 本地状态只能传递给其范围内的另一个组件...如果您想要访问此状态的组件不在其范围内,而是这些组件之一的子组件 - 那么是的。你必须把它作为道具传递给那个孩子。或者,您可以将全局范围与 Context API 或类似 redux 的东西一起使用。这就是它的工作方式
猜你喜欢
  • 2022-10-12
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多